游戏中,我们的人物在某些时候,可能在一个时间点在做两件事,这样就需要同时播放两个动画,但我们肯定不能简单将其叠加,比如移动着开枪、攻击、挥手等等,那么在Unity中我们应该怎样实现这样的功能呢?且听我一一道来。
现在我们要做一个移动中挥手的动画效果,当然,你也可以做成射击等,根据这个你得准备相应的动画片断哦。
上次动画融合树的工程还在吧?我们在此基础上,加上按下V键挥手的效果。
首先打开主角的动画状态机,在基本层BaseLayer下面添加一个层,取名叫做Wave吧,然后将层的权重Weight设置为1。
之后我们需要为下面的Mask属性创建一个Avatar Mask,创建方法是在Project面板中右键选择Create选项卡下的AvatarMask,我们给它命名为WaveMask,选中它,在Inspector面板下,点击Humanoid倒三角,打开遮罩状态,可以看到我们的小人儿默认是全绿的,也就是没有遮罩,这里,我们只需要留下挥手动作(我的动作只需要右手),因此点击小人儿身上需要遮住的部分如下图:
现在有了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 }