AddTorque.cs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #if CHRONOS_PLAYMAKER
  2. using HutongGames.PlayMaker;
  3. using UnityEngine;
  4. namespace Chronos.PlayMaker
  5. {
  6. [ActionCategory("Physics (Chronos)")]
  7. [HutongGames.PlayMaker.Tooltip("Adds torque (rotational force) to a Game Object.")]
  8. public class AddTorque : ChronosComponentAction<Timeline>
  9. {
  10. [RequiredField]
  11. [CheckForComponent(typeof(Timeline))]
  12. [HutongGames.PlayMaker.Tooltip("The GameObject to add torque to.")]
  13. public FsmOwnerDefault gameObject;
  14. [UIHint(UIHint.Variable)]
  15. [HutongGames.PlayMaker.Tooltip("A Vector3 torque. Optionally override any axis with the X, Y, Z parameters.")]
  16. public
  17. FsmVector3 vector;
  18. [HutongGames.PlayMaker.Tooltip("Torque around the X axis. To leave unchanged, set to 'None'.")]
  19. public FsmFloat x;
  20. [HutongGames.PlayMaker.Tooltip("Torque around the Y axis. To leave unchanged, set to 'None'.")]
  21. public FsmFloat y;
  22. [HutongGames.PlayMaker.Tooltip("Torque around the Z axis. To leave unchanged, set to 'None'.")]
  23. public FsmFloat z;
  24. [HutongGames.PlayMaker.Tooltip("Apply the force in world or local space.")]
  25. public Space space;
  26. [HutongGames.PlayMaker.Tooltip("The type of force to apply. See Unity Physics docs.")]
  27. public ForceMode forceMode;
  28. [HutongGames.PlayMaker.Tooltip("Repeat every frame while the state is active.")]
  29. public bool everyFrame;
  30. public override void Reset()
  31. {
  32. gameObject = null;
  33. // default axis to variable dropdown with None selected.
  34. x = new FsmFloat { UseVariable = true };
  35. y = new FsmFloat { UseVariable = true };
  36. z = new FsmFloat { UseVariable = true };
  37. space = Space.World;
  38. forceMode = ForceMode.Force;
  39. everyFrame = false;
  40. }
  41. public override void Awake()
  42. {
  43. Fsm.HandleFixedUpdate = true;
  44. }
  45. public override void OnEnter()
  46. {
  47. DoAddTorque();
  48. if (!everyFrame)
  49. {
  50. Finish();
  51. }
  52. }
  53. public override void OnFixedUpdate()
  54. {
  55. DoAddTorque();
  56. }
  57. private void DoAddTorque()
  58. {
  59. var go = Fsm.GetOwnerDefaultTarget(gameObject);
  60. if (!UpdateCache(go))
  61. {
  62. return;
  63. }
  64. var torque = vector.IsNone ? new Vector3(x.Value, y.Value, z.Value) : vector.Value;
  65. // override any axis
  66. if (!x.IsNone) torque.x = x.Value;
  67. if (!y.IsNone) torque.y = y.Value;
  68. if (!z.IsNone) torque.z = z.Value;
  69. // apply
  70. if (space == Space.World)
  71. {
  72. timeline.rigidbody.AddTorque(torque, forceMode);
  73. }
  74. else
  75. {
  76. timeline.rigidbody.AddRelativeTorque(torque, forceMode);
  77. }
  78. }
  79. }
  80. }
  81. #endif