140 lines
5.9 KiB
C#
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;
|
|
}
|
|
}
|
|
}
|