我的声音为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中返回一个美丽的崩溃...而且,人们告诉我,我不应该使用字符串来调用方法(调用示例),所以我的代码和如何在不使用调用的情况下使其工作?
答案 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足够聪明,可以将方法添加到字典中,那么按字符串调用几乎没有影响。