61 lines
1.7 KiB
C#
61 lines
1.7 KiB
C#
using UnityEngine;
|
|
|
|
namespace ithappy
|
|
{
|
|
public class OscillatePosition : MonoBehaviour
|
|
{
|
|
public Vector3 moveAxis = Vector3.up;
|
|
public float moveDistance = 2f;
|
|
public float duration = 2f;
|
|
public bool useRandomDelay = false; // Toggle random delay
|
|
public float maxRandomDelay = 1f; // Maximum random delay
|
|
|
|
private Vector3 startPosition;
|
|
private float timeElapsed = 0f;
|
|
private bool isReversing = false;
|
|
private float randomDelay = 0f;
|
|
|
|
void Start()
|
|
{
|
|
startPosition = transform.position;
|
|
|
|
if (useRandomDelay)
|
|
{
|
|
randomDelay = Random.Range(0f, maxRandomDelay);
|
|
}
|
|
}
|
|
|
|
void Update()
|
|
{
|
|
if (timeElapsed < randomDelay)
|
|
{
|
|
timeElapsed += Time.deltaTime;
|
|
return;
|
|
}
|
|
|
|
float progress = (timeElapsed - randomDelay) / (duration / 2f);
|
|
progress = Mathf.Clamp01(progress);
|
|
|
|
progress = EaseInOut(progress);
|
|
|
|
float currentDistance = moveDistance * (isReversing ? (1 - progress) : progress);
|
|
Vector3 currentPosition = startPosition + moveAxis.normalized * currentDistance;
|
|
|
|
transform.position = currentPosition;
|
|
|
|
timeElapsed += Time.deltaTime;
|
|
|
|
if (timeElapsed >= duration / 2f + randomDelay)
|
|
{
|
|
timeElapsed = randomDelay;
|
|
isReversing = !isReversing;
|
|
}
|
|
}
|
|
|
|
private float EaseInOut(float t)
|
|
{
|
|
return t < 0.5f ? 4 * t * t * t : 1 - Mathf.Pow(-2 * t + 2, 3) / 2;
|
|
}
|
|
}
|
|
}
|