Как синхронизировать анимацию со звуком в минуту - PullRequest
0 голосов
/ 03 июля 2018

У меня звук в 145 ударов в минуту со смещением 137 миллисекунд, и я пытаюсь синхронизировать с ним действительно быструю анимацию ... Я пробовал так:

public class ActiveEpilepsy : MonoBehaviour {

    public GameObject Epilepsy; //GameObject that carries the animation
    float delay = 0.2f; //a fair time to disable the Epilepsy after the animation runs before active again

    void Start()
    {       
        InvokeRepeating("activeEpilepsy", 0.137f, 2.416f);  //second parameter is the offset of the music and the third is the bpm/60;
    }

    void activeEpilepsy()
    {
         while(delay >= 0)
         {
            Epilepsy.SetActive(true);
            delay -= Time.deltaTime;
         }

         Epilepsy.SetActive(false);

    }
}

, но вообще не активирует GameObject и возвращает КРАСИВУЮ АВАРИЮ в моем Unity ... Кроме того, люди говорят, что я не должен использовать строки для вызова методов (пример Invoke), так что не так с моим кодом и Как я могу сделать это работает без использования Invoke?

1 Ответ

0 голосов
/ 03 июля 2018

Проблема происходит здесь:

void activeEpilepsy()
{
     while(delay <= 0)
     {
        Epilepsy.SetActive(true);
        delay -= Time.deltaTime;
     }

     Epilepsy.SetActive(false);

}

У вас есть цикл while, который будет работать до тех пор, пока задержка меньше 0. И вы уменьшаете это значение внутри. Так что либо задержка больше 0, и цикл не входит. Или оно меньше или равно 0 и никогда не уйдет.

Поскольку задержка равна 0,2f, цикл бесполезен, и объект сразу отключается. Вам нужен сопрограмма или другой вызов там:

void activeEpilepsy()
{
     Epilepsy.SetActive(true);
     Invoke("Reset", this.delay);
}
void Reset(){Epilepsy.SetActive(false);}

Это проблема неактивного объекта. Сбой, вероятно, в другом месте, я не вижу ничего, что работает здесь неправильно.

Для метода в виде строки речь идет не о вызове со строкой, а о том, как он обрабатывается. Я думаю (будет подтверждено) Invoke использует отражение, поэтому он вызывает манифест сборки, чтобы выяснить, существует ли метод. Это будет медленно. Если Unity был достаточно умен, чтобы добавить метод в словарь, то вызов по строке практически не влияет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...