Timeline动画分离轨道
首先在需要分离的Timeline动画节点的父节点 create empty 创建一个空物体,挂上PlayableDirector组件
选中需要分离的Timeline动画,按Ctrl+D创建一个副本
将副本动画放入组件中
右键有全动画组件
点击copybindinfo将动画信息拷贝
再选中刚刚创建的新动画,右键PlayableDirector组件
点击ParseBindInfo
这样就能获得一个相同动画,对象绑定是相同,数据是完全分离的另一个动画
最后再根据实际表演情况删除副本动画的对应节点,多种效果以此类推
public class PlayableDirectorMenu
{
[MenuItem("CONTEXT/PlayableDirector/CopyBindInfo")]
private static void CopyBindInfo()
{
var trans = Selection.activeTransform;
PlayableDirector director = trans.GetComponent<PlayableDirector>();
TimelineBinds binds = new TimelineBinds();
binds.Key = new string[director.playableAsset.outputs.Count()];
binds.TP = new string[binds.Key.Length];
binds.ID = new int[binds.Key.Length];
binds.Value = new string[binds.Key.Length];
int i = 0;
foreach (var binding in director.playableAsset.outputs)
{
Object obj = director.GetGenericBinding(binding.sourceObject);
if (obj)
{
binds.Key[i] = binding.sourceObject.name;
binds.TP[i] = binding.outputTargetType.Name;
binds.ID[i] = binding.sourceObject.GetInstanceID();
if (obj is GameObject gameObject)
{
binds.Value[i] = trans.root.GetHierarchical(gameObject.transform);
}
else if (obj is Component component)
{
binds.Value[i] = trans.root.GetHierarchical(component.transform);
}
}
i++;
}
GUIUtility.systemCopyBuffer = JsonUtility.ToJson(binds);
}
[MenuItem("CONTEXT/PlayableDirector/ParseBindInfo")]
private static void ParseBindInfo()
{
if (string.IsNullOrEmpty(GUIUtility.systemCopyBuffer))
{
Debug.LogError("粘贴值为空不能粘贴");
}
var trans = Selection.activeTransform;
PlayableDirector director = trans.GetComponent<PlayableDirector>();
try
{
var binds = JsonUtility.FromJson<TimelineBinds>(GUIUtility.systemCopyBuffer);
int i = 0;
foreach (var binding in director.playableAsset.outputs)
{
Object s = binding.sourceObject;
Debug.Log(binding.outputTargetType);
if (binding.outputTargetType == typeof(GameObject))
{
director.SetGenericBinding(s,director.transform.root.Find(binds.Value[i]).gameObject);
}
else if(binding.outputTargetType == typeof(Transform))
{
director.SetGenericBinding(s,director.transform.root.Find(binds.Value[i]));
}
else
{
director.SetGenericBinding(s,director.transform.root.Find(binds.Value[i]).GetComponent(binding.outputTargetType));
}
i++;
}
}
catch (ArgumentException argument)
{
Debug.LogError($"数据错误,请使用CopyBindInfo复制正确的数据:{argument}");
}
catch (Exception e)
{
Debug.LogError($"未处理错误:{e}");
}
}
}
public class TimelineBinds
{
public string[] Key;
public int[] ID;
public string[] TP;
public string[] Value;
}