Скрипты редактора Unity: BoxCollider-подобные элементы управления сценой - PullRequest
0 голосов
/ 24 октября 2019

Я сталкивался с несколькими сценариями для «поддельных» коллайдеров, использующих Bounds - главным образом, когда мне нужно только удерживать объект внутри определенной области (используя Bounds.Contains), и я не хочу, чтобы он участвовал вфизика.

Я знаю, что мог бы использовать Триггер для этого, но для этого потребовался бы выделенный слой, который не подходит, так как в моей игре нет слоев.

Я создал простойBoundsHolder скрипт, который использует локальный размер / центр для расчета границ. Я отображаю их в редакторе, используя Gizmos.DrawWireCube - это прекрасно работает, как показано ниже:

Custom Bounds Holder inspector + scene gizmo

Но я хотел бы добавить элементы управления перетаскиванием BoxCollider имеет для увеличения моих границ:

Unity BoxCollider Scene gizmo with drag-to-enlarge handles

Я искал в Google + просмотр документов на Gizmos и Handles - Но всетам, похоже, есть функции рисование кубов, а не изменение размеров инструментов.

Есть ли встроенный инструмент для воссоздания этого, которого мне не хватает?

Если нет - , как лучше всего это сделать?


Бонусный вопрос- Мой BoundsHolder использует UnityEngine.Bounds, то есть ось-выровнен и не поддерживает вращение. Есть ли альтернативная версия, которая поддерживает вращение? (и все еще предоставляет Contains(Vector3) API?)

Спасибо

Ответы [ 2 ]

0 голосов
/ 24 октября 2019

Существует механизм рендеринга, использующий матрицу в качестве конвейера. поэтому, если вы хотите, чтобы он перемещался, масштабировался, вращался. Сделать матрицу, чтобы сделать это, если я делаю ту же работу, то я начну с «transform.localToWorldMatrix»

Matrix4x4 matrix4x4 = transform.localToWorldMatrix;

Матрица A

0 0 0 T

0 0 0 T

0 0 0 T

0 0 0 0

Часть 'matrix A', 'T' отклоняет часть от этой матрицы, чтобы вы могли изменить или добавить смещение, чтобы больше перемещаться из текущего gameObject. Затем примените его к рисованию как

public void OnDrawGizmosSelected()
{
    Matrix4x4 matrix4x4 = transform.localToWorldMatrix;

    ....
    ....
    do something with "matrix4x4" here


    Gizmos.matrix = matrix4x4; // apply matrix to move/scale/rotate
    Gizmos.DrawCube(..)
}

0 голосов
/ 24 октября 2019

Да, есть ручки для рисования, но и для взаимодействия, так что вы действительно можете взять ручку. Афаик, ты должен сам реализовать масштабирование коробки. Но Handles.ScaleHandle может помочь. Или создайте ползунок для перемещения вдоль одной оси

Для функции Box-Collider-Trigger вы можете посмотреть Physics.CheckBox (true / false hitTest дляполя с ориентацией)

или в Physics.OverlapBox (который дает вам список игровых объектов, находящихся внутри - это можно использовать как «содержит», если хотите)

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

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