Видеоуроки
Interface
Essentials
Advanced
Подсказки и советы
Программирование на C#
Принципы работы
Свойства (properties)
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Настройки и предпочтения
Работа с проектами
Настройка параметров узла
Setting Up Materials
Setting Up Properties
Освещение
Landscape Tool
Sandworm
Использование инструментов редактора для конкретных задач
Extending Editor Functionality
Встроенные объекты
Nodes
Objects
Effects
Decals
Light Sources
Geodetics
World Objects
Sound Objects
Pathfinding Objects
Players
Программирование
Основы
Настройка среды разработки
Примеры использования
UnigineScript
C++
C#
Унифицированный язык шейдеров 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
Работа с контентом
Оптимизация контента
Материалы
Art Samples
Tutorials

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

Component System enables you to implement your application’s logic via a set of building blocks - components, and assign these blocks to nodes, giving them additional functionality. By combining these small and simple blocks you can create a very sophisticated logic system. Система компонентов позволяет реализовать логику вашего приложения с помощью набора строительных блоков - компонентов и назначать эти блоки узлам, предоставляя им дополнительную функциональность. Комбинируя эти маленькие и простые блоки, вы можете создать очень сложную логическую систему.

A logic component integrates a node, a C++ class, containing logic implementation (actions to be performed), and a property, defining a set of additional parameters to be used. The list of parameters as well as their types are the same for both, the component and the corresponding property. Логический компонент объединяет узел , класс C++, содержащий логическую реализацию (действия, которые необходимо выполнить), и свойство (property), определяющее набор дополнительных параметров, которые должны быть используемы. Список параметров, а также их типы одинаковы как для компонента, так и для соответствующего свойства.

Components assigned to a node via properties Компоненты, назначенные узлу через свойства

Components give you more flexibility in implementing your logic, enabling you to: Компоненты дают вам больше гибкости в реализации вашей логики, позволяя:

  • Control which parts of code (implemented as component methods) are to be executed, and which of them are not. Управляйте тем, какие части кода (реализованные как методы компонентов) должны выполняться, а какие нет.
  • Control execution order of these parts of code. Контролировать порядок выполнения этих частей кода.
  • Repeatedly use parts of code, written once, for as many objects as you need, with no modifications required. If you want to change your code, you modify a single source (similar to NodeReferences, if we talk about content). Неоднократно используйте части кода, написанные один раз, для любого количества объектов без каких-либо изменений. Если вы хотите изменить свой код, вы изменяете единственный источник (аналогично NodeReference, если мы говорим о контенте).
  • Combine certain parts of code to be executed for certain nodes. Build a very sophisticated system from numerous small and simple blocks (like you would use a NodeReference to build a large complex structure using many simple nodes). Объедините определенные части кода, которые будут выполняться для определенных узлов. Создайте очень сложную систему из множества маленьких и простых блоков (например, вы использовали бы NodeReference для построения большой сложной структуры с использованием множества простых узлов).

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

LogicЛогика#

