Unity Timeline 打包 AssetBundle 会出现有的动画不播放

自己修改过程

(1)

添加

public class PlayableBindingControl
    {
        public PlayableBindingControl()
        {
            _BindingDict = new Dictionary<string, PlayableBinding>();
        }

        public void Clear()
        {
            _PlayableDirector = null;
            _BindingDict.Clear();
        }

        public void Init()
        {

        }

        public void Dispose()
        {
            _PlayableDirector = null;
            _BindingDict.Clear();
            _BindingDict = null;
        }

        public void InitBind(PlayableDirector playableDirector)
        {
            _PlayableDirector = playableDirector;

            if (null != playableDirector &&
                null != playableDirector.playableAsset &&
                null != playableDirector.playableAsset.outputs)
            {
                foreach (PlayableBinding bind in playableDirector.playableAsset.outputs)
                {
                    if (!_BindingDict.ContainsKey(bind.streamName))
                    {
                        _BindingDict.Add(bind.streamName, bind);
                    }
                }
            }
        }

        public void BindObject(string bindKey, Object bindValue)
        {
            PlayableBinding playableBinding;

            if (null != _PlayableDirector &&
                _BindingDict.TryGetValue(bindKey, out playableBinding))
            {
                _PlayableDirector.SetGenericBinding(playableBinding.sourceObject, bindValue);

                _PlayableDirector.RebindPlayableGraphOutputs();
            }
        }

        protected PlayableDirector _PlayableDirector;
        protected Dictionary<string, PlayableBinding> _BindingDict;
    }

(2)

绑定

public class TestBindTimeline
{
    public TestBindTimeline()
    {
        
        _PlayableBindingControl = new PlayableBindingControl();
        _PlayableBindingControl.Init();
    }

    public void Dispose()
    {
        _PlayableBindingControl.Dispose();
        _PlayableBindingControl = null;
    }

    private bool _LoadPrefab()
    {
        _PlayableBindingControl.Clear();

        GameObject inst = GameObjectStatic.SyncInstanceObject<GameObject>("Path");

        if (null != inst)
        {
            PlayableDirector playableDirector = _ShotInst.GetComponentInChildren<PlayableDirector>();
            Transform trans = inst.transform.Find("VCameraRotate");
            if (null != trans)
            {
                Animator animator = inst.transform.Find("VCameraRotate").GetComponent<Animator>();
                _PlayableBindingControl.InitBind(playableDirector);
                _PlayableBindingControl.BindObject("Animation Track", animator);
            }
        }
    }
}

(3)

修改 link.xml 文件

link.xml

<linker>
    <assembly fullname="UnityEngine">
        <type fullname="UnityEngine.Rendering.SortingGroup" preserve="all"/>
        <type fullname="UnityEngine.TrailRenderer" preserve="all"/>
        <type fullname="UnityEngine.SpriteRenderer" preserve="all"/>
    </assembly>
    <assembly fullname="UnityEngine.Timeline">
        <type fullname="UnityEngine.Timeline.*" preserve="all"/>
    </assembly>
    <assembly fullname="Cinemachine">
        <type fullname="Cinemachine.*" preserve="all"/>
    </assembly>
</linker>

(4)

Timeline 制作过程

(4.1)

把timeline要用到的GameObject做成一个预设,具体怎么制作 timeline ,参考

Unity TimeLine丨A1.创建TimeLine、Animation Track,Extrapolation属性讲解

https://blog.csdn.net/weixin_38239050/article/details/79887303

(4.2)

加载 Prefab 后动态添加 PlayableDirector,自己测试下来这个不是必须的,可以直接拖动 PlayableDirector 到 Prefab 上面

(4.3)

动态加载 timeline 资源,感觉这个也不是必须的,可以直接拖放到 PlayableDirector

(4.4)

动态给 Timeline 绑定的属性赋值,这个是必须要做的,例如 Animation Track 必须动态给绑定赋值

_PlayableDirector.SetGenericBinding(playableBinding.sourceObject, bindValue);

(4.5)

添加被 strip 的代码,timeline 和 cinemachine,这个是必须要添加的

link.xml

<linker>
    <assembly fullname="UnityEngine">
        <type fullname="UnityEngine.Rendering.SortingGroup" preserve="all"/>
        <type fullname="UnityEngine.TrailRenderer" preserve="all"/>
        <type fullname="UnityEngine.SpriteRenderer" preserve="all"/>
    </assembly>
    <assembly fullname="UnityEngine.Timeline">
        <type fullname="UnityEngine.Timeline.*" preserve="all"/>
    </assembly>
    <assembly fullname="Cinemachine">
        <type fullname="Cinemachine.*" preserve="all"/>
    </assembly>
</linker>

参考:

脚本 Unity2017中TimeLine中有PlayableAsset可以通过Assetbundle加载吗?

http://www.manew.com/thread-135019-1-1.html

加载带有PlaybleTrack的Timeline之后一直报错:Assertion failed: Assertion failed on expression: 'pred(*previous, *i)',并且,PlatableTrack中上关联的物体都错乱了?

我解决这个问题了,把timeline要用到的GameObject做成一个预设,加载后动态添加PlayableDirector,然后依次给每个clip赋值就行了,timeline能正常跑,也不会报错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值