在Unity中动态创建GameObject标签

时间:2019-03-04 18:30:49

标签: c# unity3d

大家好,

我想为我正在研究的当前unity项目实现一项功能,该功能允许用户提供格式化的文本文件,并允许Unity根据该文本文件实例化对象(位置,旋转,缩放) ,颜色等)。自然,我希望这些对象具有与之关联的标签,从而可以按标签快速轻松地对相似的对象进行分组。

This帖子对显示如何在单击“播放”以直接添加和删除标签后如何修改统一编辑器很有帮助,但不幸的是,它掩盖了UnityEditor命名空间无法在构建中使用的事实! (主要抱怨在提供的链接中看到了serializedObject和serializedProperty数据类型)

就目前而言,我的项目按预期在编辑器中正常运行,但是如果我将当前的标签创建者和相关脚本移动到单独的“资产/编辑器”目录并实际构建我的项目,那么我当然会失去所有相关的功能这些脚本。

有其他方法可以做到吗

  • 以某种我不知道的矛盾方式包含UnityEditor;
  • 基于文本的用户输入动态创建/编辑标签,而无需使用UnityEditor;
  • 实现类似但不需要标签的功能

谢谢你!

3 个答案:

答案 0 :(得分:0)

您不能在构建中包含UnityEditor,据我所知,无法在运行时创建标签。 解决方案是实现自己的索引系统,以快速查找可以在运行时实例化的对象。

您可以创建一个class DynamicObject : Monobehaviour来存储标签和与索引/实例化系统相关的所有其他信息。

一个简单的实现是使用Dictionary<string, List<DynamicObject>>,其中键是标签。 编制索引时,您可以将对象添加到与标签一样多的列表中。

您只需向系统注册需要在运行时实例化的对象,从而使搜索更快。

我怀疑,即使这样简单的实现也比Unity的内置方法GameObject.FindGameObjectsWithTag快得多。

作为一个旁注,如果您还需要通过构成可重用组件来动态定义新类型,我建议您研究实体组件系统库。

答案 1 :(得分:0)

解决了!

进一步的实验确实证实了UnityEditor名称空间根本无法在构建中使用。正如Trey所建议的那样,对上述问题发表评论的用户最好创建一个简单的字符串列表。

每个对象现在都有一个psuedoTag参数,只是一个直接从存储在tagMaster对象中的列表中提取的字符串,而不是检查 whatever.tag ,我只是获得了psuedoTag所在的组件在存储和比较字符串值。此外,C#中列表的性质允许动态创建和删除psuedoTag,并且我的项目具有我想要的确切灵活性。

再次感谢所有人的建议!

答案 2 :(得分:0)

我遇到了类似的问题,我不得不动态创建对象。我需要一种标记它们的方法,以便可以使用脚本来控制它们。因此,我尝试对它们进行动态标记,但是显示了一个错误,即标记没有退出。因此,尝试通过创建一个多维数据集并为其分配动态对象所需的标签来欺骗Unity。我将魔方放到了相机焦点之外,然后就成功地钉上了钉子。尝试一下可能对您有用。