纳金网
标题:
选择游戏物体
[打印本页]
作者:
晃晃
时间:
2011-9-23 14:23
标题:
选择游戏物体
using UnityEngine;
using System.Collections;
//鼠标拾取
public class MouseSelect : MonoBehaviour {
public Material mat;//矩形框的材质
public GameObject obj;//目标
public Vector3 temp;//存放目标物体转到屏幕坐标
public Vector3 obj_pos;//目标物体要到达的位置
public Rect r;//虚拟矩形
public Vector3 startVertex;//鼠标所绘矩形框的左上顶点坐标
public Vector3 mousePos;//鼠标位置坐标
public Vector3 mouse_start;//按下鼠标左键时鼠标的位置
private bool flag = false;//是否绘制
private Vector3 velocity = Vector3.zero;//平滑阻尼速度
void Start()
{
obj_pos = new Vector3(0,0,0);
}
void Update() {
mousePos = Input.mousePosition;//获取鼠标位置坐标
if (Input.GetMouseButtonDown(0))//按下鼠标左键
{
flag =true;//开启绘制
mouse_start = mousePos;
if(obj.renderer.material.color == Color.green )
obj_pos = mouse_start;
startVertex = new Vector3(mousePos.x / Screen.width, mousePos.y / Screen.height, 0);
}
if(Input.GetMouseButtonUp(0))//抬起鼠标左键
{
flag =false;//关闭绘制
r= new Rect(mouse_start.x , mousePos.y , mouse_start.y - mousePos.y, mousePos.x - mouse_start.x);//根据鼠标所绘矩形构造虚拟矩形
temp = Camera.main.WorldToScreenPoint(obj.transform.position);//将目标物体的位置坐标转换到屏幕坐标
if(r.Contains(new Vector2(temp.x,temp.y)))//判断目标物体是否在虚拟矩形框中
{
obj.renderer.material.color = Color.green;//若在虚拟矩行框中则变绿
}
}
if(obj.renderer.material.color == Color.green )//目标物体变绿后的处理
{
if(obj_pos != new Vector3(0,0,0))
obj.transform.position = Vector3.SmoothDamp(obj.transform.position , ScreenToWorld(new Vector3 (mouse_start.x,mouse_start.y,Camera.main.WorldToScreenPoint(obj.transform.position).z)),ref velocity,0.3f);
}
}
//绘制矩形
void OnPostRender() {//在相机完成场景渲染之后被调用
if(flag == true)
{
if (!mat) {
Debug.LogError("
lease Assign a material on the inspector");
return;
}
GL.PushMatrix();//把投影视图矩阵和模型视图矩阵压入堆栈保存
mat.SetPass(0);//设置材质通道
GL.LoadOrtho();//正交投影变换
GL.Begin(GL.LINES);//开始绘制线
GL.Color(Color.red);//设置线的颜色
GL.Vertex(startVertex);//第一条线的第一个顶点
GL.Vertex(new Vector3(startVertex.x, mousePos.y / Screen.height, 0));//第二条线的第二个顶点
GL.Vertex(new Vector3(startVertex.x, mousePos.y / Screen.height, 0));//第二条线的第一个顶点
GL.Vertex(new Vector3(mousePos.x/Screen.width, mousePos.y / Screen.height, 0));//第二条线的第二个顶点
GL.Vertex(startVertex);//第三条线的第一个顶点
GL.Vertex(new Vector3(mousePos.x/Screen.width, startVertex.y, 0));//第三条线的第二个顶点
GL.Vertex(new Vector3(mousePos.x/Screen.width, startVertex.y, 0));//第四条线的第一个顶点
GL.Vertex(new Vector3(mousePos.x/Screen.width, mousePos.y / Screen.height, 0));//第四条线的第二个顶点
GL.End();//结束绘制
GL.PopMatrix();//把投影视图矩阵和模型视图矩阵弹出堆栈
}
}
//屏幕转世界
Vector3 ScreenToWorld(Vector3 v)
{
return Camera.main.ScreenToWorldPoint(v);
}
}
作者:
Asen
时间:
2011-9-23 15:12
作者:
奇
时间:
2012-1-29 23:23
送你一件外套,前面是平安,后面是幸福,吉祥是领子,如意是袖子,快乐是扣子,口袋里满是温暖,穿上吧,让它相伴你的每一天!新年快乐!
作者:
奇
时间:
2012-2-19 23:18
我无语!
作者:
奇
时间:
2012-2-21 23:21
俺是新人,这厢有礼了!
作者:
奇
时间:
2012-5-3 23:24
水。。。
作者:
markq
时间:
2012-5-4 23:20
谢谢分享
爱生活 爱3D 爱纳金网
www.narkii.com
作者:
tc
时间:
2012-5-14 23:21
楼主收集的可真全哦
作者:
奇
时间:
2012-5-25 23:19
既来之,则看之!
作者:
晃晃
时间:
2012-6-2 23:26
凡系斑竹滴话要听;凡系朋友滴帖要顶!
作者:
奇
时间:
2012-7-2 23:22
呵呵,很好,方便罗。
作者:
C.R.CAN
时间:
2012-7-14 23:18
不错 非常经典 实用
作者:
C.R.CAN
时间:
2012-8-24 00:09
好`我顶``顶顶
作者:
菜刀吻电线
时间:
2012-8-30 00:55
已阵亡的 蝶 随 风 舞 说过 偶尔按一下 CTRL A 会发现 世界还有另一面
作者:
C.R.CAN
时间:
2012-10-11 23:27
我就看看,我不说话
作者:
菜刀吻电线
时间:
2012-10-12 23:20
俺是新人,这厢有礼了!
作者:
tc
时间:
2012-11-12 23:34
百度的叫度娘,网易的叫易娘,新浪内部还在为是叫新娘还是浪娘而争论不休!……不管你们是企鹅的额娘,豆瓣的伴娘,还是华为的伪娘,都要记得,淘宝才是你们的亲娘啊!亲!!
作者:
菜刀吻电线
时间:
2012-12-1 23:27
无聊时可以刷屏幕 灌水 也可以试试 帖子的标题究竟可以写多长
作者:
奇
时间:
2013-2-22 23:31
无聊时可以刷屏幕 灌水 也可以试试 帖子的标题究竟可以写多长
作者:
晃晃
时间:
2013-3-6 23:20
呵呵,真得不错哦!!
欢迎光临 纳金网 (http://rs.narkii.com/club/)
Powered by Discuz! X2.5