Можете ли вы установить максимальные углы для RotateAround в Unity?

Это не выполняет то, что я хочу на самом деле. Это в основном просто вращается вокруг пустого, пока не достигнет максимума. Когда я использую этот код, он движется нормально. "Максимальный" угол изменяется в зависимости от того, каким образом вы решили двигаться первым. Есть ли способ установить максимальное вращение вокруг угла?

 using UnityEngine;
using System.Collections;

public class CameraMovement : MonoBehaviour {
    Transform rotAround;
    public float maxRotation = 0;
    // Use this for initialization
    void Start () {
        rotAround = GameObject.Find ("CamRotation").GetComponent <Transform> ();
    }

    // Update is called once per frame
    void Update () {
        if (Input.GetKey (KeyCode.D) && maxRotation < 52.0f) {
            transform.RotateAround (rotAround.position, Vector3.down, 100 * Time.deltaTime);
            maxRotation += 1;
        }
        if (Input.GetKey (KeyCode.A) && maxRotation > -52.0f) {
            transform.RotateAround (rotAround.position, Vector3.up, 100 * Time.deltaTime);
            maxRotation -= 1;
        }
    }
}

2 ответа

Решение

Вы добавляете 1 к maxRotation каждый кадр. Вам нужно добавить Time.deltaTime вместо этого ваш maxRotation будет достигаться в разное время в зависимости от вашей частоты кадров. Простое изменение этого параметра должно привести к тому, что GameObject остановится под тем же углом, независимо от того, в какую сторону они повернуты

Это быстрый и простой способ сделать это. Другой - сделать математику. найти арктан (используя Mathf.Atan2) разницы rotateAroundtransform.position и запуск камеры transform.position а затем вычесть это из тока камеры transform.position минус rotateAround позиция даст вам текущий угол (пример ниже). Затем вы можете использовать это значение, чтобы проверить, должно ли вращение продолжаться. Смотрите этот ответ для получения дополнительной информации о том, как Atan2 работает.

Обратите внимание, что Mathf.Atan2 возвращает угол (в радианах) между вектором, переданным ему, и осью X (вы, вероятно, этого не хотите). Я думаю, чтобы найти угол между тремя векторами (что, я думаю, вы действительно хотите), вы должны будете взять разницу их соответствующих арктанов (я не проверял это, и это псевдокод для краткости). Вот так:

float angle = 
Atan2(cameraStartPos.y - rotatePointPos.y, cameraStartPos.x - rotatePointPos.x) -
Atan2(cameraCurrentPos.y - rotatePointPos.y, cameraStartPos.x - rotatePointPos.x);

Даже лучше, если единство сделает все это за вас! использование Vector3.Angle:

float angle = Vector3.Angle(rotateAround.position - cameraStart.position,  
                            rotateAround.position - cameraEnd.position));

Ваш окончательный код может выглядеть примерно так:

public class CameraMovement : MonoBehaviour {

    Transform rotAround;
    private Vector3 startPosition;
    public float maxRotation = 0; // set this to the maximum angle in degrees

    void Start () 
    {
        rotAround = GameObject.Find ("CamRotation").GetComponent <Transform> ();
        startPosition = transform.position;
    }


    void Update () 
    {

        float currentAngle = Vector3.Angle(rotAround.position - startPosition,
                                           rotAround.position - transform.position));

        if (Input.GetKey (KeyCode.D) && maxRotation < currentAngle) 
        {
            transform.RotateAround (rotAround.position, Vector3.down, 100 * Time.deltaTime);
        }

        if (Input.GetKey (KeyCode.A) && maxRotation < currentAngle) 
        {
            transform.RotateAround (rotAround.position, Vector3.up, 100 * Time.deltaTime);
        }
    }
}

Обратите внимание, что угол вернулся из Vector3.Angle "перевернется", когда он достигнет 180, так что вы можете установить максимальный угол на любое значение меньше 180, и он остановится в одной и той же точке с обеих сторон.

Почему бы вам не использовать Random.Range(min,max) для максимального и минимального диапазона, а затем назначить этот угол в повороте.

Другие вопросы по тегам