Unity 查找具有特定主标签的所有游戏对象,而不必指定子标签?

问题描述 投票:0回答:1

我现在正在制作一个简单的 Unity 2D 闲置游戏,其中有很多球跳来跳去并赚钱。我目前正在使用子标签来声明它们(对于每个不知道这一点的人,您可以制作子标签,例如“球/标准球”)。无论如何,是否可以获取“球”标签的所有源并返回“球/标准球”、“球/强力球”和“球/激光球”?

我找不到有关该主题的任何内容,甚至很少谈论子标签。或者是否有另一种方式来获取名称中包含“Ball”的所有游戏对象。它们都是对象的子对象,但并非都是最后的子对象。

现在我必须一一搜索每个标签,如果我引用它们全部,请将它们添加到列表中。

提前致谢:)

c# unity-game-engine tags 2d
1个回答
0
投票

如上所述,再次澄清:不存在“子标签”之类的东西。

如果您将标签称为“Something/Something”,Unity 会执行所有操作,它会很好地将它们分组到嵌套的下拉菜单中。这是一个纯粹的编辑器方面的方便功能,但在运行时,所有这些标签都是完全不相关的单个字符串 - 或者更好地说是散列(这是 Unity 出于性能原因而使用的)。


这表示我根本不会基于字符串 - 既不使用标签也不使用名称。

相反,我会在球上使用适当的组件并拥有适当的子类。

然后您可以轻松地自动注册所有实例,并按类型对它们进行分组。

我会做类似的事情

public abstract class Ball : MonoBehaviour
{
    // will contain all active instances
    private static readonly List<Ball> activeInstances = new ();

    // will also contain all active instances but grouped by their actual type
    private static readonly Dictionary<Type, List<Ball>> typeToInstances = new ();

    private void OnEnable()
    {
        activeInstances.Add(this);

        var type = this.GetType();

        if(!typeToInstances.TryGetValue(type), out var typeList))
        {
            typeList = new List<Ball>();
            typeToInstances[type] = typeList;
        }

        typeList.Add(this);
    }

    private void OnDisable()
    {
        activeInstances.Add(this);

        var type = this.GetType();

        if(typeList.TryGetValue(type, out var typeList))
        {
            typeList.Remove(this);
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.