unity 扇形范围检测目标
第一种
代码方法
传入目标点测试即可
private float ScopeDistance = 2f;//扇形距离 private float ScopeJiaodu = 120;//扇形的角度 //传入目标点位置 判断在不在扇形范围内 private void ScopeIsAnimal(Vector3 vector) { float distance = Vector3.Distance(transform.position, vector);//距离 Vector3 norVec = transform.rotation * Vector3.forward * 5;//此处*5只是为了画线更清楚,可以不要 Vector3 temVec = vector - transform.position; Debug.DrawLine(transform.position, norVec, Color.red);//画出技能释放者面对的方向向量 float jiajiao = Mathf.Acos(Vector3.Dot(norVec.normalized, temVec.normalized)) * Mathf.Rad2Deg;//计算两个向量间的夹角 if (distance < ScopeDistance) { if (jiajiao <= ScopeJiaodu * 0.5f) { Debug.Log("在扇形范围内"); } } }
里面逻辑自己添加就好
第二种
在摄像机上添加脚本

using System.Collections; using System.Collections.Generic; using UnityEngine; public class CameraRay : MonoBehaviour { private float viewRadius = 8.0f; // 代表视野最远的距离 private float viewAngleStep = 30; // 射线数量,越大就越密集,效果更好但硬件耗费越大。 void DrawFieldOfView() { // 获得最左边那条射线的向量,相对正前方,角度是-45 Vector3 forward_left = Quaternion.Euler(0, -45, 0) * transform.forward * viewRadius; // 依次处理每一条射线 for (int i = 0; i <= viewAngleStep; i++) { // 每条射线都在forward_left的基础上偏转一点,最后一个正好偏转90度到视线最右侧 Vector3 v = Quaternion.Euler(0, (90.0f / viewAngleStep) * i, 0) * forward_left; ; // 创建射线 Ray ray = new Ray(transform.position, v); RaycastHit hitt = new RaycastHit(); // 射线只与两种层碰撞,注意名字和你添加的layer一致,其他层忽略 int mask = LayerMask.GetMask("Obstacle", "Enemy"); Physics.Raycast(ray, out hitt, viewRadius, mask); // Player位置加v,就是射线终点pos Vector3 pos = transform.position + v; if (hitt.transform != null) { // 如果碰撞到什么东西,射线终点就变为碰撞的点了 pos = hitt.point; } // 从玩家位置到pos画线段,只会在编辑器里看到 Debug.DrawLine(transform.position, pos, Color.red); ; // 如果真的碰撞到敌人,进一步处理 if (hitt.transform != null && hitt.transform.gameObject.layer == LayerMask.NameToLayer("Enemy")) { OnEnemySpotted(hitt.transform.gameObject); } } } void OnEnemySpotted(GameObject enemy) { enemy.GetComponent<Enemy>().spottedFrame = Time.frameCount; } public Vector3 ColliderV3; // Update is called once per frame void Update() { DrawFieldOfView(); } }
物体脚本

using System.Collections; using System.Collections.Generic; using UnityEngine; public class Enemy : MonoBehaviour { MeshRenderer meshRenderer; // 代表被发现时的帧数(这里用帧数代表时间) public int spottedFrame = -100; void Start() { meshRenderer = GetComponent<MeshRenderer>(); } void Update() { // 通过设置 spottedFrame,就可以实现隐藏或显现 if (spottedFrame >= Time.frameCount - 10) { meshRenderer.enabled = true; } else { meshRenderer.enabled = false; } } }
最后别忘了加上层级,运行测试就可以了
简单记录一下下
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律