c# - 即使游戏对象在层次结构中处于活动状态,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# 的新手,所以任何形式的帮助都值得赞赏。谢谢你。
解决方案
不要将 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...");
}
推荐阅读
- javascript - JavaScript,承诺拒绝
- lua - 如何从字符串的特定部分打印文本?
- amazon-web-services - 如何为 AWS s3 存储桶的每个人添加写入权限
- r - 新手有一个关于数据框列名的问题
- linux - 在 Linux 上的 AWS Elastic Beanstalk 中部署多个 ASP.NET Core 应用程序(使用 Kestrel 服务器)
- python - win10toast python在通知中心更改程序标题
- docker - 在撰写文件中设置 docker 时无法连接到 selenium/chrome
- flask - Apache 2 上的 Flask 应用程序提供内部服务器错误
- javascript - TypeScript 数组对象过滤器 - 动态过滤条件,Search Refiners Sharepoint
- c# - 为什么在尝试将数据插入行时出现 SQL 语法错误?