Почему addListener не перезванивает?

#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. Дорогая мамочка, теперь я чувствую себя глупо. Большое вам спасибо!