2016-02-18 4 views
0

Я пишу простую игру в Unity 3D с C# в качестве языка сценариев. Мне нужно повернуть камеру на 180 градусов. Странным является первый звонок Quarterion.RotateTowards работает, а другой - нет, хотя он должен быть просто ссылкой на тот же объект.Проблема Strange RotateToward в Unity 3D

public class ChangeCamera : MonoBehaviour { 

Quaternion firstMinionCameraRot, secondMinionCameraRot; 

Quaternion newRot; 

// Use this for initialization 
void Start() { 
    Quaternion firstMinionCameraRot = new Quaternion(0.0f, 1.0f, -0.3f, 0.0f); 
    Quaternion secondMinionCameraRot = new Quaternion(-0.3f, 0.0f, 0.0f, -1.0f); 
} 

// Update is called once per frame 
void Update() { 

    newRot = this.transform.rotation; 

    // This one works 
    newRot = Quaternion.RotateTowards(newRot, new Quaternion(-0.3f, 0.0f, 0.0f, -1.0f), 0.05f * Time.deltaTime); 
    // This one doesn't 
    newRot = Quaternion.RotateTowards(newRot, secondMinionCameraRot, 50.0f * Time.deltaTime); 

    newRot = this.transform.rotation; 
} 

EDIT: Я делаю окончательное назначение newRot = this.transform.rotation; Я пропустил эту строку при подготовке фрагмента кода. Когда я использую второй вариант (где Quaterion был инициализирован в начале, исключение не выбрасывается, оно просто не выполняет никакого вращения).

+1

Что значит, что это не работает? Выбрасывает исключение? Когда ваш код написан, ничего не происходит с возвращаемым Quarterion newRot. Если вы хотите, чтобы метод RotateTowards выполнял поведение объекта, вы должны назначить возвращаемое значение transform.rotation. Другими словами, вам не хватает myGameObject.transform.rotation = newRot; – HBomb

+1

не используют кватернионы по какой-либо причине. просто используйте 'Rotate' (или, возможно,' RotateAround'), одна из самых смешных вещей о Unity заключается в том, что они упоминают «кватернионы» в руководстве. они абсолютно не относятся ко всему. если вы хотите что-то повернуть, используйте 'Rotate' – Fattie

+0

[Этот ответ] (http://gamedev.stackexchange.com/questions/115691/unity-camera-tilt/115693#115693) может помочь вам –

ответ

2

i) Вы не правильно инициализируете свои переменные. Вы скрываете две переменные, над которыми собираетесь работать.

Quaternion firstMinionCameraRot, secondMinionCameraRot; 
void Start() { 
    firstMinionCameraRot = new Quaternion(0.0f, 1.0f, -0.3f, 0.0f); 
    secondMinionCameraRot = new Quaternion(-0.3f, 0.0f, 0.0f, -1.0f); 
} 

ii) Как упоминалось в @HBomb, установите свое вращение на свой игровой объект.

void Update() { 
    transform.rotation = Quaternion.RotateTowards(transform.rotation, secondMinionCameraRot, 50.0f * Time.deltaTime); 
} 

ПРИМЕЧАНИЕ: Кватернион - это структура, поэтому он передается по значению. Вы не можете рассчитывать на работу с ссылкой на вращение вашего игрового объекта, как вы, кажется, делаете с переменной newRot.

+0

Как я уже упоминал, я возвращаю значение newRot (см. Обновленный код). Это было не так. –

+1

@ PawełJastrzębski okay, но вы все еще скрываете структуры Quaternion в Start. Вы не присваиваете новое значение глобальному полю, а локальной переменной метода Start. –

+0

@JerrySwitalski Второй элементMinionCameraRot определяется в теле класса. Метод start() вызывается в начале, поэтому он вызывает конструктор. Я не хочу скрывать значение. –