使用Unity里面的Animation State Machine动画状态机
动画的属性设置,分为循环动画和一次性动画
主角的动画分类
•休闲
•行走
•攻击 Attack1 Attack2 RangeAttack
•被攻击
打开animator窗口,如何打开呢?可以先在Hierarchy中选中player,在Windows->animator就可以打开其窗口了
从Model中导入Player的动画。
动画属性设置,可以把他们之间的动画分为循环动画和一次性动画,这里只有Stand为循环动画
设置他们之间的转换关系,比如Bool和Trigger类型,从PlayerStand到PlayerRun为Bool类型,true的时候为Run,false的时候返回默认的Stand
而Stand和Attack他们之间是Trigger,意味触发,而Attack回到Stand的条件是动画播放结束,Exit Time,他们之间的关系如图:
接下来就是事件触发,攻击控制了:
设置虚拟的攻击按钮
通过代码添加按钮的点击事件监听
•EventDelegate normalClickEvent = new EventDelegate(this, "OnNormalAttackButtonClick");
•GameObject.Find("NormalAttack").GetComponent<UIButton>().onClick.Add(normalClickEvent);
给状态机设置状态条件
•修改Trigger animator.SetTrigger("AttackB");
•修改Bool animator.SetBool("Walk", false);
using UnityEngine;
using System.Collections;
public class PlayerAnimationAttack : MonoBehaviour {
private Animator animator;
private bool isCanAttackB;
// Use this for initialization
void Start () {
animator = this.GetComponent<Animator>();
EventDelegate NormalAttackEvent = new EventDelegate(this, "OnNormalAttackClick");
GameObject.Find("NormalAttack").GetComponent<UIButton>().onClick.Add(NormalAttackEvent);
EventDelegate RangeAttackEvent = new EventDelegate(this, "OnRangeAttackClick");
GameObject.Find("RangeAttack").GetComponent<UIButton>().onClick.Add(RangeAttackEvent);
EventDelegate RedAttackEvent = new EventDelegate(this, "OnRedAttackClick");
GameObject redAttack = GameObject.Find("RedAttack");
redAttack.GetComponent<UIButton>().onClick.Add(RedAttackEvent);
redAttack.SetActive(false);
}
// Update is called once per frame
void Update () {
}
public void OnNormalAttackClick() {
if (animator.GetCurrentAnimatorStateInfo(0).IsName("PlayerAttackA") && isCanAttackB) {
animator.SetTrigger("AttackB");
} else {
animator.SetTrigger("AttackA");
}
}
public void OnRangeAttackClick() {
animator.SetTrigger("AttackRange");
}
public void OnRedAttackClick() {
animator.SetTrigger("AttackGun");
}
public void AttackBEvent1() {
isCanAttackB = true;
}
public void AttackBEvent2() {
isCanAttackB = false;
}
}