自己修改过程
(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能正常跑,也不会报错