LinearMotion.cs 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using System;
  2. using UnityEngine;
  3. using Random = UnityEngine.Random;
  4. namespace Dustyroom {
  5. public class LinearMotion : MonoBehaviour {
  6. public enum TranslationMode {
  7. Off,
  8. XAxis,
  9. YAxis,
  10. ZAxis,
  11. Vector
  12. }
  13. public enum RotationMode {
  14. Off,
  15. XAxis,
  16. YAxis,
  17. ZAxis,
  18. Vector
  19. }
  20. public TranslationMode translationMode = TranslationMode.Off;
  21. public Vector3 translationVector = Vector3.forward;
  22. public float translationSpeed = 1.0f;
  23. public RotationMode rotationMode = RotationMode.Off;
  24. public Vector3 rotationAxis = Vector3.up;
  25. public float rotationSpeed = 50.0f;
  26. public bool useLocalCoordinate = true;
  27. public float translationAcceleration = 0f;
  28. public float rotationAcceleration = 0f;
  29. private Vector3 TranslationVector {
  30. get {
  31. switch (translationMode) {
  32. case TranslationMode.XAxis: return Vector3.right;
  33. case TranslationMode.YAxis: return Vector3.up;
  34. case TranslationMode.ZAxis: return Vector3.forward;
  35. case TranslationMode.Vector: return translationVector;
  36. case TranslationMode.Off:
  37. break;
  38. default:
  39. throw new ArgumentOutOfRangeException();
  40. }
  41. return Vector3.zero;
  42. }
  43. }
  44. Vector3 RotationVector {
  45. get {
  46. switch (rotationMode) {
  47. case RotationMode.XAxis: return Vector3.right;
  48. case RotationMode.YAxis: return Vector3.up;
  49. case RotationMode.ZAxis: return Vector3.forward;
  50. case RotationMode.Vector: return rotationAxis;
  51. case RotationMode.Off:
  52. break;
  53. default:
  54. throw new ArgumentOutOfRangeException();
  55. }
  56. return Vector3.zero;
  57. }
  58. }
  59. void Update() {
  60. if (translationMode != TranslationMode.Off) {
  61. Vector3 positionDelta = TranslationVector * translationSpeed * Time.deltaTime;
  62. if (useLocalCoordinate) {
  63. transform.localPosition += positionDelta;
  64. }
  65. else {
  66. transform.position += positionDelta;
  67. }
  68. }
  69. if (rotationMode == RotationMode.Off) return;
  70. Quaternion rotationDelta = Quaternion.AngleAxis(
  71. rotationSpeed * Time.deltaTime, RotationVector);
  72. if (useLocalCoordinate) {
  73. transform.localRotation = rotationDelta * transform.localRotation;
  74. }
  75. else {
  76. transform.rotation = rotationDelta * transform.rotation;
  77. }
  78. }
  79. private void FixedUpdate() {
  80. translationSpeed += translationAcceleration;
  81. rotationSpeed += rotationAcceleration;
  82. }
  83. }
  84. }