角色攻击判定与处理

原地址:http://www.unity蛮牛.com/thread-15290-1-1.html

------分享我自己理解的,这个适用于近战.


我先说一下思路.这种事情发生在角色与敌人之间 ,也就是两个物体之间. 那就是一个主动攻击方A,和一个被攻击方B
1.检测B是否在A的正前方  (主动攻击方A不可能攻击自己的后面/左面/右面)

/// <summary>
/// 方向检测,判断B在A的前方吗.
/// </summary>
/// <returns><c>true</c>, if direction was checked, <c>false</c> otherwise.</returns>
/// <param name="A">A.</param>
/// <param name="B">B.</param>
bool CheckDirection(GameObject A,GameObject B)
{
        //两个物体之间创建一个向量,然后将这个向量变为1单位长度.
        Vector3 dir = (A.transform.position - B.transform.position).normalized;
        //使用A物体前方的这条向量,并且1单位长度,与上一个向量做比较.
        float direction = Vector3.Dot ( A.transform.forward,dir);
        //这个Vector3.Dot将会返回一个1到-1之间的值.
        //前方 返回正值.
        //后方 返回负值值.
        //侧面 返回0.
 
        //确保它是个正值,所以让它大于0.5
        if(direction > 0.5f) 
        {
                return true;
        }
 
        return false;
}

2.检测A与B的距离,也就是攻击距离 (不可能离着十万八千里就攻击到敌人)

/// <summary>
/// 返回两个物体之间的距离.
/// </summary>
/// <returns>The distance.</returns>
/// <param name="v1">V1.</param>
/// <param name="v2">V2.</param>
float float_Distance(GameObject  A  ,GameObject B)
{           
        return        Mathf.Abs(Vector3.Distance(A.transform.position,B.transform.position));
}

3.判定A的武器在哪一瞬间攻击到了B然后就可以扣B的血量了, 也就是在A播放攻击动画时,播放到武器挥出去正中敌人的那一帧,这个就要做动画事件

GameObject A;
GameObject B;
void Awake()
{
        A = GameObject.FindWithTag("Player");
        B = GameObject.FindWithTag("Enemy");
}
 
// Use this for initialization
void Start () {
 
         
         
        AnimationClip gunMove1 = animation.GetClip("attack1");//动画名.
        AnimationEvent aevent1 = new AnimationEvent();
        aevent1.functionName = "setInfo1"; //方法名.
        aevent1.time =19/24f;
        gunMove1.AddEvent(aevent1);
         
}
 
void setInfo1()
{
        Debug.Log("Event attack1");
 
        //0.检测A和B都存在
        if(A!=null && B!=null)
        {
                //1.检测方向.
                if(CheckDirection(A,B))
                {
                        //2.检测距离.攻击距离为2.3
                        if(float_Distance(A,B)<2.3f)
                        {
                                //扣血,显示伤害
                                Debug.Log("A攻击了B,B-3点血");
 
                        }
                }
 
        }
         
         
         
}

最后在说一下aevent1.time 怎样计算

原文地址:https://www.cnblogs.com/123ing/p/3713088.html