Утилитарные компоненты для работы с Raycast'ами как с игровыми обьектами
Зачем нужна
Эта библиотека оборачивает методы Physics.XCast and Physics.OverlapX в MonoBehavior, и превращает игровой обьект в конфигурируемый сенсор.
Благодаря ей можно писать код который меньше думает о том как стрельнуть луч, и больше о том, как реагировать если луч куда то попал.
Особенности
- Выносит логику работы с cast'ами и overlap'ами в отдельный класс.
- Несколько уровней наследования позволяет абстрагировать тип сенсора (Cast или Overlap) и его форму (Луч, Сфера, Капсула, Куб).
- Спроектирована для встраивание в существующую логику
- Корректно применяет на себя все transform'ы, так же, как это бы делал коллайдер.
- Детальное Gizmo для того чтобы видеть абсолютно всю информацию о том, как себя поведёт каст.
- Автоматический выбор метода в зависимости от настроек сенсора.
- В случае если желаемое количество детектов > 1, используются NonAlloc версии методов с переиспользуемым массивом.
- Можно анимировать параметры каста при помощи аниматора, как и любой другой обьект
Использование
- Добавьте на сцену нужный компонент и настройте параметры детекта
-
SphereCastSensor | BoxCastSensor | SphereOverlapSensor | BoxOverlapSensor
- Добавьте своему игровому обьекту поле того же типа, присвойте туда этот сенсор
- Вызывайте
UpdateSensor()
когда нужно сделать новый каст/overlap
- Используйте полученную информацию как угодно
public class SensorTest : MonoBehaviour
{
public CastSensor groundSensor;
public void Update()
{
groundSensor.UpdateSensor();
if (groundSensor.HasHit)
{
var normal = groundSensor.RayHit.normal;
// ground movement logic
}
else
{
// airborn movement logic
}
}
}
Архитектура
Библиотека спроектирована таким образом, чтобы дать возможность быстро итерировать логику связанную с Cast'ами и Overlap'ами, и быстро переключаться между различными способами взаимодействия с физическим миром не модифицируя при этом код.
Ray/Capsule касты отсутствуют, потому что являются производными от SphereCast'а. В случае если Radius = 0, используется RayCast, а в случае если Width > 0, используется CapsuleCast. Похожая логика используется и для Overlap'ов
Каждый из уровней наследования предлагает функционал, который позволит получать общую информацию о детекте независимо от типа сенсора. Таким образом например, в случае если необходимо всего лишь детектить присутствие какого то обьекта, PhysicsSensor позволит получать общую информацию независимую от типа сенсора (Есть ли попадание и список обьектов). Для кардинальной смены логики, например смены BoxOverlap на SphereCast, не потребуется изменять оригинальный исходник, а просто поменять ссылку на сенсор.
Сенсор не обновляется сам по себе, и для его обновления необходимо вызывать UpdateSensor()
. На это есть несколько причин:
- Все игровые обьекты используют касты внутри своей логики, и невозможно предугадать в какое время и месте они это сделают.
- Каст может происходить не каждый кадр
- Иногда необходимо сделать каст, и хранить результат
Параметры
Сорян, русская документация служит черновиком для английской, а параметры я описывал сразу там, ну в общем там глянь
Требования
Unity 2018.1 или выше
Установка
-
Git:
В случае если у вас версия Unity 2018.1 и выше и установлен git, можете добавить строчку в Packages\manifest.json
"ru.threedisevenzeror.sensorkit": "https://github.com/3DI70R/SensorKit.git"
И все компоненты будут загружены и подключены как модуль, не засоряя папку проекта.
-
Как пакет:
Просто скачайте этот репозиторий как Zip, распакуйте, и в Package Manager'е выберите "Add package from disk..." указав "package.json"
-
OpenUPM:
Пакет так же доступен в репозитории OpenUPM. Можно установить его через openupm-cli.
openupm add ru.threedisevenzeror.sensorkit
В противном случае, можно просто скопировать файлы из Assets/Scripts/Runtime
и вставить в проект, некрасиво, лениво, зато быстро
Changelog
- 1.0.0
- 1.1.0
- Фича: Поддержка переопределения PhysicsScene для каста в другой сцене
- Фича: Поддержка переопределения направления луча для Cast сенсоров, для возможности кастить фигуры направленные в сторону отличную от луча
- Багфикс: RayCast/SphereCast/CapsuleCast считали собственный Ray вместо посчитанного заранее
- 1.1.1
- Багфикс: NullReference при активации Gizmos в GameView
- 1.1.2
- Багфикс: CastSensor хранил static массив. Это прямо таки большой и жирный баг который как то прошёл мимо меня. Сорян. (Хранился только последний результат каста и данные терялись если их не использовать до следующего вызова)
- Багфикс: На 2019.3 текст в окошке Gizmo был немного обрезан из за обновлённого UI
- 1.1.3
- Улучшение: Форматирование для документации, Всплывающие окошки в с документацией у полей
- Улучшение: Обновление стиля окошка с информацией о попадании, также теперь он не обрезается о границу окна
- Улучшение: Кэширование вершин для отображения треугольников
- Улучшение: "Lazy Allocation" теперь только для чтения, нельзя анимировать и можно проставить только из инспектора, так как его значение используется только при инициализации компонента
- 1.1.4
- Багфикс: Out of bounds exception при попытке отрисовать треугольник на Convex MeshCollider (при таком случае, triangleIndex == -1)