Система компонентов C #
Система компонентов позволяет реализовать логику вашего приложения с помощью набора строительных блоков - компонентов и назначать эти блоки узлам, предоставляя им дополнительную функциональность. Комбинируя эти маленькие и простые блоки, вы можете создать очень сложную логическую систему.
Логический компонент объединяет узел и класс C #, содержащий логическую реализацию (действия, которые должны быть выполнены), определяющий набор дополнительных параметров, которые будут использоваться.
Компоненты дают вам больше гибкости в реализации вашей логики, позволяя:
- Управляйте тем, какие части кода (реализованные как методы компонентов) должны выполняться, а какие нет.
- Контролировать порядок выполнения этих частей кода.
- Неоднократно используйте части кода, написанные один раз, для любого количества объектов без каких-либо изменений. Если вы хотите изменить свой код, вы изменяете единственный источник (аналогично NodeReferences , если мы говорим о контенте).
- Объедините определенные части кода, которые будут выполняться для определенных узлов. Создайте очень сложную систему из множества маленьких и простых блоков (например, вы использовали бы NodeReference для создания большой сложной структуры с использованием множества простых узлов).
Система компонентов доступна для всех проектов, использующих C# (.NET Core) API.
Перед началом кодирования вы должны установить необходимое программное обеспечение .
Смотрите также#
- Отладка компонентов C # для получения дополнительных сведений об отладке кода ваших компонентов C #.
- Примеры компонентов C # демонстрационный пакет, демонстрирующий различные способы использования компонентов C #.
- Платформер от третьего лица на C # , демонстрирующий производительность и гибкость логической системы с использованием знакомых концепций простого шутера от третьего лица.
- Системный API компонентов C # для получения дополнительных сведений об управлении компонентами через C # API.
- Пример использования системы компонентов C # для получения дополнительных сведений о реализации логики с использованием системы компонентов C #.
Требования#
Правильный рабочий процесс для программирования и создания проектов на основе .NET Core подразумевает ряд требований:
- .NET Core 3.1 SDK (для Windows и Linux)
- IDE или текстовый редактор. Проверяется совместимость различных IDE со следующими версиями .NET Core:
IDE Supported .NET Core version MS Visual Studio Code 3.1.x MS Visual Studio 2019 3.1.x Visual Studio Code - рекомендуемый вариант.
Если вы работаете с MS Visual Studio Code, установите расширение C # для Visual Studio Code с питанием от OmniSharp при первом открытии компонента.
В случае возникновения каких-либо проблем с .NET Core, проверьте раздел "Устранение неполадок" в проблемах .NET Core .
Создание компонента#
Компоненты создаются с помощью Editor . Откройте Asset Browser и выберите Create -> Create C# Component.
Укажите имя для компонента в диалоговом окне подсказки, после чего в текущем каталоге браузера ресурсов будет создан файл ресурсов сценария C # с соответствующим именем.
Дважды щелкните новый ресурс сценария, чтобы изменить логику компонента в IDE по умолчанию.
Переименование компонентов#
В идеале, вы с самого начала называете вещи правильно. Название должно быть чистым и отражать то, что оно делает. Но иногда что-то действительно меняется, и внезапно вы понимаете, что нужно изменить имя вашего компонента. Начиная с 2.11 это не проблема. На самом деле, это можно сделать двумя способами:
- Переименование вашего cs-ресурса в браузере ресурсов . Класс компонента и связанное с ним свойство будут переименованы автоматически. Единственное, что вам нужно сделать в этом случае, - это заменить все ссылки на ваш класс компонента в исходном коде на новые в вашей предпочтительной среде IDE через Find&Replace.
- Использование инструментов рефакторинга вашей IDE (например, Rename symbol в VS Code или Edit -> Refactor -> Rename в Visual Studio). После переименования просто откройте UnigineEditor - соответствующий cs-актив и связанное с ним свойство будут переименованы автоматически с сохранением всех ссылок. Имейте в виду, что в этом случае имя cs-файла, содержащего реализацию вашего компонента, изменится, и файл будет удален из проекта вашей IDE как отсутствующий. Итак, вам придется добавить переименованный файл обратно в проект в среде IDE.
Структура компонента#
По сути, компоненты - это классы C #, унаследованные от базового класса Component.
Работа системы компонентов C # основана на properties . Когда вы создаете новый компонент, он автоматически регистрируется в Component System и создается внутреннее свойство runtime и связан с компонентом через GUID. Для правильной работы компонента необходим следующий атрибут класса Component.
[Component(PropertyGuid = "2ae011355ed7f110a202912faa000cc22276e539")]
Компоненты C # перечислены в иерархии Properties, изначально они унаследованы от базового свойства C# Components.
Простое наследование#
Предположим, у вас есть компонент, реализующий определенную функциональность, и вам нужно определенное количество подкомпонентов, имеющих точно такие же функциональные возможности, но разные значения параметров. Такая ситуация типична при реализации предварительных настроек качества или конфигураций элементов управления. Просто унаследуйте свойство от базового компонента в UnigineEditor для каждого пресета и настройте необходимые значения параметров. После этого вы можете назначать эти унаследованные свойства узлам, таким образом присоединяя к ним логику базового компонента со значениями параметров, взятыми из унаследованных свойств. Без излишнего копирования, без избыточного кода.
Логика#
Логика компонентов реализована с помощью набора методов, которые вызываются соответствующими функциями скрипта world :
- Init() - создать и инициализировать все необходимые ресурсы.
- UpdateAsyncThread() - укажите все логические функции, которые вы хотите вызывать в каждом кадре независимо от потока рендеринга.
Этот метод не имеет защитных блокировок, поэтому не рекомендуется изменять другие компоненты внутри этого метода, если вы не уверены, что эти компоненты не будут изменены или удалены где-либо еще.
- UpdateSyncThread() - укажите все функции параллельной логики, которые вы хотите выполнить перед Update (). Этот метод можно использовать для выполнения некоторых ресурсоемких вычислений, таких как поиск пути, генерация процедурных текстур и т. Д.
Этот метод следует использовать для вызова только методов API, относящихся к текущему узлу: самому узлу, его материалам и свойствам.
- Update() - укажите все логические функции, которые вы хотите вызывать в каждом кадре.
- PostUpdate() - правильное поведение в соответствии с обновленными состояниями узлов в том же кадре.
- UpdatePhysics() - имитировать физику: выполнять непрерывные операции (толкать автомобиль вперед в зависимости от оборотов двигателя, имитировать постоянно дующий ветер, выполнять немедленную реакцию на столкновение и т. д.).
- Swap() - работать с результатами метода updateAsyncThread() - все остальные методы (потоки) уже выполнены и простаивают. После этой функции происходит только два действия:
- Все объекты, поставленные в очередь на удаление, удаляются.
- Profiler is updated.
- Shutdown() - выполнять очистку при выключении компонента.
Параметры#
Компоненты могут иметь параметры, которые можно редактировать в окне Parameters.
Следующие объекты имеют автоматически сгенерированный пользовательский интерфейс в редакторе на основе типа данных и набора атрибутов:
- public поля класса компонента
- любые поля private и protected с опцией [ShowInEditor]
public int public_field;
private int private_field;
[ShowInEditor]
private float private_editable_field;
[HideInEditor]
public float public_hidden_field;
Параметры и их атрибуты могут быть объявлены для виджетов редактора.
Дополнительные сведения о поддерживаемых типах параметров и атрибутах см. в классе Component.
Применение логики компонентов к узлу#
Логическая реализация, описанная в компоненте, активна во время выполнения, только если компонент назначен узлу, и оба узла и компонент включены.
Есть несколько способов применения компонента к узлу:
-
Выберите узел, щелкните Add New Property и введите имя актива *.cs в разделе Node Properties вкладки Node. Вы можете сделать это, перетащив туда ресурс *.cs из окна Asset Browser.
Также поддерживается перетаскивание на узел в окне просмотра редактора.
- Добавьте компонент к узлу с помощью кода, используя функции AddComponent<T>(Node node) и AddComponent<T>() узла.
NewComponent component = AddComponent<NewComponent>(node);
NewComponent component = node.AddComponent<NewComponent>();
Логика определенного компонента активна только тогда, когда компонент и соответствующий узел включены. Таким образом, при необходимости вы можете включать / отключать логику каждого конкретного компонента во время выполнения.
Вы можете назначить несколько компонентов одному узлу. Последовательность, в которой выполняется логика компонентов, определяется значением order, указанным для соответствующих методов (если значения order совпадают или не указаны, последовательность неопределима).
Компоненты могут взаимодействовать с другими компонентами и узлами.
Запуск проекта .NET Core#
Чтобы запустить проект с использованием .NET Core, нажмите кнопку Play на панели инструментов. Это запустит экземпляр приложения в отдельном окне.
Для правильного отображения сообщений об ошибках в Windows язык для программ, не поддерживающих Юникод, должен быть таким же, как текущий языковой стандарт системы.
В списке доступны предустановки пользовательских параметров запуска. По умолчанию есть одна предустановка Default (Debug) с параметрами запуска по умолчанию. Щелкните значок шестеренки, чтобы настроить текущий выбранный набор пользовательских параметров запуска.
В открывшемся окне доступны следующие варианты запуска:
Configuration | UNIGINE Engine build to be used |
---|---|
Video API |
Графический API, используемый для рендеринга:
|
Resolution | Размер экрана |
Fullscreen | Запустить экземпляр в полноэкранном или оконном режиме |
VR Mode |
Включить совместимость с одной из поддерживаемых гарнитур VR:
|
Video Debug |
Включает контекст отладки OpenGL или DirectX:
|
Materials Loading Mode |
Выбирает используемый режим загрузки материалов:
|
Run Current World | Запускать текущий мир, открытый в редакторе, независимо от мира по умолчанию, установленного логикой. |
Arguments | Набор параметров командной строки запуска . |
При изменении любого пользовательского параметра запуска и закрытии окна в зависимости от выбранной предустановки будут выполнены следующие действия:
- Если в списке выбрана предустановка Default (Debug), в текущей папке обозревателя ресурсов будет создан новый файл ресурсов *.launch , содержащий настраиваемые параметры запуска. Соответствующий пресет будет доступен в списке пресетов.
- Если выбран другой пресет, к нему будут применены изменения.
Отладка ваших C# компонентов #
UnigineEditor автоматически повторно компилирует ваши компоненты C # по мере внесения вами изменений в код, сохраняет их и возвращаетесь в редактор. Вы увидите зеленое уведомление об успешной компиляции, а красное сигнализирует об обнаружении ошибок. При нажатии на красное сообщение в консоли отображаются подробные сведения.
Вы можете проверить исходный код ваших компонентов C # во время работы вашего приложения, независимо от того, запущено ли приложение с помощью кнопки Play прямо в UnigineEditor или создано и запущено из IDE.
Подробности см. в статье Отладка компонентов C # .
Сборка приложения#
Чтобы создать отладочную или выпускную сборку вашего приложения C #, используйте параметр File -> Create Build, доступный в UnigineEditor.
Подробности см. в статье Создание проекта .
Использование#
В качестве примера, вы можете использовать компоненты для реализации логики преследования врагов в вашей игре: независимо от их размера, формы, скорости, все они будут проверять позицию игрока, и постарайтесь найти путь, чтобы приблизиться к нему как можно быстрее. Код будет в основном таким же, он просто будет использовать разные параметры (скорость, сетку или звуки, возможно), поэтому вы можете поместить все эти параметры в компонент (чтобы иметь возможность изменять их в любое время) и код для соответствующий класс компонента (например, разместить врагов в мире в Init() и преследовать игрока методом Update()).
Затем вы должны просто назначить компонент всем объектам противника и настроить параметры (определить сетки, звуки и т. д.). Система компонентов сделает все остальное: выполнит ваш код на соответствующих этапах основного цикла Engine для всех вражеских объектов, используя их определенные параметры. Если вы решите изменить свой код позже, вы можете сделать это в едином исходном классе компонентов.
Интеграция с инструментом Microprofile позволяет контролировать общую производительность системы компонентов, а также добавлять информацию профилирования для ваших пользовательских компонентов.