Unity尝试制作王者荣耀笔记(九)小兵攻击箭塔以及对箭塔的伤害值

思路:

1.寻找攻击目标

2.进行攻击

3.播放攻击动画

4.对箭塔的伤害方法Attack

5.在攻击动画上绑定伤害方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;

public class SmartSolider : MonoBehaviour {

    public Transform target;
    private Animation ani;
    private NavMeshAgent nav;
    public Transform[] towers;
    public int type=0;

    private float distance;//小兵与箭塔的距离
	// Use this for initialization
	void Start () {

        nav = GetComponent<NavMeshAgent>();
        ani = GetComponent<Animation>();
	}
	
	// Update is called once per frame
	void Update ()
    {
        SoliderMove();
    }

    void SoliderMove()
    {

        if (target==null)
        {
            //目标点为空,需要寻找一下目标点
            target = GetTarget();
            return;
        }
        
        ani.CrossFade("Run");
        nav.SetDestination(target.position);
        //通过距离判断小兵是否都攻击箭塔

        distance = Vector3.Distance(transform.position, target.position);
        if (distance>5)
        {
            nav.speed = 3.5f;//保持原速度前进
        }
        else
        {
            nav.speed = 0;//小兵停止前进
            Vector3 tarpos = target.position;
            Vector3 lookpos=new Vector3(tarpos.x,transform.position.y,tarpos.z);
            transform.LookAt(lookpos);//小兵看向炮塔,箭塔比较高,所以看向高度是小兵的高度
            ani.CrossFade("Attack1");
        }
    }

//播放攻击动画,监听攻击事件
    public void Attack()
    {

        if (target!=null)
        {
            target = GetTarget();
            return;
        }

        Health heal = target.GetComponent<Health>();
        float damp = Random.Range(0.1f, 0.6f);
        heal.TakeDamage(damp);//攻击目标血量减少

        if (heal.hp.Value<=0)
        {
            Destroy(target.gameObject);
            
            //移除目标对象
            //获取下一个目标
        }

    }

    //假如小兵跑向的目标点是塔
    Transform GetTarget()
    {
        for (int i=0;i<towers.Length;i++)
        {

            if (towers[i]!=null)
            {
                return towers[i];
            }

        }
        return null;
    }

    //设置小兵行走的路
    public void SetRoad(int road)
    {
      
        nav = GetComponent<NavMeshAgent>();
        nav.areaMask = road;
    }
}

注意事项:添加动画事件时,若发现攻击动画Attack1是只读的Read—only不能添加监听事件:

解决方法:重新复制一份动画,用重新复制的这份动画。

此时在选中人物对象,打开animation添加Attack方法监听事件

发布了152 篇原创文章 · 获赞 24 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_40229737/article/details/105143551