思路:
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方法监听事件