- 检测目标是否在视线范围内(附视线范围扇形画法)
using UnityEngine; public class Test_CanSeeTarget : MonoBehaviour { public GameObject target; /// <summary> /// 视线范围-半径 /// </summary> public float sightViewRadius = 5; /// <summary> /// 视线范围-欧拉角 /// </summary> public float sightViewEuler = 120; /// <summary> /// 画扇形 /// </summary> /// <param name="radius"></param> /// <param name="euler"></param> /// <param name="color"></param> private void DrawSemicircle(float radius, float euler, Color color) { int segments = 10; float deltaAngle = euler / segments; Vector3 forward = transform.forward; Vector3[] vertices = new Vector3[segments + 2]; vertices[0] = transform.position; for (int i = 1; i < vertices.Length; i++) { Vector3 pos = Quaternion.Euler(0f, -euler / 2 + deltaAngle * (i - 1), 0f) * forward * radius + transform.position; vertices[i] = pos; } // 画圆弧 for (int i = 1; i < vertices.Length - 1; i++) { UnityEngine.Debug.DrawLine(vertices[i], vertices[i + 1], color); } // 画两条边 UnityEngine.Debug.DrawLine(vertices[0], vertices[vertices.Length - 1], color); UnityEngine.Debug.DrawLine(vertices[0], vertices[1], color); } private bool CanSeeTarget() { float distance = Vector3.Distance(transform.position, target.transform.position); Vector3 forward = transform.rotation * Vector3.forward; Vector3 dir = target.transform.position - transform.position; // 计算两个向量间的夹角,必须归一化normalized float angle = Mathf.Acos(Vector3.Dot(forward.normalized, dir.normalized)) * Mathf.Rad2Deg; if (distance < sightViewRadius) { if (angle <= sightViewEuler / 2) { UnityEngine.Debug.Log("CanSeeTarget: {true}"); return true; } } UnityEngine.Debug.Log("CanSeeTarget: {false}"); return false; } void Update() { DrawSemicircle(sightViewRadius, sightViewEuler, Color.yellow); CanSeeTarget(); } }
原文地址:http://www.cnblogs.com/caiger-blog/p/16837351.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性