- Home /
Draw single circle using RotateAround with key held down
Hi everyone,
I'm trying to draw a single circle using RotateAround by holding down a key. However, I'm having trouble detecting when the circle is complete. I'd like to stop the object moving when one circle has been drawn but not sure of the condition to use to check this. Any suggestions would be great! Thanks
Note, the reason for the line:
m_startingAngle = 360 - m_startingAngle;
in Start() is so that the angle change is read as positive in the clockwise direction (-1) as well as a/clockwise (1). If there is a better way read the angles in both directions as positive from the starting angle then please suggest it.
Code is below:
public class RotateAroundTest : MonoBehaviour
{
public delegate void KeyPressedDelegate();
public static KeyPressedDelegate OnKeyPressedDelegateEvent;
[SerializeField]
private Transform m_pivotPoint;
[SerializeField]
private bool m_isCircleComplete = false;
[SerializeField]
private bool m_hasStarted = false;
[SerializeField]
private KeyCode m_key;
[SerializeField]
private int m_direction = 1;
[SerializeField]
private float m_speed = 1;
[SerializeField]
private float m_startingAngle = 0;
[SerializeField]
private float m_currentAngle = 0;
private void Start()
{
m_startingAngle = transform.transform.rotation.z;
if (m_direction == -1)
m_startingAngle = 360 - m_startingAngle;
OnKeyPressedDelegateEvent += DrawCircle;
}
private void Update()
{
if (Input.GetKey(m_key))
{
m_currentAngle = Mathf.Abs(transform.transform.eulerAngles.z - m_startingAngle);
OnKeyPressedDelegateEvent();
}
}
private void DrawCircle()
{
Debug.Log("transform.transform.rotation.z: " + transform.transform.eulerAngles.z);
Debug.Log("m_startingAngle: " + m_startingAngle);
Debug.Log("m_currentAngle: " + m_currentAngle);
transform.RotateAround(m_pivotPoint.position, Vector3.forward, Time.deltaTime * m_speed * m_direction);
}
Answer by HarshadK · Apr 19, 2017 at 05:56 AM
This is not exactly the best solution but it gets the job done. Check comments in the code for info on how it works.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class RotateAroundTest : MonoBehaviour
{
public delegate void KeyPressedDelegate();
public static KeyPressedDelegate OnKeyPressedDelegateEvent;
[SerializeField]
private Transform m_pivotPoint;
[SerializeField]
private bool m_isCircleComplete = false;
[SerializeField]
private bool m_hasStarted = false;
[SerializeField]
private KeyCode m_key;
[SerializeField]
private int m_direction = 1;
[SerializeField]
private float m_speed = 1;
[SerializeField]
private float m_startingAngle = 0;
[SerializeField]
private float m_currentAngle = 0;
// Anglular range between starting and current angle which will consider circle as complete.
private float m_CircleCompleteRange = 2f;
private void Start()
{
m_startingAngle = transform.transform.rotation.z;
if (m_direction == -1)
m_startingAngle = 360 - m_startingAngle;
OnKeyPressedDelegateEvent += DrawCircle;
}
private void Update()
{
if (Input.GetKey(m_key))
{
// Update only if circle is not complete.
if (!m_isCircleComplete) {
m_currentAngle = Mathf.Abs (transform.transform.eulerAngles.z - m_startingAngle);
OnKeyPressedDelegateEvent ();
}
}
}
private void DrawCircle()
{
Debug.Log("transform.transform.rotation.z: " + transform.transform.eulerAngles.z);
Debug.Log("m_startingAngle: " + m_startingAngle);
Debug.Log("m_currentAngle: " + m_currentAngle);
// We wait for angle difference to be more than 10 degrees here so that we do not consider circle being complete when it starts rotating.
if (Mathf.Abs (m_currentAngle - m_startingAngle) > 10) {
m_hasStarted = true;
}
transform.RotateAround(m_pivotPoint.position, Vector3.forward, Time.deltaTime * m_speed * m_direction);
// Circle completion check.
if (m_hasStarted && Mathf.Abs(m_currentAngle - m_startingAngle) <= m_CircleCompleteRange) {
m_isCircleComplete = true;
}
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220612120137im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Circling around a target while maintaining direction of facing 0 Answers
Rotation circle to stop at a certain angle 1 Answer
Rotating around a point in a circular motion depending on mouse position 1 Answer
C# RotateAround Half Circle Instead of Full Circle 0 Answers
Rolling Cube with Rigidbody? 5 Answers