using UnityEngine;
public enum CircularDirection
{
Clockwise,
CounterClockwise
}
public class CircularMovement : MonoBehaviour
{
[SerializeField] private GameObject objectToMove;
[SerializeField] private bool reverseHalfway = false;
[SerializeField] CircularDirection circularDirection = CircularDirection.Clockwise;
[SerializeField, Range(0f, 20f)] private float startPosition = 0;
[SerializeField, Range(0f, 50f)] private float angularSpeed = 1;
[SerializeField, Range(0f, 50f)] private float rotationRadius = 20;
//Internal vars
private float _angle = 0f;
private float _posX, _posY = 0f;
private bool _flipDirection = false;
private Vector2 _objecToMovePosition;
private Transform _transform;
private void Awake()
{
_transform = transform;
}
private void Start()
{
if(startPosition > 0)
{
//Set a starting point on the radius
_posX = _transform.position.x + Mathf.Cos(startPosition) * rotationRadius;
_posY = _transform.position.y + Mathf.Sin(startPosition) * rotationRadius;
//Set the starting angle
_angle = startPosition;
//Assign the position to the moving object
_objecToMovePosition.Set(_posX, _posY);
objectToMove.transform.position = _objecToMovePosition;
}
}
void Update()
{
Move();
}
private void Move()
{
//Check if the moving object should reverse course back to the starting point
if (reverseHalfway)
{
if (Mathf.Abs(_angle) > 3.14)
_flipDirection = true;
else if (Mathf.Abs(_angle) <= 0.01f)
_flipDirection = false;
}
//Check which direction to move
if (circularDirection == CircularDirection.Clockwise)
_angle = _flipDirection ? _angle + Time.deltaTime * angularSpeed : _angle - Time.deltaTime * angularSpeed;
else
_angle = _flipDirection ? _angle - Time.deltaTime * angularSpeed : _angle + Time.deltaTime * angularSpeed;
//Calculate the angle of the x and y positions and include the rotation radius
_posX = _transform.position.x + Mathf.Cos(_angle) * rotationRadius;
_posY = _transform.position.y + Mathf.Sin(_angle) * rotationRadius;
//Assign the movment to the object that needs to be moved
_objecToMovePosition.Set(_posX, _posY);
objectToMove.transform.position = _objecToMovePosition;
}
#if UNITY_EDITOR
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.yellow;
Gizmos.DrawWireSphere(transform.position, rotationRadius);
Gizmos.color = Color.green;
float _posX = transform.position.x + Mathf.Cos(_angle) * rotationRadius;
float _posY = transform.position.y + Mathf.Sin(_angle) * rotationRadius;
Gizmos.DrawCube(new Vector2(_posX, _posY), new Vector3(3, 3, 3));
}
#endif
}






