Возможностью Unigine при создании проекта является выбор между Api на C# и C++. Для простого сравнения будет использоваться C# (все примеры будут эквивалентны и для C++).

Все игровые объекты в сцене Unity представляются в виде иерархии игровых объектов типа GameObject. В Unigine каждый "игровой объект" в мире представлен в виде иерархии Node.

Мировое позиционирование

Каждая нода в Unigine (как и игровой объект в Unity) может быть расположена глобальным/локальным образом, так и являться родительской/дочерней нодой другого объекта.

В Unigine мировое позиционирование представлено в виде Матрицы Преобразования. Матрица представляет собой таблицу 3*4.

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

Подробнее про Матричные Преобразования

Unity

Unigine

transform.position (transform.localPosition)

node.WorldPosition (node.Position)

transform.rotation (transform.localRotation)

node.GetWorldRotation (node.GetRotation)

transform.localScale

node.WorldScale (node.Scale)

//Пример изменения позиции ноды с поворотом в направлении перемещения с использованием Матрицы Преобразования
node.WorldTransform = MathLib.SetTo(newPosition, newPosition + direction, vec3.UP, MathLib.AXIS.Y);

Родительские и дочерние ноды

Каждая нода хранит перечень дочерних нод, так и ссылку на родительскую ноду, что создает иерархию в мире.

Unity

Unigine

transform.childCount

node.NumChildren

transform.parent

node.Parent

transform.GetChild(index)

node.GetChild(index)

transform.SetParent(transform)

node.SetWorldParent(node)

Иерархия нод
Иерархия нод
//Пример удаления всех дочерних нод
for(int i = 0; i < node.NumChildren; i++)
  node.GetChild(i).DeleteLater();

Подробнее о родительских/дочерних преобразованиях

Компонентная система

Ноды бывают разных видов, но каждая содержит в себе перечень изменяющихся компонентов. Каждый компонент должен наследоваться от класса Component и во время программного цикла, все основные методы компонента (Init, Update, Shutdown) будут вызываться в порядке их добавления в Node Components.

Список компонентов ноды типа PlayerActor
Список компонентов ноды типа PlayerActor

Компонентную систему можно включить и выключить во время выполнения приложения. В SDK C# компонентная система включена по умолчанию, а в C++ выключена.

Unigine::ComponentSystem::get()->initialize(); //Включает Компонентную систему C++
Unigine.ComponentSystem.SetEnabled(false); //Выключает Компонентную систему C#

Доступ к компонентам ноды, как и игрового объекта в Unity, осуществляется методом GetComponent<T>(), где T - тип компонента. Так же есть возможность добавлять компоненты в ноду методом AddComponent<T>() и удалять RemoveComponent<T>().

//Пример взаимодействия с компонентами
node.AddComponent<TestComponent>();

TestComponent testComponent = node.GetComponent<TestComponent>();
testComponent.TestMethod( DateTime.UtcNow );

node.RemoveComponent<TestComponent>();

Подробнее о Компонентной системе

Поиск нод и компонентов

Возникают моменты, когда во время выполнения приложения необходимо найти ноду по определенным критериям. Данный подход НЕ РЕКОМЕНДУЕТСЯ при поиске в мире, где много нод.

Unity

Unigine

GameObject.Find(string)

World.GetNodeByName(string)

GameObject.FindObjectsOfType<T>

FindComponentsInWorld<T>

transform.Find(string)

node.FindNode(string)

//Поиск компонента в мире
CharacterController characterController = FindComponentInWorld<CharacterController>();
characterController.SetPlayer( node as Player );

Создание и удаление нод

Создание новой ноды осуществляется двумя способами: создание ноды с нуля или создание ее экземпляра.

Unity

Unigine

GameObject.Instantiate(GameObject)

node.Clone() или World.LoadNode(string)

GameObject.Destroy(GameObject)

node.DeleteLater()

//Пример клонирования ноды
Node cloneNode = node.Clone();

for(int i = 0; i < cloneNode.NumChildren; i++)
  cloneNode.GetChild(i).DeleteLater();

Официальный сайт Unigine

Документация Unigine

Комментарии (0)