Как продолжать вращать GameObject при взгляде? - PullRequest
0 голосов
/ 16 ноября 2018

Я застрял с небольшой проблемой.

Я создал 3D-куб и настроил GoogleVR SDK, чтобы использовать триггер событий, когда средняя точка VR-экрана входит в куб. Когда это происходит, мой пользовательский метод LookAtCube() срабатывает.

Я хочу, чтобы куб продолжал вращаться. Я могу вращаться с transform.Rotate-function, но проблема в том, что он вращается только для 1 игрового тика (я думаю), потому что событие, на которое я запускаю, - это «Pointer Enter».


Мой вопрос:

Есть ли событие, которое вы можете вызвать, которое продолжает выполнять данный метод, находясь на расстоянии коллайдера? (например, если смотреть на куб, он должен вращаться, а если не смотреть, он не должен вращаться).

Я пытался исправить это с помощью time (true) -loop, но игра просто вылетает.

Например, на ПК / автономном приложении вы можете просто использовать закрытый метод OnMouseOver (). Я хотел бы этого, но затем с фокусом (средней точкой) экрана VR.

Это то, что я пробовал до сих пор (2 примера):

Первый пример: он просто немного вращается и останавливается (поэтому я предполагаю, что он вращается в течение 1 игрового такта с заданной скоростью).

using UnityEngine;


public class MoveCube : MonoBehaviour
{
    float rotateSpeed = 0.5f;

    // Use this for initialization
    void Start()
    {
    }

    public void LookAtCube()
    {
        transform.Rotate(new Vector3(rotateSpeed, rotateSpeed, rotateSpeed));
    }

    public void LookOutCube()
    {
        transform.Rotate(new Vector3(0, 0, 0));
    }
}

Второй пример: Я использовал логическое значение, которое я установил в true / false соответственно при входе / выходе из куба. Затем цикл while должен продолжать вращаться, но игра вылетает (не вижу сообщения об ошибке, поскольку он полностью вылетает, но я предполагаю, что это переполнение).

using UnityEngine;


public class MoveCube : MonoBehaviour
{
    float rotateSpeed = 0.5f;
    Boolean hoverState = false;

    // Use this for initialization
    void Start()
    {
    }

    public void LookAtCube()
    {  
        while(hoverState == true){
             transform.Rotate(new Vector3(rotateSpeed, rotateSpeed, rotateSpeed));
        }
    }

    public void LookOutCube()
    {
        hoverState = false;
        transform.Rotate(new Vector3(0, 0, 0));
    }
}

Есть идеи, как правильно его реализовать? Заранее спасибо!

1 Ответ

0 голосов
/ 16 ноября 2018

Здесь вы попадете в бесконечный цикл:

while(hoverState == true)
{
   transform.Rotate(new Vector3(rotateSpeed, rotateSpeed, rotateSpeed));
}

Это потому, что вы не ждете фрейма, и другие сценарии не получат шанса на запуск.

Вам необходимо использовать функцию Update, так как она запускает каждый кадр. Установите hoverState в true событие «Pointer Enter» и false в событии «Pointer Exit», затем используйте hoverState в функции Update, чтобы определить, когда вращать GameObject.

float rotateSpeed = 0.5f;
bool hoverState = false;


public void LookAtCube()
{
    hoverState = true;
}

public void LookOutCube()
{
    hoverState = false;
}

void Update()
{
    if (hoverState)
        transform.Rotate(new Vector3(rotateSpeed, rotateSpeed, rotateSpeed));
}
...