#c# #unity3d
#c# #unity3d
Вопрос:
Я пытаюсь добавить прослушиватель UnityEvent к другому скрипту с помощью кода при создании его экземпляра. Однако метод обратного вызова никогда не вызывается.
Я поместил инструкцию debug в свой скрипт UIFader, и распечатка показывает, что UnityEvent не равен null, поэтому он видит слушателей. Тем не менее, метод обратного вызова в UIManager не вызывается.
UIManager.cs — Пользовательский менеджер.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;
}
}
Ответ №1:
Вы вызываете 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._();
Комментарии:
1. Дорогая мамочка, теперь я чувствую себя глупо. Большое вам спасибо!