十二敌人动画控制
12.1动画控制
首先打开Enemy Animator Controller参考Player Animator Controller的打开方法。
12.2创建触发器
创建Animator Parameter参数EnemyAttack方法参考PlayerChop
12.3创建转换
建立动画转换联系参考Player操作。
EnemyIdle -> EnemyAttack
EnemyAttack -> EnemyIdle
修改属性参考PlayerChop的属性设置过程。
备注:所有操作都是基于Enemy1进行的。由于Enemy2是复制Enemy1所以动画控制不需要单独设置。
12.4 修改脚本
修改GameManager.cs代码如下:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using UnityEngine.UI;
public class GameManager : MonoBehaviour
{
//延迟
public float turnDelay = 0.1f;
//敌人
private List<Enemy> enemies;
//敌人是否移动
private bool enemiesMoving;
public static GameManager instance = null;
//关卡管理器脚本
public BoardManager boardScript;
//初始关卡数
private int level =3;
public int playerFoodPoints = 100;
[HideInInspector]
public bool playersTurn = true;
void Awake ()
{
if (instance == null)
instance = this;
else
Destroy(instance);
DontDestroyOnLoad(gameObject);
//初始化敌人信息
enemies = new List<Enemy>();
//初始化关卡脚本
boardScript = GetComponent<BoardManager>();
//初始化游戏
InitGame();
}
public void GameOver()
{
//清空上一关敌人信息
enemies.Clear();
enabled =false;
}
//初始化游戏
void InitGame()
{
boardScript.SetupScene(level);
}
IEnumerator MoveEnemies()
{
enemiesMoving = true;
yield return new WaitForSeconds(turnDelay);
if(enemies.Count == 0)
{
yield return new WaitForSeconds(turnDelay);
}
for(int i=0;i<enemies.Count;i++)
{
enemies[i].EnemyMove();
yield return new WaitForSeconds(enemies[i].moveTime);
}
playersTurn = true;
enemiesMoving = false;
}
void Update ()
{
if(playersTurn || enemiesMoving)
return;
StartCoroutine(MoveEnemies());
}
public void AddEnemyToList(Enemy script)
{
enemies.Add(script);
}
}
修改Enemy.cs代码如下:
using UnityEngine;
using System.Collections;
public class Enemy : MovingObject
{
//对主角造成伤害
public int playerDemage;
//动画
private Animator animator;
//移动目标
private Transform target;
//每2回合移动一次
private bool skipMove;
protected override void Start ()
{
//保存敌人到list中
GameManager.instance.AddEnemyToList(this);
animator = GetComponent<Animator>();
target = GameObject.FindGameObjectWithTag("Player").transform;
base.Start();
}
protected override void AttemptMove<T>(int xDir,int yDir)
{
if(skipMove)
{
skipMove = false;
return ;
}
base.AttemptMove<T>(xDir,yDir);
skipMove = true;
}
public void EnemyMove()
{
int xDir = 0 ;
int yDir = 0 ;
//与主角同一x的时候,向主角移动
if(Mathf.Abs(target.transform.position.x - transform.position.x) < float.Epsilon)
yDir = target.transform.position.y > transform.position.y ? 1:-1;
//不在同一x的时候,移动向主角x
else
xDir = target.transform.position.x > transform.position.x ? 1:-1;
AttemptMove<Player>(xDir,yDir);
}
protected override void OnCantMove<T>(T component)
{
Player hitPlayer = component as Player;
//碰撞主角
animator.SetTrigger("EnemyAttack");
hitPlayer.LoseFood(playerDemage);
}
}
12.5附加组件
把Enemy.cs作为组件附加给Enemy1和Enemy2预制体。
设置Enemy Script/Blocking Layer值为BlockingLayer。
设置Enemy1预制体/Enemy Script/Player Damage值为10
设置Enemy2预制体/Enemy Script/Player Damage值为20