Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Unity |创建新标记的脚本_Arrays_Unity3d_Dynamic - Fatal编程技术网

Arrays Unity |创建新标记的脚本

Arrays Unity |创建新标记的脚本,arrays,unity3d,dynamic,Arrays,Unity3d,Dynamic,我有一个从动态dll中读取多个字符串数组的代码。我用数组中的每个字符串创建游戏对象,我想将每个字符串数组分组为唯一的组。 到目前为止,我已经设法给这些特定于游戏对象的标签进行分组,但是这些标签是在Unity编辑器中预先创建的。到目前为止,这是可行的,但如果动态类提供的数组比我以前创建的标记多,它将无法对其他数组进行分组 我的问题:在游戏运行时,有没有办法通过脚本创建新标签?所以我可以简单地将它们添加到新的游戏对象中 如果这不可能,是否有人有一个不同的方法来排序这些群体的想法 提前谢谢 原则上,标

我有一个从动态dll中读取多个字符串数组的代码。我用数组中的每个字符串创建游戏对象,我想将每个字符串数组分组为唯一的组。 到目前为止,我已经设法给这些特定于游戏对象的标签进行分组,但是这些标签是在Unity编辑器中预先创建的。到目前为止,这是可行的,但如果动态类提供的数组比我以前创建的标记多,它将无法对其他数组进行分组

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

如果这不可能,是否有人有一个不同的方法来排序这些群体的想法


提前谢谢

原则上,标签系统只是一个列表字典。问题是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:MonoBehavior
{
私有静态字典集合=新字典();
公共静态无效寄存器(字符串标记、游戏对象项){
如果(!Collection.ContainsKey(标记))
添加(标记,新列表());
集合[tag]。添加(项);
}
公共静态无效注销器(字符串标记,游戏对象项){
如果(!Collection.ContainsKey(标记))
return;//没有这样的标记
//如果有多个条目,请删除所有出现的条目
//如果您确定每个项目只有一个条目,则可以使用“删除”
集合[tag].RemoveAll(m=>m==item);
}
公共静态IEnumerable FindObjectsWithTag(字符串标记){
如果(!Collection.ContainsKey(标记))
返回null;
返回集合[tag]。AsEnumerable();
}
公共字符串标签;
私有void Start(){
注册(标签、游戏对象);
}
私有void OnDestroy(){
注销(标签、游戏对象);
}
}

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

IMHO,您最好创建自己的
DynamicTag
system,因为Unity标记系统非常简单,而且大部分都是预编译的。明天我将尝试为您编写一些代码,但基本上,我有一个单一行为,可以“标记”对象,并可以用自己的静态字典注册自己。在等待沉浸式时,您是否尝试过查看我写了一个非常棒的“这就是您如何在Unity中进行自定义标记”回答。。。这并没有真正解决你的具体情况。我会再试一次…=)@沉浸式非常感谢您特意为这个用例创建了一个小代码!今天晚些时候我会试试,看看这对我是否有效。@Ginxxx是的,我已经试过了,但对我来说,这似乎帮不了我多少忙。据我所知,这在游戏实际运行时不起作用,只能在编辑器中执行。我会再调查的,谢谢!