关于Timeline会自动修改文件的问题
经过和同事的一起测试,发现是由于 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
{
}
}