using UnityEngine; namespace ithappy { public class OscillateRotation : MonoBehaviour { public Vector3 rotationAxis = Vector3.up; public float rotationAngle = 45f; public float duration = 2f; public bool useRandomDelay = false; // Toggle random delay public float maxRandomDelay = 1f; // Maximum random delay private Quaternion startRotation; private float timeElapsed = 0f; private bool isReversing = false; private float randomDelay = 0f; void Start() { startRotation = transform.rotation; 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 currentAngle = rotationAngle * (isReversing ? (1 - progress) : progress); Quaternion currentRotation = startRotation * Quaternion.AngleAxis(currentAngle, rotationAxis); transform.rotation = currentRotation; 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; } } }