This page has been translated automatically.
Видеоуроки
Interface
Essentials
Advanced
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Professional (SIM)
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Sandworm
Использование инструментов редактора для конкретных задач
Расширение функционала редактора
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World-ноды
Звуковые объекты
Объекты поиска пути
Players
Программирование
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
UUSL (Unified UNIGINE Shader Language)
Плагины
Форматы файлов
Materials and Shaders
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.

Функции обратного вызова для обработки событий

Callback is a function wrapper representing a pointer to static and member functions which are expected to be executed with specified parameters at a certain moment. A callback can be passed as an argument to a function. Обратный вызов (коллбэк) - это обертка функции, представляющая собой указатель на статические функции и функции-члены, которые, как ожидается, будут выполнены с указанными параметрами в определенный момент. Функция обратного вызова может быть передана как аргумент другой функции.

Примечание
Callbacks are guaranteed to be reentrant and provide safe multi-threaded execution. Коллбэки гарантированно реентерабельны и обеспечивают безопасное многопоточное выполнение.

Unigine C# API lets you specify function delegates as callbacks to handle events. Unigine C # API позволяет указывать делегатов функций в качестве обратных вызовов для обработки событий.

Исходный код (C#)
void node_property_added(Node n, Property property)
{
	/* .. */
}
node.AddCallback(Node.CALLBACK_PROPERTY_NODE_ADD, node_property_added);

You can also use lambda expressions for the same event handling purpose: Вы также можете использовать лямбда-выражения для той же цели обработки событий:

Исходный код (C#)
widget_button.AddCallback(Gui.CLICKED, () => Log.Message("Button pressed\n"));

Practical UseПрактическое использование#

Callbacks are widely used in event handling. A number of Unigine API members have several predefined events which can be handled by using callbacks in certain cases. Обратные вызовы широко используются при обработке событий. У ряда членов Unigine API есть несколько предопределенных событий, которые в определенных случаях можно обрабатывать с помощью обратных вызовов.

TriggersТриггеры#

Triggers are used to detect changes in nodes position or state. Unigine offers three types of built-in triggers: Триггеры используются для обнаружения изменений положения или состояния узлов. Unigine предлагает три типа встроенных триггеров:

Here is a simple WorldTrigger usage example: Вот простой пример использования WorldTrigger:

Исходный код (C#)
using Unigine;

namespace UnigineApp
{
	class AppWorldLogic : WorldLogic
	{	
		// implement the enter callback
        void enter_callback(Node node)
        {
			Log.Message("\nA node named {0} has entered the trigger\n", node.Name);
        }
		// implement the leave callback
        void leave_callback(Node node)
        {
			Log.Message("\nA node named {0} has left the trigger\n", node.Name);
        }

		WorldTrigger trigger;
		int enter_callback_id;
		
        public override bool Init()
        {
            // create a world trigger
            trigger = new WorldTrigger(new vec3(3.0f));
            // add the enter callback to be fired when a node enters the world trigger
			//and keep its id to be used to remove the callback when necessary
            enter_callback_id = trigger.AddEnterCallback(enter_callback);
			// add the leave callback to be fired when a node leaves the world trigger
            trigger.AddLeaveCallback(leave_callback);

            return 1;
        }
	}
}

To remove the callbacks use the following code: Чтобы удалить обратные вызовы, используйте следующий код:

Исходный код (C#)
// remove the callback by using its id
trigger.RemoveEnterCallback(enter_callback_id);
// clear all leave callbacks
trigger.ClearLeaveCallbacks();
Смотрите также
  • C# API сэмпл ( <UnigineSDK>/source/csharp/samples/Api/Nodes/NodeTrigger ).
  • C# API сэмпл ( <UnigineSDK>/source/csharp/samples/Api/Nodes/WorldTrigger ).
  • C# API сэмпл ( <UnigineSDK>/source/csharp/samples/Api/Nodes/PhysicalTrigger ).

WidgetsВиджеты#

The widgets base class Widget allows registering callbacks for events defined in the GUI class. The following example shows how to create a WidgetButton and register a callback function for the CLICKED event: Базовый класс виджетов Widget позволяет регистрировать обратные вызовы для событий, определенных в классе GUI. В следующем примере показано, как создать WidgetButton и зарегистрировать функцию обратного вызова для события CLICKED:

Исходный код (C#)
// getting the system GUI
Gui gui = Gui.GetCurrent();

// creating a button widget and setting its caption
WidgetButton widget_button = new WidgetButton(gui, "Press me");

// rearranging button size
widget_button.Arrange();

// setting button position
widget_button.SetPosition(10,10);

// setting a lambda function to handle CLICKED event
widget_button.AddCallback(Gui.CLICKED, () => Log.Message("Button pressed\n"));

// adding the created button widget to the system GUI
gui.AddChild(widget_button, Gui.ALIGN_OVERLAP | Gui.ALIGN_FIXED);
Смотрите также

C# API samples located in the <UnigineSDK>/source/csharp/samples/Api/Widgets folder. Примеры C# API, расположенные в папке <UnigineSDK>/source/csharp/samples/Api/Widgets.

PhysicsФизика#

You can track certain events of the physics-related Bodies and Joints: Вы можете отслеживать определенные события связанных с физикой Bodies и Joints :

  • Body.AddFrozenCallback() to track an event when a body freezes. Body.AddFrozenCallback() для отслеживания события, когда тело замерзает.
  • Body.AddPositionCallback() to track an event when a body changes its position. Body.AddPositionCallback() для отслеживания события, когда тело меняет свое положение.
  • Body.AddContactEnterCallback() to track an event when a contact emerges (body starts touching another body or collidable surface). Body.AddContactEnterCallback() для отслеживания события, когда возникает контакт (тело начинает касаться другого тела или поверхности, подверженной столкновению).
  • Body.AddContactLeaveCallback() to track an event when a contact ends (body stops touching another body or collidable surface). Body.AddContactLeaveCallback() для отслеживания события, когда контакт заканчивается (тело перестает касаться другого тела или поверхности, подверженной столкновению).
  • Body.AddContactsCallback() to get all contacts of the body including new ones (enter) and the ending ones (leave). Leave contacts are removed after the callback execution stage, so this is the only point where you can still get them. Body.AddContactsCallback(), чтобы получить все контакты тела, включая новые ( enter ) и конечные ( leave ). Оставленные контакты удаляются после этапа выполнения обратного вызова, поэтому это единственная точка, где вы все еще можете их получить.
  • Joint.AddBrokenCallback() to track an event when a joint breaks. Joint.AddBrokenCallback() для отслеживания события при разрыве сустава.

The following sample shows the way of registering callbacks for a BodyRigid and change the color of a mesh depending on its state: В следующем примере показан способ регистрации обратных вызовов для BodyRigid и изменения цвета меша в зависимости от его состояния:

Исходный код (C#)
// create a box static mesh
Mesh mesh = new Mesh();
mesh.AddBoxSurface("box_0", new vec3(1.0f));
ObjectMeshStatic node = new ObjectMeshStatic(mesh);
node.SetMaterial("mesh_base", "*");
node.Position = new dvec3(0, 0, 5.0f);

// add a rigid body
BodyRigid body = new BodyRigid(node);

// register callbacks for events by using lambdas
body.AddFrozenCallback(b => b.GetObject().SetMaterialParameterFloat4("albedo_color", new vec4(1.0f, 0.0f, 0.0f, 1.0f), 0));
body.AddPositionCallback(b => b.GetObject().SetMaterialParameterFloat4("albedo_color", new vec4(0.0f, 0.0f, 1.0f, 1.0f), 0));
body.AddContactEnterCallback((b, num) => b.GetObject().SetMaterialParameterFloat4("albedo_color", new vec4(1.0f, 1.0f, 0.0f, 1.0f), 0));

// add a shape to the body
ShapeBox shape = new ShapeBox(body, new vec3(1.0f));
Примечание
Physics-based callbacks are executed in the main tread, as they are mainly used for creation, destruction or modification of other objects. Обратные вызовы на основе физики выполняются в основном потоке, поскольку они в основном используются для создания, уничтожения или модификации других объектов.
Смотрите также

A C# API sample located in the <UnigineSDK>/source/csharp/samples/Api/Physics/BodyCallbacks folder. Пример C # API, расположенный в папке <UnigineSDK>/source/csharp/samples/Api/Physics/BodyCallbacks.

PropertiesСвойства (Properties)#

Callback functions can be used to determine actions to be performed when adding or removing node and surface properties as well as when swapping node properties. Here is an example demonstrating how to track adding a node property via callbacks: Функции обратного вызова могут использоваться для определения действий, которые должны выполняться при добавлении или удалении свойств (properties) узла и поверхности, а также при замене свойств узла. Вот пример, демонстрирующий, как отслеживать добавление свойства узла с помощью обратных вызовов:

Исходный код (C#)
using Unigine;

namespace UnigineApp
{
	class AppWorldLogic : WorldLogic
	{	
		// implement the enabled callback
        void node_property_added(Node n, Property property)
        {
			Log.Message("Property \"{0}\" was added to the node named \"{1}\".\n", property.Name, n.Name);
			// ...
        }

		Node node;
		
        public override bool Init()
        {
			// somewhere in the code

			Properties properties = Engine.properties;

			// inheriting a new property named "my_prop" from the base property "node_base"
			properties.FindManualProperty("node_base").Inherit("my_prop");

			// setting our callback function on adding a node property
			node.AddCallback(Node.CALLBACK_PROPERTY_NODE_ADD, node_property_added);

			// adding the property named "my_prop" to the node
			node.AddProperty("my_prop");

            return true;
        }
	}
}

You can add callbacks to track any changes made to a property and its parameters and perform certain actions. Вы можете добавить обратные вызовы, чтобы отслеживать любые изменения, внесенные в свойство и его параметры, и выполнять определенные действия.

The example below shows how to add a callback to track changes of property parameters and report the name of the property and the changed parameter. В приведенном ниже примере показано, как добавить обратный вызов для отслеживания изменений параметров свойства и сообщить имя свойства и измененный параметр (предположим, что у нас есть ручное свойство с именем my_prop с целочисленным параметром с именем my_int_param).

Исходный код (C#)
using Unigine;

namespace UnigineApp
{
	class AppWorldLogic : WorldLogic
	{	
		// implement the parameter changed callback
        void parameter_changed(Property property, int num)
        {
			Log.Message("Parameter \"{0}\" of the property \"{1}\" has changed its value.\n", property.GetParameterPtr(num).Name, property.Name);
			// ...
        }

        public override bool Init()
        {
			// somewhere in the code

			// getting a manual property named "my_prop" via the Property Manager
			Property property = Properties.FindManualProperty("my_prop");

			// setting our callback function on parameter change
			property.AddCallback(Property.CALLBACK_PARAMETER_CHANGED, parameter_changed);

			// changing the value of the "my_int_param" parameter
			property.SetParameterInt(property.FindParameter("my_int_param"), 3);

            return true;
        }
	}
}

You can also add callbacks to the Properties manager to track any changes made to any property and perform certain actions: Вы также можете добавить обратные вызовы диспетчеру Properties для отслеживания любых изменений, внесенных в любое свойство, и выполнения определенных действий:

Исходный код (C#)
public void property_removed(Property property)
{
	Log.Message("Property \"{0}\" was removed.\n", property.getName());
    // ...
}

// somewhere in the code

Properties properties = Engine.properties;

// inheriting a new property named "my_prop" from the base property "surface_base"
Property property = properties.FindManualProperty("surface_base").Inherit("my_prop");

// setting our callback function on property removal
properties.AddCallback(Properties.CALLBACK_REMOVED, property_removed);

// removing the property named "my_prop"
properties.RemoveProperty(properties.FindProperty("my_prop").GetGUID());

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

These are not all usage examples of event handling callbacks. The following list contains more API members supporting event handling: Это не все примеры использования обратных вызовов обработки событий. Следующий список содержит другие члены API, поддерживающие обработку событий:

  • UserInterface - for handling events from widgets created by loading a UI file. UserInterface - для обработки событий от виджетов, созданных путем загрузки файла пользовательского интерфейса.
  • Render - callback functions can be used to get access to buffers and matrices at intermediate stages of the rendering sequence. Render - функции обратного вызова могут использоваться для получения доступа к буферам и матрицам на промежуточных этапах последовательности рендеринга .
  • Console supports adding a callback function that will be executed when a text is output to the console. Console поддерживает добавление функции обратного вызова, которая будет выполняться при выводе текста на консоль.
  • EditorLogic - a set of editor callback functions can be overridden for certain purposes. EditorLogic - набор функций обратного вызова редактора может быть переопределен для определенных целей.
  • ComponentBase - there may be performed certain actions on destroying a component. ComponentBase - могут быть выполнены определенные действия по уничтожению компонента.
  • AsyncQueue - сallback functions can be used to determine actions to be performed when certain resources are loaded. AsyncQueue - функции обратного вызова могут использоваться для определения действий, выполняемых при загрузке определенных ресурсов.
  • WorldSplineGraph provides a set of callbacks for handling actions on editing points and segments. WorldSplineGraph предоставляет набор обратных вызовов для обработки действий по редактированию точек и сегментов.
  • Viewport - callback functions can be used to get access to buffers and matrices at intermediate stages of the rendering sequence. Viewport - функции обратного вызова могут использоваться для получения доступа к буферам и матрицам на промежуточных этапах последовательности рендеринга .

Плагины:

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