83 lines
3.1 KiB
C#
83 lines
3.1 KiB
C#
using System.Linq;
|
|
using UnityEngine;
|
|
using UnityEngine.Timeline;
|
|
|
|
namespace UnityEditor.Timeline
|
|
{
|
|
static class AnimationOffsetMenu
|
|
{
|
|
public static GUIContent MatchPreviousMenuItem = EditorGUIUtility.TrTextContent("Match Offsets To Previous Clip");
|
|
public static GUIContent MatchNextMenuItem = EditorGUIUtility.TrTextContent("Match Offsets To Next Clip");
|
|
public static string MatchFieldsPrefix = "Match Offsets Fields/";
|
|
public static GUIContent ResetOffsetMenuItem = EditorGUIUtility.TrTextContent("Reset Offsets");
|
|
|
|
static bool EnforcePreviewMode(WindowState state)
|
|
{
|
|
state.previewMode = true; // try and set the preview mode
|
|
if (!state.previewMode)
|
|
{
|
|
Debug.LogError("Match clips cannot be completed because preview mode cannot be enabed");
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
internal static void MatchClipsToPrevious(WindowState state, TimelineClip[] clips)
|
|
{
|
|
if (!EnforcePreviewMode(state))
|
|
return;
|
|
|
|
clips = clips.OrderBy(x => x.start).ToArray();
|
|
foreach (var clip in clips)
|
|
{
|
|
var sceneObject = TimelineUtility.GetSceneGameObject(state.editSequence.director, clip.parentTrack);
|
|
if (sceneObject != null)
|
|
{
|
|
TimelineUndo.PushUndo(clip.asset, "Match Clip");
|
|
TimelineAnimationUtilities.MatchPrevious(clip, sceneObject.transform, state.editSequence.director);
|
|
}
|
|
}
|
|
|
|
InspectorWindow.RepaintAllInspectors();
|
|
TimelineEditor.Refresh(RefreshReason.ContentsModified);
|
|
}
|
|
|
|
internal static void MatchClipsToNext(WindowState state, TimelineClip[] clips)
|
|
{
|
|
if (!EnforcePreviewMode(state))
|
|
return;
|
|
|
|
clips = clips.OrderByDescending(x => x.start).ToArray();
|
|
foreach (var clip in clips)
|
|
{
|
|
var sceneObject = TimelineUtility.GetSceneGameObject(state.editSequence.director, clip.parentTrack);
|
|
if (sceneObject != null)
|
|
{
|
|
TimelineUndo.PushUndo(clip.asset, "Match Clip");
|
|
TimelineAnimationUtilities.MatchNext(clip, sceneObject.transform, state.editSequence.director);
|
|
}
|
|
}
|
|
|
|
InspectorWindow.RepaintAllInspectors();
|
|
TimelineEditor.Refresh(RefreshReason.ContentsModified);
|
|
}
|
|
|
|
public static void ResetClipOffsets(WindowState state, TimelineClip[] clips)
|
|
{
|
|
foreach (var clip in clips)
|
|
{
|
|
if (clip.asset is AnimationPlayableAsset)
|
|
{
|
|
TimelineUndo.PushUndo(clip.asset, "Reset Offsets");
|
|
var playableAsset = (AnimationPlayableAsset)clip.asset;
|
|
playableAsset.ResetOffsets();
|
|
}
|
|
}
|
|
state.rebuildGraph = true;
|
|
|
|
InspectorWindow.RepaintAllInspectors();
|
|
TimelineEditor.Refresh(RefreshReason.SceneNeedsUpdate);
|
|
}
|
|
}
|
|
}
|