Unity BoxCollider - растянуть по размеру предмета

173
21 февраля 2019, 15:20

Когда добавляешь BoxCollider к новому предмету, он автоматически растягивается под его размеры. Когда меняешь меш этого предмета - коллайдер не подтягивается автоматически. В api самого коллайдера никаких методов типа "AlignToSize" нет. Есть просто

 BoxCollider.size
 Use this to return or set the size of the BoxCollider component of a 
 GameObject. Unity measures the size in the GameObject's local space

Но если мы пишем

 collider.size = Vector3.one;

То в итоге получаем коллайдер не по размеру объекта, а просто со сторонами 1х1х1

Так как растянуть BoxCollider по размеру объекта?

Answer 1

При добавлении нового компонента к объекту у него(компонента) вызывается MonoBehaviour.Reset():

Reset to default values.

Reset is called when the user hits the Reset button in the Inspector's context menu or when adding the component the first time. This function is only called in editor mode. Reset is most commonly used to give good default values in the inspector.

Данное поведение и меняет значения размера и центра коллайдера.

Также нужно понимать, что вообще влияет на размеры и позицию коллайдера, в случае примитивных коллайдеров BoxCollider/SphereCollider - это всего 2 значения: center, локальное положение центра коллайдера, и size (radius для сферы), локальный размер(радиус) коллайдера.

Получить эти значения можно с помощью компонента MeshFilter, а точнее с помощью MeshFilter.sharedMesh.bounds:

Bounds bounds = GetComponent<MeshFilter>().sharedMesh.bounds;
BoxCollider collider = GetComponent<BoxCollider>();
collider.center = bounds.center;
collider.size = bounds.size;

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

MeshFilter.sharedMesh.bounds - это AABB в локальном пространстве, что нам и нужно для задания размеров коллайдера.

Чтобы ответ был достаточно понятен для всех, объясню, что такое AABB на всякий случай.

AABB - ограничивающий параллелепипед выровненный по координатным осям (англ. Axis Aligned Bounding Box).

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

READ ALSO
Реализовать сохранение и открытие сохраненного файла в проекте

Реализовать сохранение и открытие сохраненного файла в проекте

Можно ли сохранить массив объектов, в отдельный файл, а потом запустить этот файл в приложении и восстановить массив (который был в файле)...

144
Передать значение $_SERVER одного домена в другой домен

Передать значение $_SERVER одного домена в другой домен

У меня получается получить значении таким образом (работаю c разными доменами):

171
Проблема с парсингом на PHP

Проблема с парсингом на PHP

Надо написать парсер на phpС яндексом работает нормально, но youtube

152