2015-12-04 6 views
1

У меня есть учебная сцена, и в конце у меня есть измененный куб с текстурой двери на нем. Я установил код для проверки на наличие столкновений и поворота его оси, но после столкновения дверь вращается навсегда. Внутри моего void OnCollisionEnter(), у меня есть, если заявление:Проверка поворота двери

if (pivot.transform.rotation.eulerAngles.y == 83) 
{ 
    pivot.GetComponent<Rigidbody>().freezeRotation = true; 
} 

, но это не похоже на работу. Может ли кто-нибудь просветить меня по этому поводу? Как я не могу найти ответ.

Вот весь сценарий:

using UnityEngine; 
using System.Collections; 
using UnityEngine.UI; 

public class DoorOpen : MonoBehaviour { 

    public GameObject pivot; 


    void Start() { 

    } 

    void Update() { 

    } 

    void OnCollisionEnter(Collision door) 
    { 

     if (door.collider.tag == "Door") 
     { 
      StartCoroutine(openDoor()); 
     } 

    } 
    IEnumerator openDoor() { 

     float angle=0; 
     for(int i=0 ;i<=6;i++){ 
      angle+= i * 10; 
      pivot.transform.eulerAngles = new Vector3(0f,83f,0f); 
      yield return new WaitForSeconds(0.4f); 
     } 

    } 
} 
+0

Это может быть полезно для вас, чтобы включить больше функции OnCollisionEnter(), так как проблема, скорее всего, есть, и, возможно, некоторый код, чтобы показать, как OnCollisionEnter() называется в случае, если проблема действительно существует. Мое предположение, хотя оно полностью умозрительно, но не более контекста, заключается в том, что pivot.transform.rotation.eulerAngles.y никогда не является 83, когда эта проверка происходит, и переходит от значения ниже 83 к значению выше 83, и поэтому никогда замораживает поворот –

+0

@KevinWells Ах, я не знал, что eulerAngles не так точно. Должен ли я вместо этого делать что-то вроде '> 77 && <87'? –

+0

Теперь, когда у меня больше контекста, я думаю, что знаю, что происходит. Вы умножаете 83 градуса на Time.deltaTime, что может означать, что он будет вращаться намного больше или меньше 83 градусов. Почему вы делаете это умножение? –

ответ

1

Я рекомендую вам, что вы можете использовать метки, чтобы контролировать вашу игру лучше. И вместо прямого назначения угла вы можете создать приятную анимацию двери. с использованием «==» оператор кажется ненужным

void OnCollisionEnter(Collision door) 
{ 

    if (door.collider.tag == "desiredTag") 
    { 
     StartCoroutine(openDoor()); 
    } 

} 
IEnumerator openDoor() { 

    float angle=0; 
    for(int i=1 ;i<=7;i++){ 
    angle = i * 10; 
    pivot.transform.eulerAngles = new Vector3(0f,angle,0f); 
    yield return new WaitForSeconds(0.4f); 
    } 

} 
+0

Я получаю error 'error CS1612: Невозможно изменить возвращаемое значение типа значения« UnityEngine.Transform.rotation ». Рассмотрим сохранение значения во временной переменной' на 'pivot.transform.rotation.eulerAngles = new Vector3 (0f, angle, 0f) ; 'строка. Идея, почему это может быть? –

+0

Edited.i не знаю, как используется transform.rotation. Я обычно использую transform.eulerangle. –

+0

Он по-прежнему не останавливает вращение, он просто продолжает двигаться –

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