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

原创 2015年07月09日 14:35:55

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

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

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


如上图所示,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表示的是 单位弧度的度数。

其中的一些计算公式参照下面的文章链接

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Unity3D shader 人物被选中光环/技能范围光环

好长一段时间都没写过博客了,身边一有各种杂七杂八的事就懒散下来了,我要振作(╯‵□′)╯""┻━┻。楼主在写这篇博客的时候室友突然要和几个同班同学去云南玩耍个一星期,搞得楼主差点没心情继续往下写了,我...

unity3d 设置是否在攻击范围

using UnityEngine; using System.Collections; public class Vector3Practice : MonoBehaviour { pub...

[Unity实战]详解换装系统(一)

第一次接触unity的换装系统是五天前的事了,当时看了很多资料,但始终是一头雾水,当看到官方的换装demo时,本人甚至都绝望了!心里暗暗想到:“它猫的老子不学了!”。而在昨天,本人真的是无意中看到了一...
  • lyh916
  • lyh916
  • 2015-04-01 09:29
  • 2346

[Unity插件]Behavior Designer

给物体添加Behavior Tree组件,点击Open Behavior Designer进行行为树的编辑。 1.编辑器 第1-5个按钮用于选择要编辑的行为树 Referenced Behav...
  • lyh916
  • lyh916
  • 2016-01-22 22:58
  • 1359
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)