This page has been translated automatically.
Видеоуроки
Interface
Essentials
Advanced
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Landscape Tool
Sandworm
Использование инструментов редактора для конкретных задач
Extending Editor Functionality
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World Nodes
Звуковые объекты
Объекты поиска пути
Players
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
Унифицированный язык шейдеров UUSL
Плагины
File Formats
Rebuilding the Engine Tools
GUI
Двойная точность координат
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
Работа с контентом
Оптимизация контента
Материалы
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Tutorials
Внимание! Эта версия документация УСТАРЕЛА, поскольку относится к более ранней версии SDK! Пожалуйста, переключитесь на самую актуальную документацию для последней версии SDK.
Внимание! Эта версия документации описывает устаревшую версию SDK, которая больше не поддерживается! Пожалуйста, обновитесь до последней версии SDK.

Система компонентов C #

Система компонентов позволяет реализовать логику вашего приложения с помощью набора строительных блоков - компонентов и назначать эти блоки узлам, предоставляя им дополнительную функциональность. Комбинируя эти маленькие и простые блоки, вы можете создать очень сложную логическую систему.

Логический компонент объединяет узел и класс C #, содержащий логическую реализацию (действия, которые должны быть выполнены), определяющий набор дополнительных параметров, которые будут использоваться.

Компоненты, назначенные узлу

Компоненты дают вам больше гибкости в реализации вашей логики, позволяя:

  • Управляйте тем, какие части кода (реализованные как методы компонентов) должны выполняться, а какие нет.
  • Контролировать порядок выполнения этих частей кода.
  • Неоднократно используйте части кода, написанные один раз, для любого количества объектов без каких-либо изменений. Если вы хотите изменить свой код, вы изменяете единственный источник (аналогично NodeReferences , если мы говорим о контенте).
  • Объедините определенные части кода, которые будут выполняться для определенных узлов. Создайте очень сложную систему из множества маленьких и простых блоков (например, вы использовали бы NodeReference для создания большой сложной структуры с использованием множества простых узлов).

Перед началом кодирования вы должны установить необходимое программное обеспечение .

Смотрите также#

Требования#

Правильный рабочий процесс для программирования и создания проектов на основе .NET подразумевает ряд требований:

  • .NET 5 SDK (для Windows и Linux)
  • IDE или текстовый редактор. Проверяется совместимость различных IDE со следующими версиями .NET:
    IDE Supported .NET version
    MS Visual Studio Code 5.0.x
    MS Visual Studio 2019 5.0.x
    Примечание
    Visual Studio Code - рекомендуемый вариант.

Если вы работаете с MS Visual Studio Code, установите расширение C # для Visual Studio Code с питанием от OmniSharp при первом открытии компонента.

В случае возникновения каких-либо проблем с .NET, проверьте раздел "Устранение неполадок" в проблемах .NET.

Создание компонента#

Компоненты создаются с помощью 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.

