| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 | using System;using UnityEngine;using Random = UnityEngine.Random;namespace Dustyroom {    public class LinearMotion : MonoBehaviour {        public enum TranslationMode {            Off,            XAxis,            YAxis,            ZAxis,            Vector        }        public enum RotationMode {            Off,            XAxis,            YAxis,            ZAxis,            Vector        }        public TranslationMode translationMode = TranslationMode.Off;        public Vector3 translationVector = Vector3.forward;        public float translationSpeed = 1.0f;        public RotationMode rotationMode = RotationMode.Off;        public Vector3 rotationAxis = Vector3.up;        public float rotationSpeed = 50.0f;        public bool useLocalCoordinate = true;        public float translationAcceleration = 0f;        public float rotationAcceleration = 0f;        private Vector3 TranslationVector {            get {                switch (translationMode) {                    case TranslationMode.XAxis: return Vector3.right;                    case TranslationMode.YAxis: return Vector3.up;                    case TranslationMode.ZAxis: return Vector3.forward;                    case TranslationMode.Vector: return translationVector;                    case TranslationMode.Off:                        break;                    default:                        throw new ArgumentOutOfRangeException();                }                return Vector3.zero;            }        }        Vector3 RotationVector {            get {                switch (rotationMode) {                    case RotationMode.XAxis: return Vector3.right;                    case RotationMode.YAxis: return Vector3.up;                    case RotationMode.ZAxis: return Vector3.forward;                    case RotationMode.Vector: return rotationAxis;                    case RotationMode.Off:                        break;                    default:                        throw new ArgumentOutOfRangeException();                }                return Vector3.zero;            }        }        void Update() {            if (translationMode != TranslationMode.Off) {                Vector3 positionDelta = TranslationVector * translationSpeed * Time.deltaTime;                if (useLocalCoordinate) {                    transform.localPosition += positionDelta;                }                else {                    transform.position += positionDelta;                }            }            if (rotationMode == RotationMode.Off) return;            Quaternion rotationDelta = Quaternion.AngleAxis(                rotationSpeed * Time.deltaTime, RotationVector);            if (useLocalCoordinate) {                transform.localRotation = rotationDelta * transform.localRotation;            }            else {                transform.rotation = rotationDelta * transform.rotation;            }        }        private void FixedUpdate() {            translationSpeed += translationAcceleration;            rotationSpeed += rotationAcceleration;        }    }}
 |