淘先锋技术网

首页 1 2 3 4 5 6 7

前言

Unity4.3版本之后添加了新的播放动画组件Animator -> 以树的形式来控制动画的切换

  • 在工程里的模型里选择rig里的AnimationType设置为新动画Humanoid 之后 Apply
    1
    此时工程多了个阿凡达Avatar模型
    2

  • 可以在Avatar里配置人物模型骨骼

  • 动画分割
    这里写图片描述

    1. LoopTime : 循环
    2. Root Transform Rotation : 动画播放是否对模型的旋转产生影响
    3. Root Transform Positive(Y) : 是否对y轴位置产生影响
    4. Root Transform Positive(XZ) : 是否对模型的X Z 轴位置产生影响

打上勾就是不影响

动画控制器 Animator Controller : 动画控制器

在工程右键,找到,之后把这个控制器可以拖入给Aniamtor组件
双击这个控制器

添加动画状态

  • 添加动画有两种方式
    1. 第一种在BaseLayer右键创建新的状态,然后自己在检视面板里改名字,添加手动拖入对应的状态
    2. 第二种是直接拖入动画到BaseLayer,unity会根据动画自己创建一个。
      1

创建状态转换

  • 点击状态右键->MakeTransition ,此时有条线,把这条连点在要连接的状态上,这两个状态就有联系了。

  • 这时右边有Layers 和 Parameters 两个参数,
    第一个Layers是新建一个状态层,
    第二个Parameter是设置状态转换的参数

  • 使用Parameter来设置他们状态之间的转换。
    2
    通过+号来添加
    Bool : 用来播放循环动画,条件进入,条件退出
    Trigger : 用来播放非循环动画,条件进入,自动退出
    int float 的条件为 等于这个值,小于这个值,不等于这个值 3中情况来进入进出
    在连线中添加Conditions, 设置属性,此时就可以通过更改参数的值来改变人物的状态
    这里写图片描述
    如当IdleToRun值为true时,则进入从普通状态进入奔跑状态

  • 用脚本通过按键控制属性的值

using UnityEngine;
using System.Collections;

public class PeopleAnimator : MonoBehaviour {

    private Animator _ani;

    void Awake(){
        _ani = GetComponent<Animator> ();
    }

    void Update(){
        if (Input.GetKey(KeyCode.A)) {
            _ani.SetBool ("IdleToRun", true);
        }

        if (Input.GetKeyUp (KeyCode.A)) {
            _ani.SetBool ("IdleToRun", false);
        }

        if (Input.GetKeyDown (KeyCode.Space)) {
            _ani.SetTrigger ("IdleToJump"); 
        }

        if (Input.GetKeyDown (KeyCode.Q)) {
            _ani.SetTrigger ("IdleToAttack");
        }
    }
}
  • Layers 的使用(了解即可)
    1. 创建new Layer
    2. 在New Layer中创建一个默认状态(对应了BaseLayer中的所有状态,所以不需要赋值动画)
    3. 在New Layer中创建Attack状态
    4. 设置NewLayer中的IdleToRun(和BaseLayer中的Idle进入Run为同一个条件)
    5. 在模型中创建一个Avator,设置他的Humanoid ,
    6. NewLayer中点击齿轮设置Weight值, 传给这个层的Mask新建的Avator。
    7. 此时就可以实现在原来状态的基础上进入攻击状态(如边跑边攻击)

然而这种边跑边攻击的状态很丑,一般不会使用这种方法来实现,而是在做一个动画。这里只是来说明new Layer的用处,即新建的Layer在上层BaseLayer的状态执行中,继续执行其他状态