Unity 2D - Поворот объекта и ограничение поворота
Я пытаюсь сделать вращающуюся пушку, которая вращается вперед и назад. Я хочу ограничить вращение от -55 до 55 (я имею в виду transform.position.z), но я не могу заставить его работать.
На данный момент мой код:
public class Cannon : MonoBehaviour
{
bool hit = false;
void Update ()
{
float angle = transform.rotation.z;
if (angle > -55 & angle < 55 & !hit)
{
transform.Rotate(Vector3.back * Time.deltaTime);
}
if (angle <= -55)
{
transform.Rotate(Vector3.back * Time.deltaTime);
hit = true;
}
if (angle >= 55)
{
transform.Rotate(Vector3.forward * Time.deltaTime);
hit = true;
}
}
}
Единственная мысль, которая работает, - это первое вращение, которое я сделал, чтобы объект начал вращаться, поэтому он просто вращается назад и не останавливается, кажется, он игнорирует "угол"
Я также попытался поместить последние 2 оператора If внутрь первого, но все еще не работает.
Я хочу заставить его вращаться, пока он не достигнет -55, затем начать вращать, пока он не достигнет +55, и повторить это.
1 ответ
Первое, что вам нужно сделать, это использовать Euler Angles, а не Quarternions, чтобы найти поворот в градусах.
Затем, поскольку он не сообщает отрицательные углы, а скорее углы от 0 до 360, вам нужно будет вычесть 360 всякий раз, когда больше 180, чтобы получить эквивалент отрицательного угла.
Оттуда вы можете применить свой тест, чтобы держать его в границах:
public class Cannon : MonoBehaviour {
public float direction = 1f; // initial direction
public float speed = 20f; // speed of rotation
void Update ()
{
float angle = transform.eulerAngles.z;
if (angle > 180f) angle -= 360f;
if ((angle < -55f) || (angle > 55f)) direction *= -1f; // reverse direction (toggles between 1 & -1)
transform.Rotate (0, 0, speed * direction * Time.deltaTime);
}
}