【问题标题】:Unity | Script to create a new Tag团结 |创建新标签的脚本
【发布时间】:2020-11-03 10:16:02
【问题描述】:

我有一个从 dynamical dll 中读取多个字符串数组的代码。我正在使用该数组中的每个字符串创建 GameObjects,并且我想将每个字符串数组分组为唯一组。 到目前为止,我已经设法为这些 GameObject 提供特定标签来对它们进行分组,但这些标签是在 Unity 编辑器中预先创建的。到目前为止这是可行的,但如果动态类提供的数组比我之前创建的标签多,它将无法对额外的数组进行分组。

我的问题:有没有办法在游戏运行时通过脚本创建新标签?有了这些,我可以简单地将它们添加到新的游戏对象中。

如果这不应该是可能的,有人知道用不同的方法对这些组进行排序吗?

提前致谢!

【问题讨论】:

  • 恕我直言,您最好创建自己的DynamicTag 系统,因为,afaik,Unity 标签系统非常简单,而且大部分是预编译的。明天我会尝试为您编写一些代码,但基本上,有一个 MonoBehaviour 可以“标记”对象并可以使用自己的静态字典注册自己。
  • 在等待沉浸式体验时,您是否尝试过查看this
  • 我写了一个非常棒的“这就是你在 Unity 中自定义标签的方式”答案......它实际上并没有解决你的具体情况。我再试一次... =)
  • @Immersive 非常感谢您不遗余力地为此用例创建了一些代码!我会在今天晚些时候尝试一下,看看这是否适合我。
  • @Ginxxx 是的,我已经尝试过调查它,但对我来说,这似乎对我没有太大帮助。据我了解,这在游戏实际运行时不起作用,只能在编辑器中运行时执行。我会再研究一下,谢谢!

标签: arrays unity3d dynamic


【解决方案1】:

原则上,标签系统只是一个列表字典。问题是我们在编译时定义的 Unity 字典。滚动你自己的标签系统的缺点是你需要一些方法来清除被破坏的对象。

public class CustomTag : MonoBehaviour
{
    private static Dictionary<string, List<GameObject>> Collection = new Dictionary<string, List<GameObject>>();

    public static void Register(string tag, GameObject item) {

        if (!Collection.ContainsKey(tag))
            Collection.Add(tag, new List<GameObject>());

        Collection[tag].Add(item);
    }

    public static void Deregister(string tag, GameObject item) {

        if (!Collection.ContainsKey(tag))
            return; // No Such Tag

        // In case of multiple entries, remove all occurences of item
        // If you're sure you will only have one entry per item, you can just use 'Remove'
        Collection[tag].RemoveAll(m => m == item);

    }

    public static IEnumerable<GameObject> FindObjectsWithTag(string tag) {

        if (!Collection.ContainsKey(tag))
            return null;

        return Collection[tag].AsEnumerable();
    }

    public string Tag;

    private void Start() {
        Register(Tag, gameObject);
    }

    private void OnDestroy() {
        Deregister(Tag, gameObject);
    }
}

将此组件添加到您创建的每个游戏对象,并设置标签。它将负责注册和注销。您可以使用CustomTag.FindObjectsWithTag() 访问每个标签的对象列表。请注意,在当前设置下,对象在唤醒之前不会注册到标签系统(IIRC 直到 next 更新之前不会注册)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2017-05-17
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多