我试图在实例化时通过代码将UnityEvent侦听器添加到另一个脚本中。但是,永远不会调用回调方法。
我在脚本UIFader中放入了一条调试语句,并且打印输出显示UnityEvent不为null,因此它可以看到侦听器。但是没有调用UIManager中的回调方法。
UIManager.cs
public void SpawnInformationWindow()
{
if (canvas == null || InformationWindowPrefab == null)
{
return;
}
GameObject informationWindow = Instantiate(InformationWindowPrefab, canvas, false);
informationWindow.GetComponent<UIFader>().OnFadeOutComplete.AddListener(SpawnTermsOfUseWindow);
}
public void SpawnTermsOfUseWindow()
{
Debug.Log("THIS RAN!");
if (canvas == null || TermsOfUseWindowPrefab == null)
{
return;
}
GameObject termsOfUseWindow = Instantiate(TermsOfUseWindowPrefab, canvas, false);
}
UIFader.cs
void CompleteFadeOut()
{
Debug.Log("Fadeout Complete! " + OnFadeOutComplete == null);
if (OnFadeOutComplete != null)
OnFadeInComplete.Invoke();
if (destroyOnFadeOut)
Destroy(gameObject);
else if (mode == FadeMode.PingPong)
FadeIn();
else
{
mode = FadeMode.None;
currentState = FadeMode.None;
}
}
答案 0 :(得分:3)
您调用OnFadeInComplete
而不是OnFadeOutComplete
。
顺便说一句,如果您的Unity版本支持C#6.0,则可以编写
OnFadeOutComplete?.Invoke();
它检查是否为null并防止此类错误。
在旧版本中,您可以为Action
和Action <T>
编写扩展方法:
public static class ActionExtension {
public static void _ (this Action f) {
if (f != null) f();
}
}
并写为
OnFadeOutComplete._();