internal static void DuplicateBindings(TrackAsset track, TrackAsset newTrack, PlayableDirector director) { var originalTracks = track.GetFlattenedChildTracks().Append(track); var newTracks = newTrack.GetFlattenedChildTracks().Append(newTrack); var toBind = new List <Tuple <TrackAsset, Object> >(); // Collect all track bindings to duplicate var originalIt = originalTracks.GetEnumerator(); var newIt = newTracks.GetEnumerator(); while (originalIt.MoveNext() && newIt.MoveNext()) { var binding = director.GetGenericBinding(originalIt.Current); if (binding != null) { toBind.Add(new Tuple <TrackAsset, Object>(newIt.Current, binding)); } } //Only create Director undo if there are bindings to duplicate if (toBind.Count > 0) { TimelineUndo.PushUndo(TimelineEditor.inspectedDirector, L10n.Tr("Duplicate")); } //Assign bindings for all tracks after undo. foreach (var binding in toBind) { TimelineEditor.inspectedDirector.SetGenericBinding(binding.Item1, binding.Item2); } }