Unity算法——矩形技能伤害判断

前言

在大型游戏中在Unity使用物理引擎是十分消耗性能的,特别是在移动端设备中,如果过多的使用物理引擎来进行行为判断,对设备性能消耗是很厉害的,一般情况我们在Unity游戏开发中,会通过算法来进行技能伤害判断,一个较为常见的伤害判断——通过矩形范围敌判断敌人是否在攻击范围之内。

Unity物理引擎的底层实现原理

在2D游戏中,物理引擎判断是否在攻击范围原理是AABB包围盒,


一个2D矩形,中心点到矩形包围边缘最长的距离是对角线, 两个中心点的位置相减获取相对距离L,并与两个中心点到举行包围盒的对角线距离相加,获取最长相交距离a,获取最短相交距离b,通过判断距离向量来确定是否技能范围命中敌人。

在3D游戏中,物理引擎的的判断原理是八象限包围盒,在2DAABB包围盒的基础上进行延伸,


也是通过判断相交最长与相交最短距离来检测是否发生碰撞,如果场景中有多个物体,先判断是否在同处于两个象限再检测碰撞距离。

如果一旦游戏场景中的物理引擎使用过多, 对性能的使用是很严重的,所以在游戏中我们会尽量减少对于物理引擎的使用。

如何通过算法进行矩形攻击范围的检测

主要运用的是点乘的方法:

点乘的特点 
在向量u,向量v非零的前提下,点积如果为负,则u,v形成的角大于90度; 
如果为零,那么u,v垂直; 
如果为正,那么u,v形成的角小于90度。 

Unity算法——矩形技能伤害判断_第1张图片

Unity算法——矩形技能伤害判断_第2张图片

按照我们的分析,代码如下:

    /// 
    /// 矩形攻击范围
    /// 
    /// 攻击方
    /// 被攻击方
    /// 矩形前方距离
    /// 矩形宽度/2
    /// 
    public bool RectAttackJudge( Transform  attacker , Transform  attacked ,float forwardDistance ,float rightDistance)
    {
        Vector3 deltaA = attacked.position - attacker.position;
        
         float   forwardDotA= Vector3.Dot(attacker.forward, deltaA);
        
         if (forwardDotA > 0 && forwardDotA <= forwardDistance)
         {
             if (Mathf.Abs(Vector3.Dot(attacker.right, deltaA)) < rightDistance)
             {
                 return true;
             }
         }
         return false;
    }

你可能感兴趣的:(Unity算法——矩形技能伤害判断)