AnimatorController动画遮罩

游戏中,我们的人物在某些时候,可能在一个时间点在做两件事,这样就需要同时播放两个动画,但我们肯定不能简单将其叠加,比如移动着开枪、攻击、挥手等等,那么在Unity中我们应该怎样实现这样的功能呢?且听我一一道来。

现在我们要做一个移动中挥手的动画效果,当然,你也可以做成射击等,根据这个你得准备相应的动画片断哦。

上次动画融合树的工程还在吧?我们在此基础上,加上按下V键挥手的效果。
首先打开主角的动画状态机,在基本层BaseLayer下面添加一个层,取名叫做Wave吧,然后将层的权重Weight设置为1。
之后我们需要为下面的Mask属性创建一个Avatar Mask,创建方法是在Project面板中右键选择Create选项卡下的AvatarMask,我们给它命名为WaveMask,选中它,在Inspector面板下,点击Humanoid倒三角,打开遮罩状态,可以看到我们的小人儿默认是全绿的,也就是没有遮罩,这里,我们只需要留下挥手动作(我的动作只需要右手),因此点击小人儿身上需要遮住的部分如下图:
QQ截图20151007174004
现在有了Mask,我们可以继续刚才的操作了,在动画层Wave中,将动画遮罩属性Mask指向我们刚才创建的AvatarMask。
遮罩层建好了,首先添加一个Trigger参数Wave,之后再添加动画状态,在Wave层下添加一个空状态并设置为默认状态,然后再把我们的挥手动画状态添加进来,设置默认状态到Wave状态过渡条件为Wave,Wave状态到默认状态为无条件。

最后打来我们之前的DearMove脚本,稍微加点料:

 1 using UnityEngine;
 2 using System.Collections;
 3 
 4 public class DearMove : MonoBehaviour
 5 {
 6     private Animator anim;   //动画状态机
 7     private int RunFloat;    //Run参数ID
 8     private int WaveTrigger; //Wave参数ID
 9     private float vertical;  //前进
10 
11     void Awake ()
12     {
13         anim = gameObject.GetComponent<Animator>();
14         RunFloat = Animator.StringToHash("Run");
15         WaveTrigger = Animator.StringToHash("Wave");
16     }
17     
18     void Update ()
19     {
20         //呼叫方向控制
21         vertical = Input.GetAxis("Vertical");
22         //根据前进控制,设置Run参数的值,
23         //后面两个参数可不加,这里是为了让从走到跑看得更明显
24         anim.SetFloat(RunFloat, vertical, 1f, Time.deltaTime);
25 
26         if (Input.GetKeyDown(KeyCode.V))
27         {
28             Debug.Log("wave");
29             anim.SetTrigger(WaveTrigger);
30         }
31     }
32 }

运行游戏,先让角色跑起来,然后按 V 键,我们的主角边跑边向我们挥手了哦!
QQ截图20151007192459

原文地址:https://www.cnblogs.com/zhenlong/p/4870981.html