Динамически создавать теги GameObject в Unity - PullRequest
0 голосов
/ 04 марта 2019

Привет всем,

Я бы хотел реализовать функцию для текущего проекта Unity, над которой я работаю, которая позволяет пользователю предоставлять отформатированный текстовый файл, а Unity - создавать объекты на основеэтот текстовый файл (положение, вращение, масштаб, цвет и т. д.).Естественно, мне бы хотелось, чтобы с этими объектами были связаны теги, что позволяло бы быстро и легко группировать похожие объекты по тегам.

Этот пост был полезен для демонстрации того, как редактор единства может бытьизменено после нажатия «play» для непосредственного добавления и удаления тегов, но, к сожалению, затмевает тот факт, что пространство имен UnityEditor нельзя использовать в сборках!(в основном жалуются на типы данных serializedObject и serializedProperty, которые можно увидеть в приведенной ссылке)

В моем нынешнем виде мой проект работает так, как задумано в собственном редакторе, но если я перенесу создателя текущего тега и связанные скрипты в отдельныйВ директории 'Assets / Editor' и, фактически, создавая свой проект, я, конечно, теряю всю функциональность, связанную с этими сценариями.

Есть ли какой-либо другой способ либо

  • Каким-то образом включить UnityEditor в некоторыепротиворечивый способ, о котором я не знаю;
  • Создание / редактирование тегов динамически на основе пользовательского ввода через текст без использования UnityEditor;
  • Реализация аналогичной функциональности, которая имитирует, но не требует тегов

Спасибо большое!

Ответы [ 2 ]

0 голосов
/ 07 марта 2019

Решено!

Дальнейшие эксперименты действительно подтвердили, что пространство имен UnityEditor просто невозможно использовать в сборках.Как предложил Trey , пользователь, который прокомментировал вопрос выше, создание простого списка строк было идеальным.

Каждый объект теперь имеет параметр psuedoTag, просто строку, взятую непосредственно изсписок хранится в объекте tagMaster, и вместо проверки на what.tag я просто получаю компонент, в котором хранится psuedoTag, и сравниваю строковые значения.Кроме того, природа списков в C # позволяет динамически создавать и удалять psuedoTags, и мой проект обладает именно той гибкостью, которую я желал.

Еще раз спасибо всем за предложения!

0 голосов
/ 04 марта 2019

Вы не можете включить UnityEditor в сборку, и, насколько я знаю, нет способа создавать теги во время выполнения.Решение состоит в том, чтобы внедрить собственную систему индексации для быстрого поиска объектов, которые могут быть созданы во время выполнения.

Вы можете сделать class DynamicObject : Monobehaviour для хранения тегов и любой другой информации, связанной с системой индексации / создания экземпляров.

Простая реализация будет использовать Dictionary<string, List<DynamicObject>>, где ключ является тегом.При индексировании вы добавляете объект в столько списков, сколько у него есть тегов.

Вы регистрируете в системе только те объекты, которые должны быть созданы во время выполнения, что ускоряет поиск.

Я подозреваю, что даже такая простая реализация будет намного быстрее, чем встроенные методы Unity GameObject.FindGameObjectsWithTag.

В качестве примечания, если вам также нужно динамически определять новые типы путем создания повторно используемых компонентов, я предлагаюпросмотр библиотек Entity Component System.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...