Исходный код (C#)
[Component(PropertyGuid = "2ae011355ed7f110a202912faa000cc22276e539")]
Внимание
Значение атрибута Component нельзя изменять.

Компоненты C # перечислены в иерархии Properties, изначально они унаследованы от базового свойства C# Components.

Примечание
Общее автоматическое наследование компонентов не поддерживается, вы можете получить логическую реализацию из произвольного компонента вручную, унаследовав его класс от класса родительского компонента.

Простое наследование#

Предположим, у вас есть компонент, реализующий определенную функциональность, и вам нужно определенное количество подкомпонентов, имеющих точно такие же функциональные возможности, но разные значения параметров. Такая ситуация типична при реализации предварительных настроек качества или конфигураций элементов управления. Просто унаследуйте свойство от базового компонента в UnigineEditor для каждого пресета и настройте необходимые значения параметров. После этого вы можете назначать эти унаследованные свойства узлам, таким образом присоединяя к ним логику базового компонента со значениями параметров, взятыми из унаследованных свойств. Без излишнего копирования, без избыточного кода.

Логика#

Логика компонентов реализована с помощью набора методов, которые вызываются соответствующими функциями скрипта world :

  • Init() - создать и инициализировать все необходимые ресурсы.
  • UpdateAsyncThread() - укажите все логические функции, которые вы хотите вызывать в каждом кадре независимо от потока рендеринга.
    Примечание
    Этот метод не имеет защитных блокировок, поэтому не рекомендуется изменять другие компоненты внутри этого метода, если вы не уверены, что эти компоненты не будут изменены или удалены где-либо еще.
  • UpdateSyncThread() - укажите все функции параллельной логики, которые вы хотите выполнить перед Update (). Этот метод можно использовать для выполнения некоторых ресурсоемких вычислений, таких как поиск пути, генерация процедурных текстур и т.д.
    Примечание
    Этот метод следует использовать для вызова только методов API, относящихся к текущему узлу: самому узлу, его материалам и свойствам.
  • Update() - укажите все логические функции, которые вы хотите вызывать в каждом кадре.
  • PostUpdate() - правильное поведение в соответствии с обновленными состояниями узлов в том же кадре.
  • UpdatePhysics() - имитировать физику: выполнять непрерывные операции (толкать автомобиль вперед в зависимости от оборотов двигателя, имитировать постоянно дующий ветер, выполнять немедленную реакцию на столкновение и т. д.).
  • Swap() - работать с результатами метода updateAsyncThread() - все остальные методы (потоки) уже выполнены и простаивают. После этой функции происходит только два действия:
    • Все объекты, поставленные в очередь на удаление, удаляются.
    • Profiler is updated.
  • Shutdown() - выполнять очистку при выключении компонента.
Примечание
Вы можете установить несколько методов для каждого этапа (например, несколько методов Update() или только один Init () ).
Внимание
Методы UpdateAsyncThread(), UpdateSyncThread() и UpdatePhysics() позволяют вызывать только потокобезопасные функции движка.

Параметры#

Компоненты могут иметь параметры, которые можно редактировать в окне Parameters.

Следующие объекты имеют автоматически сгенерированный пользовательский интерфейс в редакторе на основе типа данных и набора атрибутов:

  • public поля класса компонента
  • любые поля private и protected с опцией [ShowInEditor]
Исходный код (C#)
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>() узла.
Исходный код (C#)
NewComponent component = AddComponent<NewComponent>(node);

NewComponent component = node.AddComponent<NewComponent>();

Логика определенного компонента активна только тогда, когда компонент и соответствующий узел включены. Таким образом, при необходимости вы можете включать / отключать логику каждого конкретного компонента во время выполнения.

Вы можете назначить несколько компонентов одному узлу. Последовательность, в которой выполняется логика компонентов, определяется значением order, указанным для соответствующих методов (если значения order совпадают или не указаны, последовательность неопределима).

Компоненты могут взаимодействовать с другими компонентами и узлами.

Запуск проекта#

Чтобы запустить проект, нажмите кнопку Play на панели инструментов. Это запустит экземпляр приложения в отдельном окне.

Примечание
Вы увидите зеленое уведомление об успешной компиляции, а красное сигнализирует об обнаружении ошибок. При нажатии на красное сообщение в консоли отображаются сведения. Все ошибки компиляции и выполнения C # отображаются в консоли.
Для правильного отображения сообщений об ошибках в Windows язык для программ, не поддерживающих Юникод, должен быть таким же, как текущий языковой стандарт системы.

В списке доступны предустановки пользовательских параметров запуска. По умолчанию есть одна предустановка Default (Debug) с параметрами запуска по умолчанию. Щелкните значок шестеренки, чтобы настроить текущий выбранный набор пользовательских параметров запуска.

В открывшемся окне доступны следующие варианты запуска:

Configuration UNIGINE Engine build to be used
Video API Графический API, используемый для рендеринга:
  • DirectX
  • OpenGL
Resolution Размер экрана
Fullscreen

Запустить экземпляр в одном из следующих режимов:

  • Disable — отключен, приложение запускается в оконном режиме
  • Enable — включен, приложение запускается в полноэкранном режиме
  • Borderless Window — приложение запускается в режиме без границ — полнооконном режиме, когда окно приложения отображается без дополнительных элементов
VR Mode Включить совместимость с одной из поддерживаемых гарнитур VR:
  • Disable
  • Vive
  • Oculus
Video Debug Включает контекст отладки OpenGL или DirectX:
  • Disable
  • Messages
  • Asserts
Materials Loading Mode Выбирает используемый режим загрузки материалов:
  • Fastest Start - минимальное потребление памяти и максимальная скорость загрузки двигателя. Рекомендуется для быстрых итераций на этапе разработки приложения.
  • Full Materials - немного медленнее загружается при запуске движка и используется больше памяти, чем в первом режиме, но меньше скачков. Может использоваться для небольшого проекта с небольшим количеством материалов (в случае удовлетворительной производительности и достаточного объема памяти).
  • Full Materials + Compile Shaders + Load Shaders - этот режим обеспечивает стабильную работу и значительное уменьшение скачков, но требует много памяти и увеличивает время загрузки при запуске. Рекомендуется для фазы производства (когда вы передаете свое приложение конечному пользователю).
Run Current World Запускать текущий мир, открытый в редакторе, независимо от мира по умолчанию, установленного логикой.
Arguments Набор параметров командной строки запуска .

При изменении любого пользовательского параметра запуска и закрытии окна в зависимости от выбранной предустановки будут выполнены следующие действия:

  • Если в списке выбрана предустановка Default (Debug), в текущей папке обозревателя ресурсов будет создан новый файл ресурсов *.launch , содержащий настраиваемые параметры запуска. Соответствующий пресет будет доступен в списке пресетов.
  • Если выбран другой пресет, к нему будут применены изменения.
Примечание
Вы можете переименовывать и удалять предустановки пользовательских параметров запуска, переименовывая и удаляя соответствующие ресурсы *.launch.

Отладка ваших C# компонентов #

UnigineEditor автоматически повторно компилирует ваши компоненты C # по мере внесения вами изменений в код, сохраняет их и возвращаетесь в редактор. Вы увидите зеленое уведомление об успешной компиляции, а красное сигнализирует об обнаружении ошибок. При нажатии на красное сообщение в консоли отображаются подробные сведения.

Вы можете проверить исходный код ваших компонентов C # во время работы вашего приложения, независимо от того, запущено ли приложение с помощью кнопки Play прямо в UnigineEditor или создано и запущено из IDE.

Подробности см. в статье Отладка компонентов C # .

Сборка приложения#

Чтобы создать отладочную или выпускную сборку вашего приложения C #, используйте параметр File -> Create Build, доступный в UnigineEditor.

Подробности см. в статье Финальная сборка проекта для публикации .

Использование#

В качестве примера, вы можете использовать компоненты для реализации логики преследования врагов в вашей игре: независимо от их размера, формы, скорости, все они будут проверять позицию игрока, и постарайтесь найти путь, чтобы приблизиться к нему как можно быстрее. Код будет в основном таким же, он просто будет использовать разные параметры (скорость, сетку или звуки, возможно), поэтому вы можете поместить все эти параметры в компонент (чтобы иметь возможность изменять их в любое время) и код для соответствующий класс компонента (например, разместить врагов в мире в Init() и преследовать игрока методом Update()).

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

Интеграция с инструментом Microprofile позволяет контролировать общую производительность системы компонентов, а также добавлять информацию профилирования для ваших пользовательских компонентов.

Последнее обновление: 13.12.2021
Build: ()