using UnityEngine; public class Enemy : MonoBehaviour { //扇形角度 //[SerializeField] private float angle = 80f; //扇形半径 //[SerializeField] private float radius = 3.5f; //物体B [SerializeField] private Transform b; private bool flag; /// /// 判断target是否在扇形区域内 /// /// 扇形角度 /// 扇形半径 /// 攻击者的transform信息 /// 目标 /// 目标target在扇形区域内返回true 否则返回false private void Start() { } // Update is called once per frame private void Update() { //detactDeath(); //flag = IsInRange(angle, radius, transform, b); } public bool IsInRange(float sectorAngle, float sectorRadius, Transform attacker, Transform target) { //攻击者位置指向目标位置的向量 Vector3 direction = target.position - attacker.position; //点乘积结果 float dot = Vector3.Dot(direction.normalized, transform.forward); //反余弦计算角度 float offsetAngle = Mathf.Acos(dot) * Mathf.Rad2Deg; return offsetAngle < sectorAngle * .5f && direction.magnitude < sectorRadius; } /* private void OnDrawGizmos() { Handles.color = flag ? Color.cyan : Color.red; float x = radius * Mathf.Sin(angle / 2f * Mathf.Deg2Rad); float y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f)); Vector3 a = new Vector3(transform.position.x - x, transform.position.y, transform.position.z + y); Vector3 b = new Vector3(transform.position.x + x, transform.position.y, transform.position.z + y); Handles.DrawLine(transform.position, a); Handles.DrawLine(transform.position, b); float half = angle / 2; for (int i = 0; i < half; i++) { x = radius * Mathf.Sin((half - i) * Mathf.Deg2Rad); y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f)); a = new Vector3(transform.position.x - x, transform.position.y, transform.position.z + y); x = radius * Mathf.Sin((half - i - 1) * Mathf.Deg2Rad); y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f)); b = new Vector3(transform.position.x - x, transform.position.y, transform.position.z + y); Handles.DrawLine(a, b); } for (int i = 0; i < half; i++) { x = radius * Mathf.Sin((half - i) * Mathf.Deg2Rad); y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f)); a = new Vector3(transform.position.x + x, transform.position.y, transform.position.z + y); x = radius * Mathf.Sin((half - i - 1) * Mathf.Deg2Rad); y = Mathf.Sqrt(Mathf.Pow(radius, 2f) - Mathf.Pow(x, 2f)); b = new Vector3(transform.position.x + x, transform.position.y, transform.position.z + y); Handles.DrawLine(a, b); } } */ }