查看: 1196|回复: 0
打印 上一主题 下一主题

[其他] 选择游戏物体的代码

[复制链接]

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-4-30 23:27:46 |只看该作者 |倒序浏览

代码如下:
  1. using UnityEngine;

  2. using System.Collections;

  3. //鼠标拾取

  4. public class MouseSelect : MonoBehaviour {

  5. public Material mat;//矩形框的材质

  6. public GameObject obj;//目标

  7. public Vector3 temp;//存放目标物体转到屏幕坐标

  8. public Vector3 obj_pos;//目标物体要到达的位置

  9. public Rect r;//虚拟矩形

  10. public Vector3 startVertex;//鼠标所绘矩形框的左上顶点坐标

  11. public Vector3 mousePos;//鼠标位置坐标

  12. public Vector3 mouse_start;//按下鼠标左键时鼠标的位置

  13. private bool flag = false;//是否绘制

  14. private Vector3 velocity = Vector3.zero;//平滑阻尼速度

  15. void Start()

  16. {

  17. obj_pos = new Vector3(0,0,0);

  18. }

  19. void Update() {

  20. mousePos = Input.mousePosition;//获取鼠标位置坐标

  21. if (Input.GetMouseButtonDown(0))//按下鼠标左键

  22. {

  23. flag =true;//开启绘制

  24. mouse_start = mousePos;

  25. if(obj.renderer.material.color == Color.green )

  26. obj_pos = mouse_start;

  27. startVertex = new Vector3(mousePos.x / Screen.width, mousePos.y / Screen.height, 0);

  28. }

  29. if(Input.GetMouseButtonUp(0))//抬起鼠标左键

  30. {

  31. flag =false;//关闭绘制

  32. r= new Rect(mouse_start.x , mousePos.y , mouse_start.y - mousePos.y, mousePos.x - mouse_start.x);//根据鼠标所绘矩形构造虚拟矩形

  33. temp = Camera.main.WorldToScreenPoint(obj.transform.position);//将目标物体的位置坐标转换到屏幕坐标
  34. if(r.Contains(new Vector2(temp.x,temp.y)))//判断目标物体是否在虚拟矩形框中

  35. {

  36. obj.renderer.material.color = Color.green;//若在虚拟矩行框中则变绿
  37. }

  38. }

  39. if(obj.renderer.material.color == Color.green )//目标物体变绿后的处理

  40. {

  41. if(obj_pos != new Vector3(0,0,0))

  42. 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);
  43. }
  44. }

  45. //绘制矩形

  46. void OnPostRender() {//在相机完成场景渲染之后被调用

  47. if(flag == true)

  48. {

  49. if (!mat) {

  50. Debug.LogError("lease Assign a material on the inspector");

  51. return;

  52. }

  53. GL.PushMatrix();//把投影视图矩阵和模型视图矩阵压入堆栈保存

  54. mat.SetPass(0);//设置材质通道

  55. GL.LoadOrtho();//正交投影变换

  56. GL.Begin(GL.LINES);//开始绘制线

  57. GL.Color(Color.red);//设置线的颜色

  58. GL.Vertex(startVertex);//第一条线的第一个顶点

  59. GL.Vertex(new Vector3(startVertex.x, mousePos.y / Screen.height, 0));//第二条线的第二个顶点
  60. GL.Vertex(new Vector3(startVertex.x, mousePos.y / Screen.height, 0));//第二条线的第一个顶点

  61. GL.Vertex(new Vector3(mousePos.x/Screen.width, mousePos.y / Screen.height, 0));//第二条线的第二个顶点
  62. GL.Vertex(startVertex);//第三条线的第一个顶点

  63. GL.Vertex(new Vector3(mousePos.x/Screen.width, startVertex.y, 0));//第三条线的第二个顶点
  64. GL.Vertex(new Vector3(mousePos.x/Screen.width, startVertex.y, 0));//第四条线的第一个顶点

  65. GL.Vertex(new Vector3(mousePos.x/Screen.width, mousePos.y / Screen.height, 0));//第四条线的第二个顶点
  66. GL.End();//结束绘制

  67. GL.PopMatrix();//把投影视图矩阵和模型视图矩阵弹出堆栈
  68. }

  69. }

  70. //屏幕转世界

  71. Vector3 ScreenToWorld(Vector3 v)

  72. {

  73. return Camera.main.ScreenToWorldPoint(v);
  74. }

  75. }
复制代码
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2025-6-16 07:33 , Processed in 0.091204 second(s), 32 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部