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

完~

posted @ 2019-10-25 14:42  大刀乱飞  阅读(984)  评论(0)    收藏  举报