主角状态机的设计

来源:互联网 发布:点胶机编程视频 编辑:程序博客网 时间:2024/04/28 20:23
使用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);
可以通过NGUI,设计一些攻击按钮,在按钮设置脚本就可以触发攻击动画了

using UnityEngine;using System.Collections;public class PlayerAnimationAttack : MonoBehaviour {    private Animator animator;    private bool isCanAttackB;// Use this for initializationvoid 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 framevoid 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;    }}


0 0
原创粉丝点击