96 lines
3.1 KiB
C#
96 lines
3.1 KiB
C#
![]() |
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;
|
||
|
}
|
||
|
}
|
||
|
}
|