Timeline动画分离轨道

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值