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