2015-12-10 2 views
2

Зачем мне нужен следующий журнал?Почему FindObjectOfType (MyType) не находит ничего?

  • Start OpponentMotionReceiver
  • движения приемник не найден
  • правда

public class ScoreAnimation : MonoBehaviour 
    { 
     private OpponentMotionReceiver cachedObject; 

     private void Start() 
     { 
      cachedObject = FindObjectOfType<OpponentMotionReceiver>(); 
     } 

     private void OnDestroy() 
     { 
       var motionReceiver = FindObjectOfType<OpponentMotionReceiver>(); 

       if (motionReceiver == null) 
       { 
        Debug.Log("motion receiver not found"); 
       } 

       if(cachedObject != null) 
       { 
        //prints true, another proof that the gameObject is active 
        Debug.Log(cachedObject.gameObject.activeInHierarchy); 
       } 
     } 
    } 

public class OpponentMotionReceiver : MonoBehaviour 
    { 
     private void Start() 
     { 
      Debug.Log("Start OpponentMotionReceiver"); 
     } 

     private void OnDisable() 
     { 
      Debug.Log("OnDisable OpponentMotionReceiver"); 
     } 

     private void OnDestroy() 
     { 
      Debug.Log("OnDestroy OpponentMotionReceiver"); 
     } 
    } 

P.S. Это чрезвычайно упрощенная версия кода, так что остальное не вызывает путаницы. Если вам нужна дополнительная информация, я был бы рад ответить вам!

+0

Используется ли приемник движения в сцене? – JonWells

+0

Да [еще несколько символов] – ZenVentzi

+0

Даже в полной версии кода в Start() в ScoreAnimation я снова использую 'FindObjectOfType ()' и успешно. – ZenVentzi

ответ

1

Изменение сцены. Только в это время единство ведет себя так. Независимо от того, активен ли объект, который мы ищем, просто FindObjectOfType не работает в этот момент игрового цикла.

От https://gamedev.stackexchange.com/a/112783/59620

0

Вы пытались вызвать метод, используя тип i.e. FindObjectOfType(typeof(OpponentMotionReceiver)), как указано в official document?

+0

Я только что сделал и получил те же результаты – ZenVentzi

+0

Вы пытались объявить motionReceiver как OpponentMotionReceiver, а не var? –

+0

Также, с некоторым колебанием, я помню, что этот метод находит объекты, существующие в текущей сцене, вы уверены, что у вас есть объект в текущей сцене? –

0

Когда OnDestroy называется в вашем компоненте GameObject уже отключен. Вероятно, он уже вырвался из нормальной иерархии.

Кроме того, если сцена уходит, похоже, что все GameObject экземпляров в сцене, которые не установлены в DontDestroyOnLoad, сначала деактивируются.

Когда OnDestroy называется все объекты, которые вы ищете, уже деактивированы.

Смежные вопросы