unity3d - 如何在没有单例的情况下在 Unity3d 中创建游戏范围的对象?
问题描述
Unity3d 框架中是否有一种方法可以注册一个对象,该对象可以被游戏中所有场景中的所有实体访问,而无需诉诸单例模式(如游戏状态对象)?
解决方案
您可以采取以下方法:
在创建 GameObject 的场景中,在附加到 GameObject 的 MonoBehavior 脚本中:
- 在 Awake() (或在编辑器中)用“name = ...”命名游戏对象
- 示例:myObject.name = "FindMeInEveryScene";
- 参考:https ://docs.unity3d.com/ScriptReference/Object-name.html
- 在 Awake() 中对 GameObject 调用“DontDestroyOnLoad”
- 示例:DontDestroyOnLoad(myObject);
- 参考:https ://docs.unity3d.com/ScriptReference/Object.DontDestroyOnLoad.html
在同一场景和后续场景中,在附加到其他游戏对象的 MonoBehavior 脚本中。
- 在 Start() 中使用 GameObject.Find(...) 查找对象
- 示例:globalGameObject = GameObject.Find("FindMeInEveryScene");
- 参考:https ://docs.unity3d.com/ScriptReference/GameObject.Find.html
这将允许您在没有单例的情况下访问名为“FindMeInEveryScene”的游戏对象。
把这一切拉到一起……
全球游戏对象.cs
// Attached to the GameObject that needs to be accessd by any other
// GameObjects and needs to survive between loading scenes
public class GlobalGameObject : MonoBehaviour
{
static bool gameObjectInitialized = false;
void Awake()
{
if ( !gameObjectInitialized )
{
gameObject.name = "FindMeInEveryScene";
DontDestroyOnLoad( gameObject );
gameObjectInitialized = true;
}
}
}
使用GameObject.cs
// Attached to GameObjects that need access to the GlobalGameObject
public class UsingGameObject : MonoBehaviour
{
private GameObject globalGameObject = null;
void Start()
{
globalGameObject = GameObject.Find( "FindMeInEveryScene" );
}
}
推荐阅读
- c# - .Net Core Dependency Injection 获取两个工厂方法生成的不同实例
- c++ - c ++ wcout停止输出,wofstream在一些调用后也停止输出
- recursion - 为什么这个递归函数超过调用堆栈大小?
- javascript - cookie 在 chrome 中不起作用
- php - 是否在被视为验证的输入上使用 HTML 必需属性?
- c - 了解 gcc 的内联(二进制中存在的内联函数汇编代码?)
- google-tag-manager - 可以从谷歌标签管理器中的事件中提取变量
- sublimetext3 - Sublime Text 3 卸载 Materialize 包后出现错误
- c# - 正则表达式过滤代码段
- wordpress - get_terms 过滤器导致未选中类别列表复选框