#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 не будет до следующего обновления)