参考链接:
https://www.cnblogs.com/hammerc/p/4832637.html
Avatar Mask主要用于动画层融合。例如说,边跑边举起东西,这个实际上就是下半身播放跑步动画,上半身播放举起动画,所谓的Avatar Mask就是播放动画时让身体的某些部位不起作用(即不播放动画)
1.添加一个新的动画层
其中Empty是一个空的动画,同时添加一个Trigger型参数wave
TestAnimator.cs
1 using UnityEngine;
2
3 public class TestAnimator : MonoBehaviour {
4
5 //------------------------------------------外部
6 public float Move = 0;
7 public bool IsDying = false;
8
9 //------------------------------------------内部
10 private Animator animator;
11
12 //常数
13 private int baseLayerIndex;
14 private int idleStateHash;
15 private int runStateHash;
16 private int dyingStateHash;
17 private string movePara;
18 private string isDyingPara;
19 private string wavePara;
20
21 void Start ()
22 {
23 animator = GetComponent<Animator>();
24
25 baseLayerIndex = animator.GetLayerIndex("Base Layer");
26 idleStateHash = Animator.StringToHash("Base Layer.Idle");
27 runStateHash = Animator.StringToHash("Base Layer.Run");
28 dyingStateHash = Animator.StringToHash("Base Layer.Dying");
29 movePara = "move";
30 isDyingPara = "isDying";
31 wavePara = "wave";
32 }
33
34 void Update ()
35 {
36 //------------------------------------------播放动作
37 animator.SetFloat(movePara, Move);
38 if (IsDying)
39 {
40 animator.SetBool(isDyingPara, true);
41 IsDying = false;
42 }
43
44 //------------------------------------------动作恢复
45 AnimatorStateInfo stateInfo;
46 int fullPathHash;
47
48 //BaseLayer
49 stateInfo = animator.GetCurrentAnimatorStateInfo(baseLayerIndex);
50 if (!animator.IsInTransition(baseLayerIndex) && stateInfo.normalizedTime >= 1)
51 {
52 fullPathHash = stateInfo.fullPathHash;
53 if (fullPathHash == dyingStateHash)
54 {
55 animator.SetBool(isDyingPara, false);
56 }
57 }
58 }
59
60 public void SetDying(bool state)
61 {
62 if (animator)
63 {
64 animator.SetBool(isDyingPara, state);
65 }
66 }
67
68 public void TriggerWave()
69 {
70 if (animator)
71 {
72 animator.SetTrigger(wavePara);
73 }
74 }
75
76 public void ActionCallBack(string s)
77 {
78 if (s == "dyingStart")
79 {
80 Debug.Log("111");
81 }
82 else if (s == "dying")
83 {
84 Debug.LogWarning("222");
85 }
86 else if (s == "dyingEnd")
87 {
88 Debug.LogError("333");
89 }
90 }
91 }
NewBehaviourScript.cs
1 using UnityEngine;
2
3 public class NewBehaviourScript : MonoBehaviour {
4
5 public TestAnimator testAnimator;
6
7 void Update ()
8 {
9 if (Input.GetKeyDown(KeyCode.Q))
10 {
11 testAnimator.Move = 1;
12 }
13 if (Input.GetKeyDown(KeyCode.W))
14 {
15 testAnimator.TriggerWave();
16 }
17 }
18 }
效果如下。按下Q,播跑步动画,再按下W,覆盖为招手动画。可以试着将这两个层的位置换一下。可以看出,动画层越后优先级越高;同时还受动画层的权重影响。
2.创建一个Avatar Mask并添加到动画层中
如下图2,表示该动画层中只有上半身起作用
效果如下。按下Q,播跑步动画,再按下W,上半身播招手动画。