c# - 从代码检查并创建丢失的游戏对象(不是在游戏过程中)
问题描述
好的。当我打开我的项目时,如果GameObject
找不到某个人(或所有人),那么应该自动创建它。例如,我有SceneBuilder
asGameObject
并且它包含所有必要的脚本:ObjectsGenerator.cs
等PlayerData.cs
。如果以某种方式SceneBuilder
消失,它必须从代码中恢复。我怎样才能做到这一点?
ps:我发现只有两种方法:
- 从 menu 创建它
[MenuItem("MyTools/CreateGameObjects")]
,但显然不是为了支持。 - 通过创建它
[CustomEditor(typeof(SomeOjectScript))]
,但它必须已经存在于场景中(我猜是场景完全为空的情况)
ps:对不起,如果问题已经出现并且我还没有找到它
updated.
谢谢大家。解决了类似的事情
[InitializeOnLoad]
public class Checker : MonoBehaviour
{
static Checker()
{
CheckAndCreateObj();
EditorApplication.hierarchyChanged += hierarchyChanged;
}
private static void hierarchyChanged()
{
CheckAndCreateObj();
}
private static void CheckAndCreateObj()
{
string objName = "OBJECTNAME";
GameObject go = GameObject.Find(objName);
if (go == null)
{
Instantiate(new GameObject(objName));
}
}
}
https://docs.unity3d.com/Manual/RunningEditorCodeOnLaunch.html
解决方案
您可以在其他脚本之一中动态检查它。您可以从OnEnable
或Start
函数调用它。你的 MonoBehaviour 必须包含标签[ExecuteInEditMode]
它可能是这样的:
[ExecuteInEditMode]
public class YourMonoBehaviour: MonoBehaviour
{
void OnEnable()
{
var myObject = GameObject.Find("GAMEOBJECT_NAME");
if (myObject == null)
{
//Create new GameObject here and add your Component
}
}
}
如果您需要通过序列化在游戏对象中保存一些资产链接或数据,您可以创建预制件,将其缓存并从预制件创建对象:
MyObjectType prefabTemplate;
void OnEnable()
{
if (GameObject.Find("GAMEOBJECT_NAME") == null)
{
GameObject.Instantiate(prefabTemplate);
}
}
推荐阅读
- python - 如何从具有范围的数据库中获取数据?
- php - 带有自定义分类法的 Wordpress 自定义查询 - 分页错误
- c# - 具有多种命令类型的命令行解析器
- javascript - 从文本文件中读取多行,然后通过将读取的文件插入到函数上来迭代函数
- snowflake-cloud-data-platform - 将有效负载中的空字符串类型转换为雪花中的 int
- javascript - 如何查找在物化模式中单击了哪个按钮?
- r - solve.default(oout$hessian) 中的错误:Lapack 例程 dgesv:系统完全是奇异的:U[1,1] = 0
- node.js - Heroku 在获取图像时崩溃
- c# - 从 StringBuilder 输出中删除空白列表项而不会丢失订单
- raspberry-pi - Makfile ERROR: make: ../objects/%.o:: No such file or directory