Unity 检测目标点是否在扇形攻击范围内

2016-8-31 雨辰 Unity3D

在游戏设计中,有的技能的攻击范围是一个扇形,判断场景中的怪物是否在扇形范围内,我们可以理解具体思路:

首先,判断该目标点与技能释放者的距离是否小于扇形的半径;

其次目标点与技能释放者面对的方向向量夹角是否小于扇形角度的二分之一;


如上图所示,1为技能释放者,2为目标点

代码如下:

using UnityEngine;
using System.Collections;

public class TestTrans : MonoBehaviour
{
    public Transform Target;
    private float SkillDistance = 5;//扇形距离
    private float SkillJiaodu = 60;//扇形的角度
 
    void LateUpdate()
    {
        float distance = Vector3.Distance(transform.position, Target.position);//距离
        Vector3 norVec = transform.rotation * Vector3.forward * 5;//此处*5只是为了画线更清楚,可以不要
        Vector3 temVec = Target.position - transform.position;
        Debug.DrawLine(transform.position, norVec, Color.red);//画出技能释放者面对的方向向量
        Debug.DrawLine(transform.position, Target.position, Color.green);//画出技能释放者与目标点的连线
        float jiajiao = Mathf.Acos(Vector3.Dot(norVec.normalized, temVec.normalized)) * Mathf.Rad2Deg;//计算两个向量间的夹角
        if (distance < SkillDistance)
        {
            if (jiajiao <= SkillJiaodu * 0.5f)
            {
                Debug.Log("在扇形范围内");
            }
        }
    }
}

 这里要说明的是:
         
         1.norVec.normalized 和 temVec.normalized 表示的是两个向量的单位向量, 因为在公式里,有向量和模的除法,得出来的结果就是单位向量,所以我们这里和后面都直接用单位向量来计算,省去不少麻烦。 
         2.Mathf.Rad2Deg表示的是 单位弧度的度数


宣雨松有一篇文章也提供了很好的方案:

http://www.xuanyusong.com/archives/1977

标签: Unity3D

发表评论:

雨辰 joyimp|@2011-2018 京ICP备16030765号