Logic of components is implemented via a set of methods, that are called by the corresponding functions of the world script: Логика компонентов реализована с помощью набора методов, которые вызываются соответствующими функциями скрипта world :

  • init() — create and initialize all necessary resources init() - создаются и инициализируются все необходимые ресурсы
  • updateAsyncThread() — указываются все логические функции, которые вы хотите вызывать в каждом кадре независимо от потока рендеринга.
    Примечание
    This method does not have protection locks, so it is not recommended to modify other components inside this method, unless you are absolutely sure, that these components won't be modified or removed elsewhere. Этот метод не имеет защитных блокировок, поэтому не рекомендуется изменять другие компоненты внутри этого метода, если вы не уверены, что эти компоненты не будут изменены или удалены где-либо еще.
  • updateSyncThread() — указываются все параллельные функции логики, которые вы хотите выполнить до update(). Этот метод можно использовать для выполнения некоторых ресурсоемких вычислений, таких как поиск пути, создание процедурных текстур и т.д.
    Примечание
    This method should be used to call only the API methods related to the current node: the node itself, its materials and properties. Этот метод следует использовать для вызова только тех методов API, которые относятся к текущему узлу: самому узлу, его материалам и свойствам.
  • update() — specify all logic functions you want to be called every frame update() - указываются все логические функции, которые должны вызываться в каждом кадре
  • postUpdate() — correct behavior according to the updated node states in the same frame postUpdate() - корректируется поведение в соответствии с обновленными состояниями узлов в том же кадре
  • updatePhysics() — simulate physics: perform continuous operations (pushing a car forward depending on current motor's RPM, simulating a wind blowing constantly, perform immediate collision response, etc.). updatePhysics() - выполняется симуляция физики: выполнение непрерывных операций (толкание машину вперед в зависимости от оборотов двигателя, имитация постоянного ветра, выполнение немедленных реакций на столкновение и т. д.).
  • swap() — работа с результатами метода updateAsyncThread() все остальные методы (потоки) уже выполнены и ждут. После этой функции происходят только два действия:
    • All objects that are queued for deletion are deleted. Все объекты, поставленные в очередь на удаление, удаляются.
    • Profiler is rendered. Выполняется визуализация Профайлера.
  • shutdown() — perform cleanup on world shutdown shutdown() — выполняется очистка при выключении мира.
Примечание
You can set multiple methods for each stage (e.g. multiple update() methods or just a single init()). Вы можете установить несколько методов для каждого этапа (например, несколько методов update() или только один init()).
Внимание
The updateAsyncThread(), updateSyncThread(), and updatePhysics() methods allow calling only thread-safe engine functions. Методы updateAsyncThread(), updateSyncThread() и updatePhysics() позволяют вызывать только потокобезопасные функции движка.

WorkflowРабочий процесс#

The basic workflow is as follows: Базовый рабочий процесс выглядит следующим образом:

  1. Inherit a new C++ class representing your component from the ComponentBase class. The template of this class is available in the UnigineComponentSystem.h header as a comment. Унаследуйте новый класс C ++, представляющий ваш компонент, от класса ComponentBase. Шаблон этого класса доступен в заголовке UnigineComponentSystem.h в виде комментария.
  2. In the header file determine and declare the list of parameters to be used by this component. All of these parameters with their default values (if specified) will be stored in a dedicated property file. В заголовочном файле определите и объявите список параметров, которые будут использоваться этим компонентом. Все эти параметры со значениями по умолчанию (если они указаны) будут сохранены в специальном файле свойств.
  3. Implement component logic inside the certain methods (init(), update(), postUpdate(), etc.), that will be called by the corresponding functions of the Engine's main loop. Реализуйте компонентную логику внутри определенных методов (init(), update(), postUpdate()и т. д.), которые будут вызываться соответствующими функциями основного цикла движка .
  4. Assemble the project and run it once to have the properties for all components generated. Скомпилируйте проект и запустите его один раз, чтобы сгенерировать свойства (property) для всех компонентов.
  5. Assign the created property to a node to give it the desired functionality. Назначьте созданное свойство узлу, чтобы придать ему желаемую функциональность.

Each time a property registered in the Component System is assigned to a node, an instance of the corresponding component is created. This instance will be deleted when the corresponding property is replaced with another one or removed from the node’s list, or when the node is deleted. Каждый раз, когда свойство, зарегистрированное в Системе компонентов, назначается узлу, создается экземпляр соответствующего компонента. Этот экземпляр будет удален, когда соответствующее свойство будет заменено другим или удалено из списка узла, или когда узел будет удален.

The logic of a certain component is active only when the corresponding node and property are enabled. Thus, you can enable/disable logic of each particular component at run time when necessary. Логика определенного компонента активна только тогда, когда соответствующий узел и свойство включены. Таким образом, при необходимости вы можете включать / отключать логику каждого конкретного компонента во время выполнения.

You can assign several properties corresponding to different components to a single node. The sequence, in which the logic of components is executed, is determined by the order value specified for the corresponding methods (if order values are the same or not specified, the sequence is determined in accordance with the hierarchy of nodes). Вы можете назначить несколько свойств, соответствующих различным компонентам, одному узлу. Последовательность, в которой выполняется логика компонентов, определяется значением order, указанным для соответствующих методов (если значения order совпадают или не указаны, последовательность определяется в соответствии с иерархией узлов).

Примечание
Components are assigned to nodes by property name (so beware not to create user properties having the same name as the component's property). Компоненты назначаются узлам по имени свойства (поэтому будьте осторожны, чтобы не создавать пользовательские свойства, имеющие то же имя, что и свойство компонента).

You can also create components for existing properties. Вы также можете создавать компоненты для существующих свойств.

Components can interact with other components and nodes. Компоненты могут взаимодействовать с другими компонентами и узлами.

UsageПрименение#

As an example, you can use components to implement logic of enemies chasing the player in your game: regardless of their size, shape, speed, all of them will check player's position, and try to find a path to move closer to it as fast as they can. The code will be basically the same, it'll just use different parameters (speed, mesh, or sounds maybe), so you can put all these parameters to a property (to be able to change them at any time) and the code to the corresponding component class (e.g. place enemies in the world in the init() and chase the player in the update() method). В качестве примера вы можете использовать компоненты для реализации логики преследования врагов в вашей игре: независимо от их размера, формы, скорости, все они будут проверять позицию игрока и пытаться найти путь, к которому можно приблизиться. это так быстро, как они могут. Код будет в основном таким же, он просто будет использовать другие параметры (скорость, сетку или звуки, возможно), поэтому вы можете поместить все эти параметры в свойство (чтобы иметь возможность изменять их на в любое время) и код соответствующего класса компонента (например, поместите врагов в мире в init() и преследуйте игрока методом update()).

Then you should simply assign the property to all enemy objects and set up parameters (define meshes, sounds, etc.) The Component System will do the rest: execute your code at the corresponding stages of the Engine's main loop for all enemy objects using their specific parameters. Should you decide to modify your code later, you can do that in a single source - component class. Затем вы должны просто назначить свойство всем вражеским объектам и настроить параметры (определить сетки, звуки и т. д.). Система компонентов сделает все остальное: выполните ваш код на соответствующих этапах основного цикла движка для всех вражеских объектов, используя их определенные параметры. Если вы решите изменить свой код позже, вы можете сделать это в едином исходном классе компонентов.

Integration with the Microprofile tool, enables you to monitor overall performance of the Component System, as well as to add profiling information for your components.Интеграция с инструментом Microprofile позволяет отслеживать общую производительность системы компонентов, а также добавлять информацию о профилировании для ваших компонентов.

Последнее обновление: 05.03.2021