OldBlueWater/BlueWater/Assets/FlatKit/Demos/Common/Scripts/Motion/LinearMotion.cs

96 lines
3.1 KiB
C#
Raw Normal View History

2023-08-04 16:02:49 +00:00
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;
}
}
}