Gameobject.find即使在继承关系中处于活动状态时也仅返回null

时间:2018-12-19 10:58:03

标签: c# unity3d gameobject

我正在尝试从一个场景转移到另一个场景,并在发生这种情况时触发功能。 因此,当我在主菜单页面上按我的游戏按钮时,它将加载一个功能以开始构建世界。我有建立世界的功能,但是一旦我将它安装到一个按钮上,它就停止工作了。 到目前为止,我认为这取决于我尚未完全理解从另一个类调用函数以使其正常运行的方法。 我开始将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#还是陌生的,因此不胜感激。谢谢。

1 个答案:

答案 0 :(得分:1)

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