标签:plane poi absolute update void mon nsf ali upd
Unity 中提供了一种控制方案,用来检测鼠标点在屏幕上后,具体点在 Unity 场景中,三维世界的哪个点上
这种解决方案,就是射线检测:
通过鼠标点击屏幕,由屏幕上的点向Unity三维直接发射一条无限长的射线
当检测到碰撞物体后,便会返回被碰撞物体的所有信息,以及交点信息等等... ...
1. 普通射线检测(一般用于检测某一个物体)
1 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 2 Debug.DrawRay(ray.origin, ray.direction, Color.red); 3 RaycastHit hit; 4 if (Physics.Raycast(ray, out hit, int.MaxValue, 1 << LayerMask.NameToLayer("layerName"))) 5 { 6 Debug.Log("检测到物体!"); 7 }
2. 直线射线检测多个物体
1 Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); 2 Debug.DrawRay(ray.origin, ray.direction, Color.red); 3 RaycastHit[] hit = Physics.RaycastAll(ray, Mathf.Infinity, 1 << LayerMask.NameToLayer("layerName")); 4 if (hit.Length > 0) 5 { 6 for (int i = 0; i < hit.Length; i++) 7 { 8 Debug.Log("检测到物体:" + hit[i].collider.name); 9 } 10 }
3. 球形射线检测(一般用于检测周边物体)
1 int radius = 5; 2 Collider[] cols = Physics.OverlapSphere(this.transform.position, radius, LayerMask.NameToLayer("layerName")); 3 if (cols.Length > 0) 4 { 5 for (int i = 0; i < cols.Length; i++) 6 { 7 Debug.Log("检测到物体:" + cols[i].name); 8 } 9 }
画出球形检测范围的方法:
1 private void OnDrawGizmos() 2 { 3 Gizmos.DrawWireSphere(this.transform.position, 5); 4 }
创建地板和小球,构建简单的测试场景
将脚本挂载到空物体上,并在 Inspector 面板上对 Ball 进行赋值
1 using UnityEngine; 2 3 public class RayCast : MonoBehaviour 4 { 5 public Transform Ball; //小球 6 7 //设置射线在Plane上的目标点target 8 private Vector3 target; 9 10 void Update() 11 { 12 if (Input.GetMouseButton(1)) 13 { 14 object ray = Camera.main.ScreenPointToRay(Input.mousePosition); 15 RaycastHit hit; 16 bool isHit = Physics.Raycast((Ray)ray, out hit); 17 Debug.DrawLine(Input.mousePosition, hit.point, Color.red); 18 if (isHit) 19 { 20 Debug.Log("坐标为:" + hit.point); 21 target = hit.point; 22 } 23 } 24 //如果检测到小球的坐标 与 碰撞的点坐标 距离大于0.1f,就移动小球的位置到碰撞的点 25 Ball.position = Vector3.Distance(Ball.position, target) > 0.1f ? Vector3.Lerp(Ball.position, target, Time.deltaTime) : target; 26 } 27 28 /// <summary> 29 /// 移动方法 30 /// </summary> 31 /// <param name="target"></param> 32 void Move(Vector3 target) 33 { 34 if (Vector3.Distance(Ball.position, target) > 0.1f) 35 { 36 Ball.position = Vector3.Lerp(Ball.position, target, Time.deltaTime); 37 } 38 else 39 Ball.position = target; 40 } 41 }
测试效果:
射线检测的好处在于,发出的射线与带有Collider 组件的物体都会发生碰撞,并且可以返回各种信息
例如:被碰撞物体的位置、名称、法线等等一系列的数据
另外还可以自定义发出射线的距离、影响到的图层等等
*** | 以上内容仅为学习参考、学习笔记使用 | ***
标签:plane poi absolute update void mon nsf ali upd
原文地址:https://www.cnblogs.com/ChenZiRong1999/p/13272109.html