C# Gameobject.find仅返回null,即使Gameobject在继承权中处于活动状态
我试图从一个场景转换到另一个场景,一旦发生这种情况,就会触发一个函数。 因此,当我按下主菜单页面上的play game(玩游戏)按钮时,它会加载一个函数来开始构建世界。我已经有了构建世界的功能,但一旦我把它连接到一个按钮上,它就停止工作了。 到目前为止,我认为这是因为我没有完全理解从另一个类调用函数以使其正常运行的方法。 我开始将我的游戏对象定义为:C# Gameobject.find仅返回null,即使Gameobject在继承权中处于活动状态,c#,unity3d,gameobject,C#,Unity3d,Gameobject,我试图从一个场景转换到另一个场景,一旦发生这种情况,就会触发一个函数。 因此,当我按下主菜单页面上的play game(玩游戏)按钮时,它会加载一个函数来开始构建世界。我已经有了构建世界的功能,但一旦我把它连接到一个按钮上,它就停止工作了。 到目前为止,我认为这是因为我没有完全理解从另一个类调用函数以使其正常运行的方法。 我开始将我的游戏对象定义为: private static GameOjbect Play; 这不允许我在unity编辑器中为其分配游戏对象。因此,我采用了以下方法: Gam
private static GameOjbect Play;
这不允许我在unity编辑器中为其分配游戏对象。因此,我采用了以下方法:
GameObject Play = GameObject.Find("PlayScreen");
当此函数开始时,我的GameObject在继承权中处于活动状态,但程序仍然无法正常运行。为了测试程序在何处遇到问题,我使用了以下方法:
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();
}
}
以下是我的世界建设职能:
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#还是个新手,所以非常感谢您的帮助。谢谢。不要将唤醒功能设置为静态。如果你这么做了,团结就不会叫它了。 另外,当您执行
gameobjectplay=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...");
}
我不明白您为什么需要从另一个函数调用Awake
<代码>唤醒
在加载新场景时仍将被调用,如果GameObject Play=GameObject.Find(“PlayScreen”)
找到对象,也可以签入更新
。然后我们就可以知道这是否是一个同步问题了。@AliKanat好的,所以我把它放在了更新中,它成功了。但是,有没有一种方法可以在不在更新函数中不断重复此操作的情况下使其正常工作?您通常应该在Awake
或Start
中执行此操作,但您不必像在WorldBuilder.Awake()中那样从上一个场景调用它,只需在加载的场景中使用非静态Awake()
您会发现它会起作用。