首页 > 其他分享 >Playable API - 简单的分层动画混合

Playable API - 简单的分层动画混合

时间:2022-12-18 15:13:26浏览次数:76  
标签:动画 SetInputWeight graph Create 分层 API Playable 播放

为什么要分层?

单个层,同时只能播放一个动画。如果角色想要同时2个不同的动画,那就需要2个层;想要3个不同的动画就要3个层,以此类推。

1) 不用分层的方法:比如,角色跑的时候,还要有笑或哭的表情;直接做2个动画,笑着跑和哭着跑;现在走的时候,也要有哭或笑的表情,再做2个动画,笑着走和哭着走。

如果后面表情增加到100个,那跑和走都得分别做100个动作。所以,这样的做法在动画少的情况下,能实现需求,但对于动画很多的情况就不够灵活了。

2) 用分层的方法:把跑或走放在一个层0,把表情放在另一个层1,然后层0可以播放1个动画,层1也可以播放1个动画,最后把这2个动画混合起来就行了。

 

思路:

AnimationLayerMixerPlayable创建了2个分层,分层0用AnimationMixerPlayable放了跑和走动画,分层1用AnimationMixerPlayable放了表情动画,

使用AnimationLayerMixerPlayable.SetInputWeight(layerIndex, 1)让分层0和分层1的动画都播放;

使用AnimationMixerPlayable.SetInputWeight(animIndex, 1)来切换播放的动画。

using UnityEngine;
using UnityEngine.Animations;
using UnityEngine.Playables;

public class LayerAnimMix : MonoBehaviour
{
    public AnimationClip[] runAnimClips;
    public AnimationClip[] faceAnimClips;
    public AvatarMask faceAvatarMask;

    private PlayableGraph _graph;
    private AnimationMixerPlayable _runAnimMixerPlayable;
    private int _runAnimPlayIndex;
    private AnimationMixerPlayable _faceAnimMixerPlayable;
    private int _faceAnimPlayIndex;

    void Start()
    {
        _graph = PlayableGraph.Create("ChanPlayableGraph");
        var animationOutputPlayable = AnimationPlayableOutput.Create(_graph, "AnimationOutput", GetComponent<Animator>()); //往graph添加output

        var layerMixerPlayable = AnimationLayerMixerPlayable.Create(_graph, 2); //创建分层: 跑和走1个层, 面部表情另一个层
        animationOutputPlayable.SetSourcePlayable(layerMixerPlayable);

        _runAnimMixerPlayable = AnimationMixerPlayable.Create(_graph, runAnimClips.Length);
        for (var i = 0; i < runAnimClips.Length; ++i)
        {
            var animClipPlayable = AnimationClipPlayable.Create(_graph, runAnimClips[i]);
            _graph.Connect(animClipPlayable, 0, _runAnimMixerPlayable, i);
        }
        _runAnimMixerPlayable.SetInputWeight(0, 1);

        _faceAnimMixerPlayable = AnimationMixerPlayable.Create(_graph, faceAnimClips.Length);
        for (var i = 0; i < faceAnimClips.Length; ++i)
        {
            var animClipPlayable = AnimationClipPlayable.Create(_graph, faceAnimClips[i]);
            _graph.Connect(animClipPlayable, 0, _faceAnimMixerPlayable, i);
        }
        _faceAnimMixerPlayable.SetInputWeight(0, 1);

        _graph.Connect(_runAnimMixerPlayable, 0, layerMixerPlayable, 0);
        _graph.Connect(_faceAnimMixerPlayable, 0, layerMixerPlayable, 1);

        layerMixerPlayable.SetInputWeight(0, 1); //播放跑或走

        layerMixerPlayable.SetLayerMaskFromAvatarMask(1, faceAvatarMask); //面部动画播放时, 会用avatarMask屏蔽不相关的骨骼
        layerMixerPlayable.SetInputWeight(1, 1); //播放面部表情动画

        _graph.Play();
    }


