关于Timeline会自动修改文件的问题

发表于2019-05-06
评论0 4.3k浏览

经过和同事的一起测试,发现是由于 Blend Curves 是Auto的原因,如果改成Manully就不会出现这个问题 
因为Timeline内的Clip和Track都是拓展过后的,并没有研究原始文件是否会有这个问题。 

整个项目基于2017.4.16F1 

贴一下更改代码: 

1 创建Clip的时候 

自定义 Track代码: 

protected override Playable CreatePlayable(PlayableGraph graph, GameObject go, TimelineClip clip) 
{  
   // var _targetClip = clip.asset as (这里可以换成你自己拓展的Clip类); 

   // other code 

   // 这里需要手动设置一下,让Clip类知道TimelineClip的存在。目前没有找到如何获取Clip类的TimelineClip 
   // 如果有人能交流一下如何从原生代码中获取TimelineClip就好了 
   _targetClip.SetTimelineClip(clip);  

   if (clip.blendInCurveMode != TimelineClip.BlendCurveMode.Manual) 
   {  
       clip.mixInCurve = AnimationCurve.Linear(0, 0, 1, 1); 
    } 

   if (clip.blendOutCurveMode != TimelineClip.BlendCurveMode.Manual) 
   {  
       clip.mixOutCurve = AnimationCurve.Linear(0, 1, 1, 0); 
    } 

   // other code 

   return base.CreatePlayable(graph, go, clip); 




2 工具类代码 
遍历Timeline资源相关东西,获取其TimelineClip,并且重新设置,这里给出思路和关键代码,其余的需要自己实现 
和上面的代码是有关联的SetTimelineClip 和 GetTimelineClip 是我代码的关键,主要是要获取TimelineClip, 
如果有朋友知道如何从原生的代码中获取TimelineClip,欢迎交流! 

[MenuItem("GameTools/Timeline/SetBlendCurveToManully")] 
public static void SetBlendCurveToManully() 
{  
   try 
   {  
       // 这里加载Timeline资源,请自己写加载代码哦,这里是我已经封装好的类 
       //if (!TimeLineManager.Ins.Load(目标Timeline)) 
       //{  
       //    continue; 
       // } 

       // _targetDirector 这里是PlayableDirector 组件,请自行获得 

       foreach (var pair in _targetDirector.playableAsset.outputs) 
       {  
           // 这里得到的是轨道 
           var _tempAsset = pair.sourceObject as TrackAsset; 
           if (_tempAsset == null) 
           {  
               continue; 
            } 

           // 这里获取所有的片段 
           foreach (var _clipAsset in _tempAsset.GetClips()) 
           {  
               // 这里的是片段,用前面的SetTimelineClip的类 
               //var _targetClip = _clipAsset.asset as 你自己拓展的Clip类; 
               //if (_targetClip == null) 
               //{  
               //    continue; 
               // } 

               var _timelineClip = _targetClip.GetTimelineClip(); 
               if (_timelineClip == null) 
               {  
                   UnityEngine.Debug.LogError("无法获得TimelineClip,请检查!"); 

                   continue; 
                } 

               // 这里将不是手动的更换成手动,要不然Unity是有可能在运行Timeline的时候去自动更改文件 
               {  
                   if (_timelineClip.blendInCurveMode != TimelineClip.BlendCurveMode.Manual) 
                   {  
                       _timelineClip.blendInCurveMode = TimelineClip.BlendCurveMode.Manual; 

                       _timelineClip.mixInCurve = AnimationCurve.Linear(0, 0, 1, 1); 
                    } 

                   if (_timelineClip.blendOutCurveMode != TimelineClip.BlendCurveMode.Manual) 
                   {  
                       _timelineClip.blendOutCurveMode = TimelineClip.BlendCurveMode.Manual; 

                       _timelineClip.mixOutCurve = AnimationCurve.Linear(0, 1, 1, 0); 
                    } 
                } 
            } 
        } 

       // 保存文件,这里Unity有一些迷,如果你在修改拓展Timeline的时候只是修改了数值,那么不会触发Timeline的更改 
       // 因此需要 EditorSceneManager.MarkAllScenesDirty(); 才能触发保存 
       {  
           EditorSceneManager.MarkAllScenesDirty(); 

           if (_targetDirector != null) 
           {  
               EditorUtility.SetDirty(_targetDirector.playableAsset); 
            } 

           AssetDatabase.SaveAssets(); 
        } 

       // 清理Timeline,请自行清理一下 
    } 
   catch (Exception _e) 
   {  
       Debug.LogError(_e.ToString()); 
    } 
   finally 
   {  
        
    } 
}

  • 允许他人重新传播作品,但他人重新传播时必须在所使用作品的正文开头的显著位置,注明用户的姓名、来源及其采用的知识共享协议,并与该作品在磨坊上的原发地址建立链接
  • 可对作品重新编排、修改、节选或者以作品为基础进行创作和发布
  • 不可将作品进行商业性使用

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: