Перейти к содержимому

Mesh collider unity что это

  • автор:

Меш-коллайдер (Mesh Collider)

Mesh Collider использует меш ассет для создания под него коллайдера на основе этого меша. Это гораздо удобнее, чем использовать примитивы для определения столкновений сложных мешей. Меш коллайдеры, которые помечены как Convex могут взаимодействовать (сталкиваться) с другими меш коллайдерами.

Свойства

Свойство: Функция:
Is Trigger Если включён, то этот коллайдер будет игнорироваться физическим движком и использоваться для запуска событий.
Material Ссылка на физический материал, который определяет, как данный коллайдер взаимодействует с другими.
Mesh Ссылка на меш, используемый для столкновений.
Convex При включении, текущий меш коллайдер будет взаимодействовать с другими меш коллайдерами. Выпуклые (Convex) меш коллайдеры ограничены 255 треугольниками.

Детали

The Mesh Collider builds its collision representation from the Mesh attached to the GameObject, and reads the properties of the attached Transform to set its position and scale correctly. The benefit of this is that the shape of the collider can be exactly the same as the shape of the visible mesh for the object, resulting in more precise and authentic collisions. However, this precision comes with a higher processing overhead than collisions involving primitive colliders (sphere, box, capsule) and so it is best to use Mesh Colliders sparingly.

Меши, служащие для расчёта столкновений, используют отсечение невидимых поверхностей. Если объект столкнётся с таким мешем визуально, то он также столкнётся с ним и физически.

Есть кое-какие ограничения в использовании меш коллайдеров. Обычно два меш коллайдера не могут столкнуться друг с другом. Все меш коллайдеры могут сталкиваться с примитивными коллайдерами. Если ваш меш помечен как Convex , то он сможет сталкиваться с другими меш коллайдерами.

Note that versions of Unity before 5.0 had a Smooth Sphere Collisions property for the Mesh Collider in order to improve interactions between meshes and spheres. This property is now obsolete since the smooth interaction is standard behaviour for the physics engine and there is no particular advantage in switching it off.

Как использовать функции столкновений в Unity: OnCollisionEnter/Stay/Exit, OnTriggerEnter…

Столкновения (Collisions) играют важную роль в компьютерных играх. Это, пожалуй, не конкретная механика, а объемный пласт взаимодействия между игровыми объектами.

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

Предполагается, что вы уже знаете Unity и С# на базовом уровне: посмотрели один-два туториальчика, почитали парочку статей, успели потыкать в движке что-то самостоятельно и хотите продолжать развиваться

Как работает система столкновений? Что такое коллайдеры?

Система столкновений Unity работает за счет коллайдеров (Colliders).

Коллайдер — это компонент, который представляет собой невидимые «границы» объекта.

Часто они совпадают с формой самого объекта (как в реальном мире), хотя это и не обязательно.

Unity поддерживает разнообразные формы коллайдеров:

  • BoxCollider — форма прямоугольного параллелепипеда
  • SphereCollider — сфера
  • CapsuleCollider — капсула (математически, сфероид или эллипсоид вращения)
  • MeshCollider — кастомная форма 3Д-меша, соответствующая форме самого меша.
  • BoxCollider2D — прямоугольник
  • CircleCollider2D — круг
  • PolygonCollider2D — кастомная форма 2Д-спрайта, повторяющая форму самого спрайта.
  • .

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

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

В героя попала шальная пуля: мы зафиксируем это и уменьшим его здоровье.

Герой бежит и упирается в стену: он не может пробежать сквозь стену, потому что они оба имеют границы.

Триггеры

Триггеры — это те же коллайдеры. Серьезно, всего одна галочка в любом компоненте коллайдера превращает его в триггер!

Но триггеры «физически прозрачны». Другими словами, объекты, помеченные как триггеры*, не являются твердыми телами и пропускают любое другое тело сквозь себя.

Триггеры в основном используют как некие зоны, или области, попадание в которые влечет за собой какие-то последствия. Например:

Комната в ядовитым газом — это один большой триггер: герой проходит сквозь него без физического взаимодействия, но все время, пока герой внутри, он получает пассивный урон от яда.

Зона видимости врага — тоже триггер: когда герой находится в этой зоне, враг видит его и стреляет по нему.

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

Обработка столкновений

Самое интересное и важное: как правильно из кода узнать, что столкновение произошло и обработать это?

Для этого разработчики Unity подкатили нам целую набор функций. Предлагаю на практике подробно рассмотреть как работает одна из них, а потом на ее примере обсудим другие.

Итак, перед вами сцена с большой платформой, кубиком и шариком (а также небольшим освещением). Давайте сделаем так, чтобы при падении шарика на кубик последний уничтожался.

Давайте повесим коллайдеры на объекты: на шарик — SphereCollider , на кубик — BoxCollider . Помимо этого, обоим объектам добавим компонент Rigidbody .

Скорее всего, вы уже знаете, что Rigidbody — это компонент, который добавляет объектом физику. Именно благодаря ему шарик будет падать, а при соприкосновении с кубиком — отскочит от него.

Создадим скрипт Ball.cs в папке Scripts. Сразу повесим его на шарик, чтобы потом не забыть. В скрипт нужно добавить следующий код:

public class Ball : MonoBehaviour < private void OnCollisionEnter(Collision collision) < print("Collision detected"); >>

Функция OnCollisionEnter будет вызвана автоматически, когда шарик соприкоснется с чем-либо. Самим где-либо вызывать ее не надо.

Попробуйте запустить код и убедитесь, что в консоль выводится нужная фраза при столкновении с кубиком.

Единственный аргумент collision хранит информацию о столкновении. В частности он содержит переменную gameObject , в которой хранится объект, с которым произошло столкновение.

Попробуйте заменить print(«Collision detected») на print(collision.gameObject) и увидите, что при столкновении в консоль выводится информация о нашем кубике:

Теперь вместо принта будем удалять этот самый кубик:

private void OnCollisionEnter(Collision collision)

Функция Destroy() позволяет уничтожить какой-либо объект. Первым аргументом она принимает сам объект (в нашем случае кубик), а вторым — опционально — через сколько секунд должно произойти уничтожение.

Сохраните скрипт и запустите игру, чтобы увидеть, как шарик уничтожает сначала кубик, а затем — неожиданно — и пол! Да, ведь пол — это такой же объект, который имеет коллайдер (можете проверить:)

Как сделать чтобы пол не удалялся?

Самым правильным будет повесить на пол специальный тег, по которому его можно будет отличить от других объектов. Для этого выберите пол, создайте новый тег в инспекторе, нажав «Add Tag. » и назовите его Floor . После этого вновь выберите пол и прикрепите к нему этот тег (он появится в списке).

Теперь добавим в код проверку, чтобы уничтожать только те объекты, которые НЕ имеют тега «Floor»:

private void OnCollisionEnter(Collision collision) < if (collision.gameObject.tag != "Floor") < Destroy(collision.gameObject); >>

(Ну, или можно было все оставить как есть и сказать, что это не баг, а фича)

Перейдем к другим функциям

Не закрывайте проект. Замените написанную функцию на такую:

private void OnCollisionStay(Collision collision)

Запустив проект, вы увидите, что строка выводится в консоль каждый божий кадр.

Функция OnCollisionStay срабатывает каждый* кадр, когда объекты соприкасаются хоть чуть-чуть.

А функция OnCollisionExit срабатывает всего один кадр — когда касание прекратилось.

* На самом деле, не совсем: это физическая функция и она срабатывает каждый физический кадр. Детское объяснение в одну строку: Unity обрабатывает физику отдельно от не-физики: физика обрабатывается только в «физических кадрах», коими являются не все.

Опять к триггерам

Обсудим теперь триггеры. Вы можете попробовать отметить галочку «Is Trigger» в компоненте SphereCollider у шара. Запустив игру вы моментально поймете, что такое триггеры, если у вас пока не сложилось представление:)

Перейдите теперь на другую сцену, TriggersLesson, в папке «Scenes». Запустив игру вы увидите, что играете за капсулу, превращать которую в нормального героя мне было лень:)

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

Помним, что эта зона — триггер (можете в этом убедиться, в компоненте коллайдере отмечена галочка IsTrigger), а потому будем использовать триггерные функции. Найдем в папке Scripts файл Player.cs . Он уже содержит некоторые функции, отвечающие за перемещение игрока. Добавьте в конце еще несколько функций:

private void OnTriggerEnter(Collider other)

Обратите внимание, что триггерные функции НЕ принимают в качестве аргумента объект типа Collision, т.е. информацию о столкновении, так как самого столкновения не было. Вместо этого они просто хранят ссылку на компонент-коллайдер того объекта, с которым столкнулись. В нашем случае, так как скрипт висит на герое, переменная other ссылаться на саму зону.

Мы проверяем, является ли она нашим триггером и увеличиваем объект.

Если оставить все как есть, то в круг можно несколько раз входить-выходить и достигнуть гигантских размеров. Давайте это исправим:)

private void OnTriggerExit(Collider other) < if (other.gameObject.tag == "FireZone") transform.localScale /= 2; >

Похожая функция: проверяем, вошли ли мы действительно в зону и уменьшаем игрока.

private void OnTriggerStay(Collider other) < if (other.gameObject.tag == "FireZone") < Color color = new Color(Random.Range(0f, 1f), Random.Range(0f, 1f), Random.Range(0f, 1f)); GetComponent().material.color = color; > >

Эта функция создаст разноцветное случайное мерцание. Мы просто меняем цвет материала, примененного к мешу. Для этого мы обращаемся к компоненту MeshRenderer.

Кстати, каждый кадр использовать GetComponent() — плохая практика. Это сильно бьет по производительности. Поэтому компоненты стоит кэшировать. Я уже сделал это в 9-й и 14-й строках: объявил переменную и инициализировал ее в функции Awake. Теперь просто замените вызов GetComponent() на переменную _mesh .

Кстати, закэшировал я и компонент Rigidbody , который мне тоже нужен каждый кадр для перемещения персонажа.

Мне кажется, эта статья итак уже выходит довольно длинной, поэтому я опишу как использовать 2Д-версии функций столкновения в следующей статье (если она будет. )

ДЗ:

В качестве практики предлагаю вам поработать с обеими сценами. Например, можно сделать следующее:

  1. На первой сцене вместо скрипта для шарика напишите скрипт для кубика, который будет изменять цвет шарика на, скажем, зеленый, когда коснется его. Возьмите код изменения цвета из конца урока и убедитесь, что кубик случайно не красит еще и пол!
  2. На второй сцене выньте камеру из персонажа в иерархии, размножьте их на сцене и полностью перепишите их скрипт, чтобы они бегали в случайные стороны. А потом создайте скрипт для огненной зоны, в котором реализуйте все, что мы делали в этом уроке. Теперь у вас по карте бегает куча недоделанных миньонов, каждый из которых вырастает и мелькает, когда попадает в огненную зону!

На этом все!

P.S. Это моя первая статья. Буду рад увидеть комментарии с конструктивной критикой. Также готов ответить на вопросы в комментариях.

P.P.S. Кто-нибудь знает, куда люди обычно прикрепляют ссылки, такие как у меня здесь — на папку с игрой? А то на гугл диске не очень хочется место занимать, а онлайн-файлообменники позволяют расположить файлы только на конкретные срок.

Коллайдеры (Colliders)

Collider components define the shape of an object for the purposes of physical collisions. A collider, which is invisible, need not be the exact same shape as the object’s mesh and in fact, a rough approximation is often more efficient and indistinguishable in gameplay.

The simplest (and least processor-intensive) colliders are the so-called primitive collider types. In 3D, these are the Box Collider, Sphere Collider and Capsule Collider. In 2D, you can use the Box Collider 2D and Circle Collider 2D. Any number of these can be added to a single object to create compound colliders.

With careful positioning and sizing, compound colliders can often approximate the shape of an object quite well while keeping a low processor overhead. Further flexibility can be gained by having additional colliders on child objects (eg, boxes can be rotated relative to the local axes of the parent object). When creating a compound collider like this, there should only be one Rigidbody component, placed on the root object in the hierarchy.

Note, that primitive colliders will not work correctly with shear transforms — that means that if you use a combination of rotations and non-uniform scales in the Transform hierarchy so that the resulting shape would no longer match a primitive shape, the primitive collider will not be able to represent it correctly.

Однако существуют случаи, где даже составные коллайдеры недостаточно точны. В 3D вы можете использовать Mesh Colliders, чтобы создать коллайдер, идентичный по форме мешу объекта. В 2D Polygon Collider 2D сгенерирует форму примерно совпадающую с графикой спрайта. Не идеально, но вы можете изменить его форму до любого уровня детализации. Эти коллайдеры нагружают процессор сильнее, чем примитивные коллайдеры, так что используйте их экономно, чтобы сохранить высокую производительность. Также Mesh Collider не сможет сталкиваться с другими Mesh Collider (другими словами, при их контакте ничего не произойдёт). В некоторых случаях вы можете обойти это пометив Mesh Collider в инспекторе как Convex (выпуклый). Это создаст коллайдер формы “выпуклой оболочки”, который такой же, как и оригинальный меш, но с “заполненными” углублениями. Польза от этого в том, что выпуклый Mesh Collider может сталкиваться с другими Mesh Collider, так что вы сможете использовать эту функцию, когда у вас есть двигающийся персонаж с подходящей формой. Тем не менее хорошим общим правилом будет использование Mesh Collider для геометрии сцены, и имитировать приближённую к реальности форму для двигающихся объектов с помощью примитивных коллайдеров.

Для создания пола, стен и других неподвижных элементов сцены, к объектам без компонента Rigidbody можно добавлять коллайдеры. Они называются static (статичными) коллайдерами. Обычно вам не следует перемещать статичные коллайдеры изменяя положение их трансформации, т.к. это сильно повлияет на производительность физического движка. Коллайдеры на объекте, у которого есть Rigidbody, известны как динамичные коллайдеры. Статичные коллайдеры могут взаимодействовать с динамичными коллайдерами, но, т.к. у них нету Rigidbody, они не сдвинутся в ответ на коллизии (столкновения).

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

Физические материалы (Physics Materials)

Когда коллайдеры взаимодействуют, их поверхностям надо симулировать свойства материала, из которого они теоретически должны состоять. Например, слой льда будет более скользким, в то время как резиновый мяч будет предлагать больше трения и будет очень упругим. Хотя форма коллайдеров и не деформируется во время коллизий, их трение и упругость можно настроить используя физические материалы (Physics Materials). Настроить параметры так, как хочется, можно методом проб и ошибок, но, например, материал льда будет иметь нулевое (или очень маленькое) трение, а резиновый материал будет с большим показателем трения и почти идеальной упругостью. Для дополнительной информации по доступным параметрам, читайте страницы справки Physic Material и Physics Material 2D. Учтите, что, по историческим причинам, 3D ассет называется Physic Material, в то время как 2D эквивалент называется Physics Material 2D (с “s” после “Physic”).

Триггеры (Triggers)

В случае столкновения, система скриптинга может это обнаружить и выполнить действия, указанные в функции OnCollisionEnter . Однако вы также можете использовать физический движок просто для обнаружения того, что один коллайдер входит в пространство другого, без создания коллизии. Коллайдер, настроенный как триггер (с помощью свойства Is Trigger), не ведёт себя как твёрдый объект и просто будет пропускать другие коллайдеры сквозь себя. Когда другой коллайдер войдёт “на территорию” этого коллайдера, триггер вызовет функцию OnTriggerEnter в скриптах объекта, к которому присоединён триггер.

Collision callbacks for scripts

When collisions occur, the physics engine calls functions with specific names on any scripts attached to the objects involved. You can place any code you like in these functions to respond to the collision event. For example, you might play a crash sound effect when a car bumps into an obstacle.

On the first physics update where the collision is detected, the OnCollisionEnter function is called. During updates where contact is maintained, OnCollisionStay is called and finally, OnCollisionExit indicates that contact has been broken. Trigger colliders call the analogous OnTriggerEnter , OnTriggerStay and OnTriggerExit functions. Note that for 2D physics, there are equivalent functions with 2D appended to the name, eg, OnCollisionEnter2D . Full details of these functions and code samples can be found on the Script Reference page for the MonoBehaviour class.

У обычных не триггерных коллизий есть ещё дополнительная деталь: как минимум один из вовлечённых в коллизию объектов должен обладать не кинематическим Rigidbody (т.е. IsKinematic должен быть выключен). Если оба объекта являются кинематическими, то тогда не будут вызываться функции, вроде OnCollisionEnter и т.д. С триггерными столкновениями это условие не применяется, так что и кинематические и не кинематические Rigidbody будут незамедлительно вызывать OnTriggerEnter при пересечении триггерного коллайдера.

Взаимодействия коллайдеров

Коллайдеры взаимодействуют друг с другом по разному, в зависимости от того, как настроены их компоненты Rigidbody. Тремя важными конфигурациями являются статичный коллайдер (Static Collider) (т.е. компонент Rigidbody отсутствует вообще), Rigidbody коллайдер (Rigidbody Collider), и кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider).

Статичный коллайдер (Static Collider)

Это игровой объект, у которого есть коллайдер, но нету Rigidbody. Статичные коллайдеры используются для геометрии уровней, которая всегда стоит на месте и совсем не двигается. Встречные Rigidbody объекты будут врезаться в статичный коллайдер, но его не сдвинут.

The physics engine assumes that static colliders never move or change and can make useful optimizations based on this assumption. Consequently, static colliders should not be disabled/enabled, moved or scaled during gameplay. If you do change a static collider then this will result in extra internal recomputation by the physics engine which causes a major drop in performance. Worse still, the changes can sometimes leave the collider in an undefined state that produces erroneous physics calculations. For example a raycast against an altered Static Collider could fail to detect it, or detect it at a random position in space. Furthermore, Rigidbodies that are hit by a moving static collider will not necessarily be “awoken” and the static collider will not apply any friction. For these reasons, only colliders that are Rigidbodies should be altered. If you want a collider object that is not affected by incoming rigidbodies but can still be moved from a script then you should attach a Kinematic Rigidbody component to it rather than no Rigidbody at all.

Rigidbody коллайдер (Rigidbody Collider)

Это игровой объект, к которому прикреплён коллайдер и нормальный не кинематический Rigidbody. Rigidbody коллайдеры полностью симулируются физическим движком и могут реагировать на коллизии и силы, приложенные из скрипта. Они могут сталкиваться с другими объектами (включая статичные коллайдеры) и являются самой распространённой конфигурацией коллайдера в играх, которые используют физику.

Кинематические Rigidbody коллайдеры (Kinematic Rigidbody Collider)

Это игровой объект, к которому прикреплён коллайдер и кинематический Rigidbody (т.е. свойство IsKinematic компонента Rigidbody включено). Изменяя компонент Transform, вы можете перемещать объект с кинематическим Rigidbody, но он не будет реагировать на коллизии и приложенные силы так же, как и не кинематические Rigidbody. Кинематические Rigidbody должны использоваться для коллайдеров, которые могут двигаться или периодически выключаться/включаться, иначе они будут вести себя как статичные коллайдеры. Примером этого является скользящая дверь, которая обычно является недвижимым физическим препятствием, но по надобности может открываться. В отличие от статичного коллайдера, движущийся кинематический Rigidbody будет применять трение к другим объектам и, в случае контакта, будет “будить” другие Rigidbody.

Даже когда они неподвижны, кинематические Rigidbody коллайдеры ведут себя иначе, в отличие от статичных коллайдеров. Например, если коллайдер настроен как триггер, то вам также понадобится добавить к нему Rigidbody, чтобы можно было в вашем скрипте принимать события триггера. Если вы не хотите, чтобы триггер падал под действием силы гравитации или подвергался влиянию физики, то тогда вы можете включить свойство IsKinematic.

A Rigidbody component can be switched between normal and kinematic behavior at any time using the IsKinematic property.

A common example of this is the “ragdoll” effect where a character normally moves under animation but is thrown physically by an explosion or a heavy collision. The character’s limbs can each be given their own Rigidbody component with IsKinematic enabled by default. The limbs will move normallly by animation until IsKinematic is switched off for all of them and they immediately behave as physics objects. At this point, a collision or explosion force will send the character flying with its limbs thrown in a convincing way.

Матрица действий коллизии

Когда сталкиваются 2 объекта, количество различных событий в скрипте зависит от конфигураций компонентов Rigidbody столкнувшихся объектов. Схемы ниже содержат детали того, какие функции событий будут вызваны, основываясь на присоединённых к объектам компонентах. В некоторых комбинациях эффект производится только на один из двух объектов, так что помните правило — законы физики не применяются к объектам, у которых нет присоединённого Rigidbody.

Происходит определение столкновений, и при их возникновении посылаются сообщения
Статичный коллайдер (Static Collider) Rigidbody коллайдер (Rigidbody Collider) Кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider) Статичный коллайдер-триггер (Static Trigger Collider) Rigidbody коллайдер-триггер (Rigidbody Trigger Collider) Кинематический Rigidbody коллайдер-триггер (Kinematic Rigidbody Trigger Collider)
Статичный коллайдер (Static Collider) Да
Rigidbody коллайдер (Rigidbody Collider) Да Да Да
Кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider) Да
Статичный коллайдер-триггер (Static Trigger Collider)
Rigidbody коллайдер-триггер (Rigidbody Trigger Collider)
Кинематический Rigidbody коллайдер-триггер (Kinematic Rigidbody Trigger Collider)
При коллизиях отсылаются сообщения триггера
Статичный коллайдер (Static Collider) Rigidbody коллайдер (Rigidbody Collider) Кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider) Статичный коллайдер-триггер (Static Trigger Collider) Rigidbody коллайдер-триггер (Rigidbody Trigger Collider) Кинематический Rigidbody коллайдер-триггер (Kinematic Rigidbody Trigger Collider)
Статичный коллайдер (Static Collider) Да Да
Rigidbody коллайдер (Rigidbody Collider) Да Да Да
Кинематический Rigidbody коллайдер (Kinematic Rigidbody Collider) Да Да Да
Статичный коллайдер-триггер (Static Trigger Collider) Да Да Да Да
Rigidbody коллайдер-триггер (Rigidbody Trigger Collider) Да Да Да Да Да Да
Кинематический Rigidbody коллайдер-триггер (Kinematic Rigidbody Trigger Collider) Да Да Да Да Да Да

Руководство по программированию облачных сценариев

В этом руководстве описывается использование API облачных сценариев Сетки и средств разработчика для создания сред (они начинаются как проекты в Unity, а затем передаются в коллекцию Mesh). Рекомендуется сначала ознакомиться с разделом Настройка инфраструктуры облачных сценариев в Azure , чтобы ознакомиться с основными понятиями и базовой архитектурой облачного скрипта Mesh.

В этом разделе описываются функции и интерфейс API cloud scripting Mesh, который используется для написания скриптов, которые управляют поведением в средах.

Базовая структура DOM

Структура DOM отражает структуру сцены Unity. Элемент «Сцена» приложения соответствует игровому объекту, к которому подключен компонент mesh Cloud Scripting. Следующие классы API облачных сценариев Mesh сопоставляют один к одному с объектами Unity, созданными в редакторе:

  • GameObject (& Transform Component) —> TransformNode
  • Компонент освещения —> PointLightNode, SpotLightNode, DirectionalLightNode
  • Компонент Animator —> AnimationNode (и производные классы, см. ниже)
  • Компонент Box Collider —> BoxGeometryNode
  • Компонент Sphere Collider —> SphereGeometryNode
  • Компонент капсульного коллайдера —> CapsuleGeometryNode
  • Компонент сетчатого коллайдера —> MeshGeometryNode
  • Компонент Text Mesh Pro —> TextNode
  • Компонент Rigidbody —> RigidBodyNode

Например, если вы создаете сцену с игровым объектом, который имеет компонент Light (задается в точечный свет) и подключенный шарный коллайдер, сцена будет содержать TransformNode с двумя дочерними элементами: PointLightNode и SphereGeometryNode.

Кроме того, некоторые объекты API облачных сценариев Mesh не имеют соответствующих встроенных компонентов Unity. Это дополнительные компоненты, которые можно создать в Unity, которые входят в пакет набора средств сетки.

  • Компонент cloud scripting Mesh (описано выше)
  • Компонент WebSlate

Сопоставление модели Unity DOM с моделью DOM сетки

Вы можете создать сцену с компонентами, о которые API облачных сценариев сетки не знает. Они просто не будут существовать в модели модели сценариев Mesh Cloud для сцены. Однако полная структура сцены GameObjects будет отражена в API DOM как TransformNodes.

Unity имеет форму API GameObject/component; однако модель DOM облачных сценариев Mesh имеет одну древовидную структуру. TransformNode в API облачных сценариев mesh имеет дочерние элементы, которые могут быть другими transformNodes или другими узлами, которые сопоставляются с компонентами. Мы можем рассматривать это как объединенный список компонентов связанного игрового объекта и дочерних элементов его компонента преобразования.

Преобразование rect

При добавлении компонента, использующего RectTransform, например компонента Text Mesh Pro, игровой объект не будет отображаться как Node в графе сцены сценариев Mesh Cloud. Такой компонент по-прежнему можно перемещать, включать и отключать, но для этого необходимо заключить игровой объект с помощью RectTransform в другой игровой объект с помощью обычного компонента Преобразования.

События изменения свойств

Вы можете подписаться на события изменения свойств, вызвав вызов AddPropertyChangedEventHandler на любом узле в иерархии. Необходимо передать имя свойства в виде строки.

Также можно подписаться на все события, подписавшись на DomObjectPropertyChanged событие. Вызывается при изменении любого свойства в модели DOM.

Жизненный цикл объекта

При создании узлы не являются неродимыми. Это означает, что они не будут видны в сцене, пока они не будут явно добавлены в качестве дочернего элемента в сцену или одного из ее потомков. Аналогичным образом установка для родительского узла значения NULL приведет к удалению его и его потомков из сцены.

Иногда требуется временно отключить узел, но не вести запись о том, где он находился в сцене. По этой причине каждый узел имеет флаг «активный». Если задано значение false, узел и его потомки будут отключены.

В Unity можно создавать игровые объекты и компоненты, которые являются частью сцены, но отключены. Они будут отображаться как узлы в иерархии сцены mesh Cloud Scripting, но для активного флага будет установлено значение false. Если установить для активного флага значение true, они будут активированы в сцене Unity.

Клонирование и повторное развертывание

Узлы могут быть клонированы и повторно преобразованы в API облачных сценариев сетки; соответствующая сцена Unity обновится соответствующим образом. Если клонировать узел, он клонирует этот узел и все его дочерние элементы (включая дочерние элементы, которые могут находиться в соответствующих объектах Unity, но не видны для Cloud Scripting Mesh).

Можно клонировать или повторно напарачивать узлы, соответствующие компонентам Unity. Это реализуется путем повторного создания этих компонентов Unity на основе представлений узла сценариев в облаке сетки. Клонировать или повторно создать только узлы, которые можно создать с помощью API облачных сценариев mesh. Если вы создали компонент в Unity и задали поля, которые не отражены в соответствующем узле cloud scripting Node, эти поля будут сброшены до значений по умолчанию, если клонирован сам узел. По этой причине рекомендуется клонировать или повторно создавать узлы преобразования, в которых вы управляете объектами, созданными в Unity. Они всегда будут правильно сохранять все исходные параметры Unity.

Пользователи

В API есть различные места, предоставляющие свойства пользователя. Свойство User.Identifier является строкой постоянного идентификатора, которая является постоянной для пользователя, даже если пользователь покидает и повторно присоединится. Отображаемое имя пользователя также доступно через User.DisplayName . Идентификатор события, из которого пользователь подключился, доступен через User.ConnectedEventId .

Во время разработки отображаемое имя пользователя, идентификатор и идентификатор события можно имитировать в редакторе компонента Mesh Cloud Scripting в разделе «Параметры разработчика», как показано ниже.

Макет свойств пользователя

Аватары

Аватары — это представление пользователей в сцене. Их можно использовать для телепортирования пользователей в заданное расположение, перемещения между сценами и обнаружения столкновений с триггерными томами.

Информационные диалоги

В cloud Scripting можно открыть диалоговое окно пространства экрана в приложении Microsoft Mesh с пользовательским сообщением. SceneNode содержит функцию для этого , ShowMessageToParticipants(string message, IReadOnlyCollection participants) . Теги форматированного текста можно использовать в сообщении для управления свойствами текста (цветом, полужирным шрифтом и т. д.).

Классы

CloudApplication

Интерфейс ICloudApplication является отправной точкой для разработки приложений сетки. Он доступен в app.cs в качестве переменной _app. Помимо сцены, ICloudApplication имеет функции создания для всех доступных типов. Он также имеет ряд других методов, но они используются для внутреннего использования.

InteractableNode

MeshInteractableSetup — это пользовательский компонент Unity, который входит в пакет набора средств сетки. При присоединении к игровому объекту в Unity он вызывает события щелчка, когда любой пользователь щелкает любой из активных конфликтующих объектов в этом игровом объекте или его дочерних элементах.

Ниже показан простой пример, в котором компонент MeshInteractableSetup добавляется в тот же игровой объект, что и коллайдер box:

Пример простого ввода

WebSlateNode

WebSlate — это пользовательский компонент Unity, который входит в пакет набора средств сетки. Чтобы добавить заготовку WebSlate в сцену, выберите GameObject>Mesh Toolkit>WebSlate в строке меню. Веб-сайт, назначенный свойству URL-адреса экземпляра WebSlate, отображается на четырехугольнике этого заготовки.

Ниже показан пример, в котором в сцену добавлена префаб WebSlate и назначен URL-адрес:

 var webSlateNode = Root.FindFirstChild(true); webSlateNode.Url = new System.Uri("https://en.wikipedia.org/wiki/Color"); 

Пример WebSlate

Прослушивание щелчков

Ниже приведен простой скрипт Mesh Cloud Scripting, который поворачивает куб при каждом щелчке. Замените метод-заглушку StartAsync внутри App.cs этим кодом.

 private float _angle = 0; public Task StartAsync(CancellationToken token) < // First we find the TransformNode that corresponds to our Cube gameobject var transform = _app.Scene.FindFirstChild(); // Then we find the InteractableNode child of that TransformNode var sensor = transform.FindFirstChild(); // Handle a button click sensor.Selected += (_, _) => < // Update the angle on each click _angle += MathF.PI / 8; transform.Rotation = new Rotation < X = 1, Y = 0, Z = 0, Angle = _angle >; >; return Task.CompletedTask; > 

Сведения о попадании

Можно узнать, какой пользователь щелкнул коллайдер, просмотрев аргументы события изменения свойства. Вы также можете прочитать обычный контакт и положение щелчка из аргументов события. Эти координаты будут относительно локального пространства координат Объекта InteractableNode.

Аниматоры

Вы можете создать и добавить аниматор Unity в сцену и управлять им с помощью облачных сценариев Mesh. Подключаемый модуль набора средств сетки будет просматривать ресурсы в проекте Unity, и для каждого найденного animator он создаст класс в папке AnimationScripts в проекте Mesh Cloud Scripting. Этот класс является производным от AnimationNode и может использоваться для управления аниматором из облачного скрипта Mesh. При добавлении Animator в качестве компонента к игровому объекту в Unity вы найдете соответствующий экземпляр созданного класса в качестве дочернего элемента соответствующего TransformNode. С помощью API этого класса можно управлять аниматором.

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

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

В состоянии можно создать клип анимации без ограничений на значения, которые можно задать в сцене Unity. Кроме того, поддерживаются клипы анимации в цикле. В AnimationNodes не поддерживаются следующие функции аниматоров:

  • Переходы. Если вы добавите переходы в аниматор, вы не сможете активировать их с помощью API облачных сценариев сетки (сервер не моделировает переходы).
  • Переменные (кроме с плавающей запятой для перемещения времени движения). Переменные, используемые для управления логикой перехода или множителями скорости, не поддерживаются.
  • Зеркальные состояния, смещение цикла и IK ноги.

Позднее присоединение и аниматоры

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

Начальное состояние аниматора

Рекомендуется создавать аниматоры с состояниями по умолчанию, которые ничего не делают. Когда сцена начинает воспроизводиться в Unity, она активирует все аниматоры и начнет воспроизводить их анимации по умолчанию. Это может произойти до подключения к облачной службе сценариев сетки. следовательно, нет способа синхронизировать эти состояния, и поведение может быть не так, как требуется.

Повторное создание и клонирование аниматора

AnimationNodes нельзя создать с помощью API облачных сценариев Mesh. Единственный способ создать AnimationNode — экспортировать сцену Unity, содержащую компонент Animator. При попытке клонирования или повторного распространения AnimationNode вы получите сообщение об ошибке, так как это действие не поддерживается. По-прежнему можно клонировать или перенародить родительский объект AnimationNode, так как он соответствует объекту Unity Game Object, который может быть клонирован и воспитан.

Заметки о созданном коде

Созданный код удалит пробелы из имен аниматоров, слоев, состояний и переменных; Например, имя переменной my var в коде становится myVar. По этой причине можно создать аниматоры, которые не будут создавать допустимый код. Например, если у вас есть две переменные с именами «my var» и «myVar», вы получите ошибку во время создания и сообщение с просьбой переименовать переменные.

LightNode

PointLightNode, DirectionalLightNode и SpotLightNode сопоставляется с компонентом Unity Light (для которого будет задано соответствующее значение типа). Можно задать основные параметры этих источников с помощью API LightNode. Кроме того, можно создать lights вручную с помощью API. При создании легких узлов с помощью API параметры, которые не могут быть заданы с помощью API облачных сценариев сетки, останутся равными значениям по умолчанию.

GeometryNode

BoxGeometryNode, SphereGeometryNode, CapsuleGeometryNode и MeshGeometryNode сопоставляют с Unity Box Collider Component, Sphere Collider Component, Capsule Collider Component и Mesh Collider Component, соответственно. Их также можно создать с помощью API облачных сценариев сетки. Включение и отключение геометрических узлов приведет к их добавлению и удалению из кандидатов на попадание, если MeshInteractableSetup подключен к их игровому объекту или одному из его родительских объектов.

При создании геометрических узлов с помощью API параметры, которые не могут быть заданы с помощью API сетки, будут использоваться по умолчанию (например, для физического материала будет задано значение none, а для параметра isTrigger — значение false).

RigidBodyNode

Добавление компонента Жесткого тела к объекту поставит его движение под контроль физики сетки. Без добавления кода объект Rigidbody будет потянуться вниз гравитацией и будет реагировать на столкновения с другими объектами.

Примечание. GeometryNode.Friction Возвращает staticFriction . Однако если этот параметр задан на стороне Cloud Scripting Mesh, он будет обновляться как на клиентах, так staticFriction и dynamicFriction на клиентах.

Активация томов

Геометрические узлы могут выступать в качестве томов триггеров, если для их IsTrigger свойства задано значение true. Этот флаг соответствует свойству IsTrigger коллайдера в Unity и не может быть изменен во время выполнения. Если геометрия является триггером, она создает Entered и Exited для любого Аватары, которые запускают или прекращают перекрываться с ним.

Примечание. Объект Unity необходимо добавить TriggerVolume в слой, чтобы позволить телепортации луча игнорировать его, так как коллайдеры в Default слое блокируют луч телепортации.

TextNode

TextNode сопоставляется с компонентом TextMeshPro в Unity. Если вы добавите компонент TextMeshPro в сцену, в иерархии сцены для cloud scripting mesh будет соответствующий Объект TextNode. Это позволяет задавать текст компонента во время выполнения. Вы также можете изменить основные свойства текста с помощью API TextNode: полужирное, курсивное, подчеркивание, зачеркив и цвет. В настоящее время создать TextNode с помощью API невозможно. Их необходимо создать, добавив в сцену в Unity. Кроме того, вы не можете клонировать TextNode напрямую. Вместо этого необходимо клонировать родительский объект TranformNode TextNode.

Сетки

В настоящее время сетки являются «скрытыми» компонентами в API облачных сценариев сетки. Ими можно создавать в редакторе Unity и управлять ими, управляя родительскими игровыми объектами или компонентами преобразования, но их нельзя создавать программными средствами, а также изменять их свойства во время выполнения с помощью API сетки.

Другие разделы, посвященные облачным сценариям сетки

Добавление ресурсов в облачную службу сценариев Mesh

Если вам нужно добавить ресурс для использования облачной службы сценариев Mesh, необходимо добавить его в качестве внедренного ресурса в файл проекта C#. Это можно сделать с помощью пользовательского интерфейса проекта в Visual Studio или путем непосредственного добавления следующей строки в CSPROJ-файл:

" CopyToOutputDirectory="PreserveNewest" /> 

Обратите внимание, что именно так упаковано scene.map, которое можно просмотреть в CSPROJ-файле для справки.

Работа с физикой сетки

Mesh Physics позаботится о синхронизации движения жестких тел между клиентами. Облачные скрипты сетки TransformNode.Position , TransformNode.Rotation RigidBody.Velocity и RigidBody.AngularVelocity не будут обновлены с учетом последнего состояния моделирования. Однако клиенты будут применять изменения, если они заданы в облачной службе сценариев mesh. Обратите внимание, что при изменении одного свойства другие свойства останутся без изменений. Например, если задано только положение, скорость не будет изменена, а жесткое тело продолжит движение со старой скоростью из нового положения. Учитывая, что служба облачных сценариев mesh не обновляется с учетом последнего состояния движения для жестких тел, рекомендуется устанавливать их только для новых жестких тел.

Если TransformNode параметр with RigidBodyNode клонирован, клонированные тела будут зарегистрированы и переданы Mesh Physics в для синхронизации между клиентами. Примечание: Клонированные жесткие тела будут иметь положение, вращение и скорости от начала сцены исходного жесткого тела. Если они должны отличаться, они должны быть явно заданы в облачных скриптах сетки.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *