zoukankan      html  css  js  c++  java
  • 角色攻击判定与处理

    原地址: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 怎样计算

  • 相关阅读:
    sql server 跟踪各事件的字段项编码及解释
    sql server 有关锁的视图说明 syslockinfo
    SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace)
    [SqlServer]创建链接服务器
    SQL Server 2008 存储过程,带事务的存储过程(创建存储过程,删除存储过程,修改存储过
    sql server 索引分析相关sql
    IO系统性能之一:衡量性能的几个指标
    Writing to a MySQL database from SSIS
    用漫画的形式来讲解为什么MySQL数据库要用B+树存储索引?
    一份 Tomcat 和 JVM 的性能调优经验总结!拿走不谢
  • 原文地址:https://www.cnblogs.com/123ing/p/3713088.html
Copyright © 2011-2022 走看看