2016-05-07 4 views
0

Это не значит, что я действительно хочу. Он в основном просто вращается вокруг пустого, пока он не достигнет максимума. Когда я использую этот код, он отлично переносится. «Максимальный» угол изменяется в зависимости от того, каким способом вы решите двигаться первым. Есть ли способ установить максимальный поворот вокруг угла?Можете ли вы установить максимальные углы для 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; 
     } 
    } 
} 
+0

100 * Time.deltaTime не равно 1, это неправильное предположение. Infact, вы никогда не сможете сказать, что Time.deltaTime будет следующим фреймом, но его примерно 1/60, поэтому 0,016667. – yes

+0

@MikeSmith вы никогда не должны рассчитывать на постоянство константы Time.deltaTime. Это просто время, прошедшее между текущим и последним кадрами. Это делает его полезным для регулирования расчетов с нерегулярной частотой кадров. –

+0

@yes Mm, извините, но я этого не сделал. Я думал, что это частота кадров, которая может варьироваться. Я использовал 100, потому что на моих оригинальных 50, движение камеры было слишком медленным. Если вы не комментируете кого-то другого. –

ответ

0

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

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

Обратите внимание, что Mathf.Atan2 возвращает угол (в радианах) между переданным им вектором и осью X (вы, вероятно, этого не хотите). Я думаю, что до find the angle between three vectors (который, как я думаю, вам нужен) вам придется принять различие в их соответствующих arctans (я не проверял это, и это псевдокод для краткости). Как так:

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, и оно будет остановлено в одной и той же точке с обеих сторон.

-1

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

+0

, хотя приведенный выше код в настоящее время, вероятно, показывает кажущееся случайным поведение, ОП не запрашивал случайные оценки, так как случайным образом поможет? – yes

+0

F/o reyan, Хорошая попытка ... – Gammer

Смежные вопросы