我现在正在制作一个简单的 Unity 2D 闲置游戏,其中有很多球跳来跳去并赚钱。我目前正在使用子标签来声明它们(对于每个不知道这一点的人,您可以制作子标签,例如“球/标准球”)。无论如何,是否可以获取“球”标签的所有源并返回“球/标准球”、“球/强力球”和“球/激光球”?
我找不到有关该主题的任何内容,甚至很少谈论子标签。或者是否有另一种方式来获取名称中包含“Ball”的所有游戏对象。它们都是对象的子对象,但并非都是最后的子对象。
现在我必须一一搜索每个标签,如果我引用它们全部,请将它们添加到列表中。
提前致谢:)
如上所述,再次澄清:不存在“子标签”之类的东西。
如果您将标签称为“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);
}
}
}