如何使动画与声音bpm同步

时间:2018-07-03 18:23:34

标签: c# unity3d

我的声音为145 BPM,偏移量为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中返回一个美丽的崩溃...而且,人们告诉我,我不应该使用字符串来调用方法(调用示例),所以我的代码和如何在不使用调用的情况下使其工作?

1 个答案:

答案 0 :(得分:1)

问题在这里发生

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足够聪明,可以将方法添加到字典中,那么按字符串调用几乎没有影响。