using System; using UnityEngine; using UnityEngine.Timeline; using UnityEngine.Playables; namespace UnityEngine.Timeline { /// /// Extension methods for TrackAssets /// public static class TrackAssetExtensions { /// /// Gets the GroupTrack this track belongs to. /// /// The track asset to find the group of /// The parent GroupTrack or null if the Track is an override track, or root track. public static GroupTrack GetGroup(this TrackAsset asset) { if (asset == null) return null; return asset.parent as GroupTrack; } /// /// Assigns the track to the specified group track. /// /// The track to assign. /// The GroupTrack to assign the track to. /// /// Does not support assigning to a group in a different timeline. /// public static void SetGroup(this TrackAsset asset, GroupTrack group) { const string undoString = "Reparent"; if (asset == null || asset == group || asset.parent == group) return; if (group != null && asset.timelineAsset != group.timelineAsset) throw new InvalidOperationException("Cannot assign to a group in a different timeline"); TimelineUndo.PushUndo(asset, undoString); var timeline = asset.timelineAsset; var parentTrack = asset.parent as TrackAsset; var parentTimeline = asset.parent as TimelineAsset; if (parentTrack != null || parentTimeline != null) { TimelineUndo.PushUndo(asset.parent, undoString); if (parentTimeline != null) { parentTimeline.RemoveTrack(asset); } else { parentTrack.RemoveSubTrack(asset); } } if (group == null) { TimelineUndo.PushUndo(timeline, undoString); asset.parent = asset.timelineAsset; timeline.AddTrackInternal(asset); } else { TimelineUndo.PushUndo(group, undoString); group.AddChild(asset); } } } }