- 最后登录
- 2016-8-29
- 注册时间
- 2012-8-25
- 阅读权限
- 90
- 积分
- 23585
  
- 纳金币
- 20645
- 精华
- 62
|
代码如下:- 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);
- }
- }
复制代码 |
|