暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

PreviewedBindings.cs 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using UnityEngine.Playables;
  5. using Object = UnityEngine.Object;
  6. namespace UnityEditor.Timeline
  7. {
  8. readonly struct PreviewedBindings<T> where T : Object
  9. {
  10. readonly IEnumerable<T> m_UniqueBindings;
  11. readonly IReadOnlyDictionary<Object, HashSet<T>> m_BindingsPerObject;
  12. PreviewedBindings(IEnumerable<T> uniqueBindings, IReadOnlyDictionary<Object, HashSet<T>> bindingsPerObject)
  13. {
  14. m_UniqueBindings = uniqueBindings;
  15. m_BindingsPerObject = bindingsPerObject;
  16. }
  17. public IEnumerable<T> GetUniqueBindings() => m_UniqueBindings ?? Enumerable.Empty<T>();
  18. public IEnumerable<T> GetBindingsForObject(Object track)
  19. {
  20. if (m_BindingsPerObject != null && m_BindingsPerObject.TryGetValue(track, out HashSet<T> bindings))
  21. return bindings;
  22. return Enumerable.Empty<T>();
  23. }
  24. public static PreviewedBindings<T> GetPreviewedBindings(IEnumerable<PlayableDirector> directors)
  25. {
  26. var uniqueBindings = new HashSet<T>();
  27. var bindingsPerTrack = new Dictionary<Object, HashSet<T>>();
  28. foreach (PlayableDirector director in directors)
  29. {
  30. if (director.playableAsset == null) continue;
  31. foreach (PlayableBinding output in director.playableAsset.outputs)
  32. {
  33. var binding = director.GetGenericBinding(output.sourceObject) as T;
  34. Add(output.sourceObject, binding, uniqueBindings, bindingsPerTrack);
  35. }
  36. }
  37. return new PreviewedBindings<T>(uniqueBindings, bindingsPerTrack);
  38. }
  39. static void Add(Object obj, T binding, HashSet<T> bindings, Dictionary<Object, HashSet<T>> bindingsPerObject)
  40. {
  41. if (binding == null)
  42. return;
  43. bindings.Add(binding);
  44. if (bindingsPerObject.TryGetValue(obj, out HashSet<T> objectBindings))
  45. objectBindings.Add(binding);
  46. else
  47. bindingsPerObject.Add(obj, new HashSet<T> { binding });
  48. }
  49. }
  50. }