unity 扇形角度计算
沿着物体的正前方 发射一个偏移该方向指定角度的射线
第一种方法:
public Transform target; public float angle = 0; // Use this for initialization private void Awake() { } void Start () { } private void LateUpdate() { Quaternion rotation = Quaternion.Euler(0f, angle, 0f) * target.rotation; Vector3 newPos = rotation * new Vector3(10f, 0f, 0f); Debug.DrawLine(newPos, Vector3.zero, Color.red); }
效果如下:

第二种方法:
public Transform target; public float angle = 0; // Use this for initialization private void Awake() { } void Start () { } private void LateUpdate() { Vector3 newPos = target.transform.forward * 10f; float distance = Vector3.Distance(target.transform.position, newPos); Quaternion right = target.transform.rotation * Quaternion.AngleAxis(30, Vector3.up); Quaternion left = target.transform.rotation * Quaternion.AngleAxis(30, Vector3.down); Vector3 n = target.transform.position + (Vector3.forward * distance); Vector3 leftPoint = left * n; Vector3 rightPoint = right * n; Debug.DrawLine(target.transform.position, leftPoint, Color.red); Debug.DrawLine(target.transform.position, rightPoint, Color.red); }
结果如图

第三种,可以根据角度平均求出每条线的终点位置:
public Transform target; public float angle = 0; // Use this for initialization private void Awake() { } void Start () { } private void LateUpdate() { Vector3[] list = GetSectorDir(target.transform.position, target.transform.forward, 60, 10,5); for (int i = 0; i < list.Length; i++) { Debug.DrawLine(target.transform.position, list[i], Color.red); } } private Vector3[] GetSectorDir(Vector3 orgin,Vector3 forward,float angle,float distance, int num) { Vector3[] dirs = new Vector3[num]; Quaternion qu = new Quaternion(); qu.SetLookRotation(forward.normalized); float an = angle / (num-1); float start = -angle * 0.5f;//= -angle/2 for (int i = 0; i < num; i++) {
//这段代码有bug 会随着物体位置改变而计算错误
//Quaternion right = qu * Quaternion.AngleAxis(start, Vector3.up);
//Vector3 n = orgin + (Vector3.forward * distance);
//start += an;
//dirs[i] = right * n;
Quaternion right = qu * Quaternion.AngleAxis(start, Vector3.up);
Vector3 n = orgin + right * (Vector3.forward * distance);
start += an;
dirs[i] = n;
} return dirs; }
效果如图:

如果需要判断扇形范围:
//先画一个扇形区域,然后直接通过比较物品是否在区域之中 //检测扇形范围区域 float minDistance ; float minAngle; private bool CheackScope(float _distance, Vector3 _avatarPos, Vector3 _enemyPos) { Vector3 srcVect = _enemyPos - _avatarPos; Vector3 fowardPos = target.transform.forward * 1 + _avatarPos; Vector3 fowardVect = fowardPos - _avatarPos; fowardVect.y = 0; float angle = Vector3.Angle(srcVect, fowardVect); if (_distance < minDistance && angle < minAngle / 2) { Debug.Log("进入了检测范围"); return true; } return false; }
参考资料:https://www.xuanyusong.com/archives/1977
完~

浙公网安备 33010602011771号