    void Update()
    {
        if (Input.GetKeyDown(KeyCode.RightArrow)) //切换跑或走
        {
            if (_runAnimPlayIndex >= 0)
                _runAnimMixerPlayable.SetInputWeight(_runAnimPlayIndex, 0); //旧的停止

            _runAnimPlayIndex++;
            if (_runAnimPlayIndex >= runAnimClips.Length)
                _runAnimPlayIndex = 0;
            _runAnimMixerPlayable.SetInputWeight(_runAnimPlayIndex, 1); //播放新的
        }

        if (Input.GetKeyDown(KeyCode.DownArrow)) //切换面部表情动画
        {
            if (_faceAnimPlayIndex >= 0)
                _faceAnimMixerPlayable.SetInputWeight(_faceAnimPlayIndex, 0); //旧的停止

            _faceAnimPlayIndex++;
            if (_faceAnimPlayIndex >= faceAnimClips.Length)
                _faceAnimPlayIndex = 0;
            _faceAnimMixerPlayable.SetInputWeight(_faceAnimPlayIndex, 1); //播放新的
        }
    }

}

#

运行效果:按右箭头切换走和跑,按下箭头切换表情

PlayableGraph的可视化图形:

 

参考

[Unity ]Avatar Mask 动画混合_国家一级摸鱼选手的博客-CSDN博客_avater mask

Unity动画融合-Avatar Mask动画融合、Layers动画分层 - 简书 (jianshu.com)

Unity 动画系列六 BlendTree混合树 - 简书 (jianshu.com)

 

标签:动画,SetInputWeight,graph,Create,分层,API,Playable,播放
From: https://www.cnblogs.com/sailJs/p/16987754.html

相关文章

  • WebApi 路由机制剖析
    从网上看了WEBAPI理解感觉不错分享一下一、MVC和WebApi路由机制比较1、MVC里面的路由在MVC里面,默认路由机制是通过url路径去匹配对应的action方法,比如/Home/GetUser这个......
  • WebApi 接口参数不再困惑:传参详解
    从网上看了WEBAPI理解感觉是不错的分享一下前言:还记得刚使用WebApi那会儿,被它的传参机制折腾了好久,查阅了半天资料。如今,使用WebApi也有段时间了,今天就记录下API接口传参......
  • 微软出品自动化神器【Playwright+Java】系列(八) 之 使用 Playwright进行API接口测试
    前言我喜欢周末是因为,可以做一些我自己喜欢的事。比如我插上耳机,写点东西就能坐上一天,这也许算是属于我自己的一份静谧吧。想系统学习请参考:Playwright+Java入门使用Pl......
  • Eolink神技之二、API全生命周期管理
    Eolink神技之二、API全生命周期管理目录​​Eolink神技之二、API全生命周期管理​​​​Eolink全API全生命周期管理解决的问题​​​​演示过程​​​​一、创建项目文档​......
  • PPT 动画-树叶摆动
    插入树叶插入矩形,长宽放大1倍树叶和矩形组合......
  • Playable API - 动画混合
    涉及到动画混合常见例子a)根据行走速度慢慢从走变成跑b)角色在跑步时,同时播放向左或向右倾斜动画c)fps游戏中,角色边跑边攻击(需要动画分层+avatarMask)d) 状态机动画......
  • Playable API - 多个Animation Clip间切换播放
    #用到的脚本usingSystem.Collections.Generic;usingUnityEngine;usingUnityEngine.Animations;usingUnityEngine.Playables;publicclassPlayAnimClipOneByO......
  • Playable API - 简单播放Animation Clip
    用到的资源:GitHub-unity3d-jp/unitychan-crs:Unity-Chan"CandyRockStar"LiveDemo这边直接在他提供的Scene上修改PlayableAPI来播放AnimationClip的脚本:usin......
  • PlayableGraph可视化插件graph-visualizer
    插件下载地址:GitHub-Unity-Technologies/graph-visualizer:VisualizerforyourPlayablegraphs直接下载最新的源码: 将源码解压后放到Unity下: 后就可以通过Wi......
  • RapidOCR-完全开源免费并支持离线部署的多平台多语言OCR SDK
    RapidOCR(捷智OCR-信创级开源OCR-为世界内容安全贡献力量)商业支持提供信创平台多架构,包括Arm/X86/mips(龙芯)/RISC-V等信创CPU支持,同时兼容ONNXRuntim......