Unity3D之Mecanim动画系统学习笔记(六):使用脚本控制动画

控制人物动画播放

这里我重新弄了一个简单的场景和新的Animator Controller来作为示例。

下面先看看Animator Controller的配置:


人物在站立状态只能进入走路,走路只能进入奔跑或返回站立,奔跑只能进入跳跃或返回走路,跳跃则只能返回奔跑。

参数方面为两个参数:

  • Float类型的moveSpeed;
  • Trigger类型的Jump;

连线直接的转换条件为:moveSpeed大于0.1进入走路,走路moveSpeed大于0.9进入奔跑小于0.1返回站立,奔跑moveSpeed小于0.9返回走路,Jump被触发则进入跳跃;

为人物添加Animator组件并绑定上面的Animator Controller文件,同时绑定下面的脚本:

using UnityEngine;
using System.Collections;

public class TestAnim : MonoBehaviour
{
    //将名称转换为哈希值可以提高索引的速度
    private int moveSpeed = Animator.StringToHash("moveSpeed");
    private int jump = Animator.StringToHash("Jump");
    private int runState = Animator.StringToHash("Base Layer.Run");

    private Animator _animator;

    void Start()
    {
        _animator = this.GetComponent<Animator>();
    }
    
    void Update()
    {
        float speed = Input.GetAxis("Vertical");
        _animator.SetFloat(moveSpeed, speed);

        //获取动画的当前状态
        AnimatorStateInfo info = _animator.GetCurrentAnimatorStateInfo(0);
        //跳跃除了要按下空格键外, 还需要处于奔跑状态才行, 否则按下空格键时就会标记 Jump, 一进入奔跑就马上跳跃
        if(Input.GetKeyDown(KeyCode.Space) && info.fullPathHash == runState)
        {
            _animator.SetTrigger(jump);
        }
    }
}


State Machine Behavior

在Unity5.0中,我们可以给Animator Controller中的每个State添加脚本了,类似于专门用于GameObject的MonoBehavior,State可以添加State Machine Behavior,我们打开任意的Animator Controller,就可以在Inspector窗口发现添加脚本的按钮:


除了State外,我们还可以在层上添加,层可以看做包含了整个State的一个大State:


我们可以添加一个脚本看看,下面是我添加了注释的State Machine Behavior脚本的标准形式:

using UnityEngine;
using System.Collections;

public class StateScript : StateMachineBehaviour
{
    // OnStateEnter is called before OnStateEnter is called on any state inside this state machine
    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        //进入当前状态时会被调用
    }

    // OnStateUpdate is called before OnStateUpdate is called on any state inside this state machine
    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        //进入当前状态的每帧会被调用
    }

    // OnStateExit is called before OnStateExit is called on any state inside this state machine
    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        //退出当前状态时会被调用
    }

    // OnStateMove is called before OnStateMove is called on any state inside this state machine
    override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

    // OnStateIK is called before OnStateIK is called on any state inside this state machine
    override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
    }

    // OnStateMachineEnter is called when entering a statemachine via its Entry Node
    override public void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
    {
    }

    // OnStateMachineExit is called when exiting a statemachine via its Exit Node
    override public void OnStateMachineExit(Animator animator, int stateMachinePathHash)
    {
    }
}

通过使用State Machine Behaviour我们可以更加方便的在特定的时间点触发一些我们需要的事件,但是需要注意的是,我们一般给State Machine Behaviour赋值一些场景的对象不是直接在Inspector面板里拖拽而是通过Animator的GetBehavior方法获取到指定的State Machine Behaviour的实例后通过脚本进行赋值的。

天道酬勤,功不唐捐!

原文地址:http://www.cnblogs.com/hammerc/p/4829398.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值