eye-therapy-2 / Assets / Scripts / Other / RotateAround.cs
RotateAround.cs
Raw
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using UnityEngine;

public class RotateAround : MonoBehaviour
{
    [SerializeField] private Transform rotationTrigger = null;
    [SerializeField] private Vector3 rotationPoint = Vector3.zero;
    [SerializeField][Tooltip("Rotate around Rotation Trigger transform. Overrides Rotation Point.")] private bool useTriggerAsRotationPoint = false;
    [SerializeField][Range(10f, 180f)] private float angleThreshold = 30f;
    [SerializeField] private float rotationSpeed = 20f;
    [SerializeField][Min(0)] private float rotationDelay = 1f;

    private Coroutine rotationRoutine = null;
    private bool isRotating = false;

    void Start()
    {
        if (rotationTrigger == null) this.enabled = false;
    }

    void Update()
    {
        if (rotationTrigger && !isRotating)
        {
            float angleDiff = GetAngleDifference();
            if (Mathf.Abs(angleDiff) >= angleThreshold)
            {
                if (rotationRoutine == null) rotationRoutine = StartCoroutine(AdjustRotation(angleDiff > 0));
            }
            else
            {
                if (rotationRoutine != null) StopCoroutine(rotationRoutine);
                rotationRoutine = null;
            }
        }
    }

    IEnumerator AdjustRotation(bool dir)
    {
        yield return new WaitForSeconds(rotationDelay);
        isRotating = true;
        float speedMultiplier = rotationSpeed;
        if (dir) speedMultiplier = -speedMultiplier;
        while (Mathf.Abs(GetAngleDifference()) > 0.5f)
        {
            if (useTriggerAsRotationPoint) rotationPoint = rotationTrigger.position;
            transform.RotateAround(rotationPoint, Vector3.up, speedMultiplier * Time.deltaTime);
            yield return null;
        }
        isRotating = false;
        rotationRoutine = null;
    }

    private float GetAngleDifference()
    {
        Vector2 nextForward = new Vector2(rotationTrigger.forward.x, rotationTrigger.forward.z);
        Vector2 currentForward = new Vector2(transform.position.x - rotationTrigger.position.x, transform.position.z - rotationTrigger.position.z);
        return Vector2.SignedAngle(currentForward, nextForward);
    }
}