首页 > 解决方案 > 即使游戏对象在层次结构中处于活动状态,Gameobject.find 也仅返回 null

问题描述

我试图从一个场景转移到另一个场景并在发生这种情况时触发一个功能。因此,当我按下主菜单页面上的玩游戏按钮时,它会加载一个开始构建世界的功能。我有构建世界的功能,但是一旦我将它附加到一个按钮上它就停止工作了。到目前为止,我认为这取决于我没有完全理解从另一个类调用函数以使其正常运行的方法。我开始将我的 GameObject 定义为:

private static GameOjbect Play;

这不允许我在统一编辑器中为其分配 GameObject。因此,我采用了以下使用方法:

GameObject Play = GameObject.Find("PlayScreen");

当此功能开始时,我的 GameObeject 在层次结构中处于活动状态,但程序仍然无法正常运行。为了测试程序在哪里遇到我使用的问题:

Debug.Log(Play);

我相信这只会将“PlayScreen”输出到调试日志,因为这是我正在搜索的游戏对象,但这只会返回“Null”,并且我的程序不会进一步进行,这正在创建一堵墙。

以下是我的主菜单代码:

public class MainMenu : MonoBehaviour 
{
    public GameObject PlayScene;
    public GameObject SettingsScreen;

    public void PlayGame()
    {
        SceneManager.LoadScene("InGame");
        Debug.Log("Loading startup...");
        WorldBuilder.Awake();
    }
}

以下是我的 WorldBuilding 功能:

public class WorldBuilder:MonoBehaviour 
{
    public static GameObject Play;

    public static void Awake()
    {
        Debug.Log("Finding Scene...");
        GameObject Play = GameObject.Find("PlayScreen");
        Debug.Log(Play);
    } 
}

为什么我的程序找不到游戏对象?我还是 C# 的新手,所以任何形式的帮助都值得赞赏。谢谢你。

标签: c#unity3dgameobject

解决方案


不要将 Awake 函数设为静态。如果你这样做,Unity 不会调用它。此外,当您这样做时,您正在创建一个局部变量GameObject Play = GameObject.Find("PlayScreen");。如果你想把它保存在一个静态变量中,你不应该这样做。见下文:

public class WorldBuilder : MonoBehaviour {
    public static GameObject Play;

    public static void Awake()
    {
        Debug.Log("Finding Scene...");
        WorldBuilder.Play = GameObject.Find("PlayScreen");
        Debug.Log(Play);
    } 
}

另外,删除 PlayGame 中的调用:

public void PlayGame()
{
    SceneManager.LoadScene("InGame");
    Debug.Log("Loading startup...");
}

推荐阅读