zoukankan      html  css  js  c++  java
  • [Unity动画]04.Avatar Mask

    参考链接:

    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,上半身播招手动画。

  • 相关阅读:
    探索c#之Async、Await剖析
    探索C#之布隆过滤器(Bloom filter)
    探索C#之虚拟桶分片
    刷新本地的DNS缓存数据
    php取整函数ceil,floor,round,intval函数的区别
    这样顶级人生规划 ,想不成功都难
    全篇干货,10分钟带你读透《参与感》
    iOS审核秘籍】提审资源检查大法
    php如何遍历多维的stdClass Object 对象,php的转换成数组的函数只能转换外面一丛数组
    RDS MySQL 连接数满情况的处理
  • 原文地址:https://www.cnblogs.com/lyh916/p/10447653.html
Copyright © 2011-2022 走看看