FTransformTrack.cs 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using UnityEngine;
  2. using System.Collections.Generic;
  3. namespace Flux
  4. {
  5. public class FTransformTrack : FTrack {
  6. // store transform snapshots in <sequence, <transform, snapshot>>
  7. private static Dictionary<FSequence, Dictionary<Transform, TransformSnapshot>> _snapshots = new Dictionary<FSequence, Dictionary<Transform, TransformSnapshot>>();
  8. public static TransformSnapshot GetSnapshot( FSequence sequence, Transform transform )
  9. {
  10. if( transform == null )
  11. return null;
  12. Dictionary<Transform, TransformSnapshot> sequenceSnapshots = null;
  13. if( !_snapshots.TryGetValue(sequence, out sequenceSnapshots) )
  14. {
  15. sequenceSnapshots = new Dictionary<Transform, TransformSnapshot>();
  16. _snapshots.Add( sequence, sequenceSnapshots );
  17. }
  18. TransformSnapshot result = null;
  19. if( !sequenceSnapshots.TryGetValue(transform, out result) )
  20. {
  21. result = new TransformSnapshot(transform);
  22. sequenceSnapshots.Add( transform, result );
  23. }
  24. return result;
  25. }
  26. protected TransformSnapshot _snapshot = null;
  27. public TransformSnapshot Snapshot { get { return _snapshot; } }
  28. public override void Init()
  29. {
  30. base.Init();
  31. _snapshot = GetSnapshot(Sequence, Owner);
  32. }
  33. public override void Stop()
  34. {
  35. base.Stop();
  36. if( _snapshot != null )
  37. _snapshot.Restore();
  38. }
  39. }
  40. public class TransformSnapshot
  41. {
  42. public Transform Transform { get; private set; }
  43. public Transform Parent { get; private set; }
  44. public Vector3 LocalPosition { get; private set; }
  45. public Quaternion LocalRotation { get; private set; }
  46. public Vector3 LocalScale { get; private set; }
  47. public TransformSnapshot[] ChildrenSnapshots = null;
  48. public TransformSnapshot( Transform transform, bool recursive = false )
  49. {
  50. Transform = transform;
  51. Parent = Transform.parent;
  52. LocalPosition = Transform.localPosition;
  53. LocalRotation = Transform.localRotation;
  54. LocalScale = Transform.localScale;
  55. if( recursive )
  56. {
  57. TakeChildSnapshots();
  58. }
  59. }
  60. public void TakeChildSnapshots()
  61. {
  62. if( ChildrenSnapshots != null )
  63. return;
  64. ChildrenSnapshots = new TransformSnapshot[Transform.childCount];
  65. for( int i = 0; i != ChildrenSnapshots.Length; ++i )
  66. {
  67. ChildrenSnapshots[i] = new TransformSnapshot( Transform.GetChild(i), true );
  68. }
  69. }
  70. public void Restore()
  71. {
  72. if( Parent != Transform.parent )
  73. Transform.SetParent( Parent );
  74. Transform.localPosition = LocalPosition;
  75. Transform.localRotation = LocalRotation;
  76. Transform.localScale = LocalScale;
  77. if( ChildrenSnapshots != null )
  78. {
  79. for( int i = 0; i != ChildrenSnapshots.Length; ++i )
  80. ChildrenSnapshots[i].Restore();
  81. }
  82. }
  83. }
  84. }