主角状态机的设计

使用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 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;
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值