Pascal Serrarens 17741d862a First commit
2022-01-12 10:50:57 +01:00

140 lines
5.9 KiB
C#

using System.Collections;
using UnityEngine;
namespace Passer {
/// <summary>
/// Utility functions to move transformes in the world.
/// </summary>
public class Transportation : MonoBehaviour {
public float forwardSpeed = 1;
public float sidewardSpeed = 1;
public float rotationalSpeed = 60;
/// <summary>
/// Moves the transform along the local Z-axis with the indicated speed
/// </summary>
/// Should be called every frame for continuous movement.
/// <param name="z"></param>
public virtual void MoveForward(float z) {
transform.MoveForward(forwardSpeed * z * Time.deltaTime);
}
/// <summary>
/// Moves the transform along the local X-axis with the indicated speed
/// </summary>
/// Should be called every frame for continuous movement.
/// <param name="x"></param>
public virtual void MoveSideward(float x) {
transform.MoveSidewards(sidewardSpeed * x * Time.deltaTime);
}
/// <summary>
/// Rotates this transform with the indicated speed around the Y axis.
/// </summary>
/// Should be called every frame for continuous rotation.
/// <param name="angularSpeed">The speed in degrees per second</param>
public virtual void Rotate(float angularSpeed) {
transform.Turn(rotationalSpeed * angularSpeed * Time.deltaTime);
}
/// <summary>
/// Quickly moves this transform to the targetPosition
/// </summary>
/// This is a coroutine which will move the transform using DashCoroutine
/// It does not need to be called every frame.
/// <param name="targetPosition"></param>
public void Dash(Vector3 targetPosition) {
StartCoroutine(TransformMovements.DashCoroutine(transform, targetPosition));
}
/// <summary>
/// Teleport this transform to the targetPosition
/// </summary>
/// <param name="targetPosition">The target position</param>
public void Teleport(Vector3 targetPosition) {
TransformMovements.Teleport(this.transform, targetPosition);
}
/// <summary>
/// Teleport this transform forward by 1 meter
/// </summary>
public void Teleport() {
TransformMovements.Teleport(this.transform, this.transform.position + this.transform.forward);
}
}
public static class TransformMovements {
/// <summary>
/// Move the transform forward
/// </summary>
/// <param name="transform">The transform to move</param>
/// <param name="z">The distance to move. Negative is moving backwards</param>
public static void MoveForward(this Transform transform, float z) {
transform.Translate(Vector3.forward * z);
}
/// <summary>
/// Move the transform sidewards
/// </summary>
/// <param name="transform">The transform to move</param>
/// <param name="x">The distance to move. Positive is move to the right</param>
public static void MoveSidewards(this Transform transform, float x) {
transform.Translate(Vector3.right * x);
}
/// <summary>
/// Rotate the transform along the Y axis
/// </summary>
/// <param name="transform">The transform to turn</param>
/// <param name="angle">The angle in degrees. Positive is rotate to the right</param>
public static void Turn(this Transform transform, float angle) {
if (angle != 0)
transform.Rotate(0, angle, 0);
}
/// <summary>
/// Teleport the transform to the target position
/// </summary>
/// <param name="transform">The transform to teleport</param>
/// <param name="targetPosition">The target position to teleport to</param>
public static void Teleport(this Transform transform, Vector3 targetPosition) {
//Rigidbody transformRigidbody = transform.GetComponent<Rigidbody>();
//if (transformRigidbody != null)
// transformRigidbody.MovePosition(targetPosition);
//else
transform.position = targetPosition;
}
private const float minSpeedMps = 50.0f; // clamped to minimum speed 50m/s to avoid sickness
private const float normalLerpTime = 0.1f; // 100ms for every dash above minDistanceForNormalLerp
private const float minDistanceForNormalLerp = minSpeedMps * normalLerpTime; // default values give 5.0f;
private static float lerpTime = 5; //0.1f;
/// <summary>
/// Dashes the transform to the target position
/// This needs to be called using MonoBehaviour.StartCoroutine
/// </summary>
/// <param name="transform">The transform to move</param>
/// <param name="targetPosition">The target position of the dash movement</param>
/// <returns>Coroutine result</returns>
public static IEnumerator DashCoroutine(Transform transform, Vector3 targetPosition) {
float maxDistance = Vector3.Distance(transform.position, targetPosition - transform.forward * 0.5f);
if (maxDistance >= minDistanceForNormalLerp)
lerpTime = normalLerpTime; // fixed time for all bigger dashes
else
lerpTime = maxDistance / minSpeedMps; // clamped to speed for small dashes
Vector3 startPosition = transform.position;
float elapsedTime = 0;
float t = 0;
while (t < 1) {
transform.position = Vector3.Lerp(startPosition, targetPosition, t);
elapsedTime += Time.deltaTime;
t = elapsedTime / lerpTime;
yield return new WaitForEndOfFrame();
}
transform.position = targetPosition;
}
}
}