为什么FindObjectOfType(MyType)找不到任何东西?

时间:2015-12-10 09:15:06

标签: c# unity3d

为什么我会得到以下日志?

  • 启动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。这是代码的极简化版本,因此其余部分不会产生混淆。如果您需要更多详细信息,我很乐意回答您的问题!

3 个答案:

答案 0 :(得分:1)

更改场景。只有在那个时候,统一才是这样的。无论我们正在寻找的对象是否有效,只需FindObjectOfType在游戏周期的这一点上不起作用。

来自https://gamedev.stackexchange.com/a/112783/59620

答案 1 :(得分:0)

您是否尝试使用official document中所述的typeof即FindObjectOfType(typeof(OpponentMotionReceiver))来调用方法?

答案 2 :(得分:0)

在组件中调用OnDestroy时,GameObject已停用。它可能已经脱离了正常的等级。

此外,如果场景即将离开,则场景中未设置为GameObject的所有DontDestroyOnLoad个实例都会首先停用。

调用OnDestroy时,您要查找的所有对象都已停用。