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); } }