Возможностью 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.
Компонентную систему можно включить и выключить во время выполнения приложения. В 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();