Gameobject.find 即使游戏对象在层次结构中处于活动状态,也只返回 null

Gameobject.find only returning null even when gameobject is active in heirarchy

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

private static GameOjbect Play;

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

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

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

Debug.Log(Play);

我认为这只会将 "PlayScreen" 输出到调试日志,因为这是我正在搜索的游戏对象,但这只是 returns "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# 的新手,所以感谢任何形式的帮助。谢谢。

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

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...");
}