1.敌人和玩家若存活,敌人始终朝着玩家所在位置移动,所以要给玩家物体一个Tag:Player从而找到玩家
2.敌人的自动寻路使用Unity自带的NavMeshAgent寻路组件寻路,要先把场景中不动的物体勾选Static,然后Navigation-Bake烘焙
移动 代码如下:
public class EnemyMovement : MonoBehaviour { Transform player; // 玩家位置变量. PlayerHealth playerHealth; // 玩家生命脚本 EnemyHealth enemyHealth; // 敌人生命脚本 UnityEngine.AI.NavMeshAgent nav; //敌人身上寻路组件 void Awake () { // 获取组件 player = GameObject.FindGameObjectWithTag ("Player").transform; //根据Tag找到玩家 playerHealth = player.GetComponent <PlayerHealth> (); enemyHealth = GetComponent <EnemyHealth> (); nav = GetComponent <UnityEngine.AI.NavMeshAgent> ();//获取物体身上寻路组件 } void Update () { // 如果主角和敌人都存活 if(enemyHealth.currentHealth > 0 && playerHealth.currentHealth > 0) { // 使用寻路组件朝玩家位置寻路 nav.SetDestination (player.position); } else { //主角或敌人死亡,停止寻路,禁用寻路组件 nav.enabled = false; } } }
3.敌人小怪身上状态机:默认移动,始终朝着敌人移动;直到玩家死亡,才切换到待机状态
4.小怪身上挂刚体组件,Drag和Angular Drag都设置为Inf无限大,使用重力取消物理属性。勾选禁用Y方向移动和XZ方向旋转
5.小怪身上加CapsuleCollider组件,调整适配,不勾选IsTrigger
6.小怪身上加大一点的SphereCollider组件,勾选IsTrigger,作为进入攻击玩家范围的触发判断用
注意:
7.本例中有三种怪,其中两种怪是用的一套动画,而大象是单独一套动画
但是,大象的动画状态机和其他的是一个逻辑,所以为了复用状态参数以及状态机的逻辑,不新建AnimatorController,而是
复用状态机:AnimatorOverrideController(针对动画不同,但是状态机逻辑与参数都相同的情况:如多种角色)
Controller拖入复用的源状态机,然后分别拖入相应动画:
因此需要注意,父AC的改变会影响override的AC。