Unity | Скрипт для создания нового тега

#arrays #unity3d #dynamic

#массивы #unity3d #динамический

Вопрос:

У меня есть код, который считывает несколько массивов строк из динамической библиотеки dll. Я создаю GameObjects из каждой строки внутри этого массива, и я хочу сгруппировать каждый массив строк как уникальные группы. До сих пор мне удавалось присвоить этим объектам определенные теги GameObject, чтобы сгруппировать их, но эти теги были предварительно созданы в редакторе Unity. Пока это работает, но в случае, если динамический класс предоставляет больше массивов, чем тегов, которые я создал ранее, он не сможет сгруппировать дополнительные массивы.

Мой вопрос: есть ли какой-либо способ создать новые теги с помощью скрипта во время работы игры? С помощью these я мог бы просто добавить их в новые GameObjects.

В случае, если это невозможно, у кого-нибудь есть идея другого способа сортировки этих групп?

Заранее спасибо!

Комментарии:

1. ИМХО, вам лучше создать свою собственную DynamicTag систему, поскольку, afaik, система тегов Unity довольно проста и в основном предварительно скомпилирована. Я попытаюсь закодировать что-нибудь для вас завтра, но в основном у вас есть MonoBehaviour, который «помечает» объект и может регистрировать себя в собственном статическом словаре.

2. В ожидании погружения вы пытались разобраться в этом

3. Я написал действительно потрясающий ответ «Вот как вы создаете пользовательские теги в Unity»… который на самом деле не учитывал вашу конкретную ситуацию. Я попробую еще раз … =)

4. @Immersive большое вам спасибо за то, что вы приложили все усилия, чтобы создать небольшой код для этого варианта использования! я попробую это позже в этот день и посмотрю, сработает ли это для меня.

5. @Ginxxx да, я уже пытался разобраться в этом, но мне показалось, что это мне не очень помогает. Насколько я понимаю, это не работает, пока игра фактически запущена, и может быть выполнено только во время работы в редакторе. Я рассмотрю это снова, спасибо!

Ответ №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);
    }
}
  

Добавьте этот компонент в каждый созданный вами GameObject и задайте тег. Он позаботится о регистрации и отмене регистрации. Вы можете получить доступ к списку объектов для каждого тега с помощью CustomTag.FindObjectsWithTag() . Обратите внимание, что при текущей настройке объекты не будут регистрироваться в системе тегов, пока они не проснутся (что IIRC не будет до следующего обновления)