HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: unity, оптимизация физики, рейкастинг, меш-коллайдеры</p>
1 <p>Теги: unity, оптимизация физики, рейкастинг, меш-коллайдеры</p>
2 <p>Рейкастинг - полезный и довольно мощный инструмент в физическом движке. Он даёт возможность направлять луч какой-нибудь длины в определённом направлении, получая информацию о произошедших столкновениях. Производительность рейкастинга зависит от типов коллайдеров на сцене и длины луча.</p>
2 <p>Рейкастинг - полезный и довольно мощный инструмент в физическом движке. Он даёт возможность направлять луч какой-нибудь длины в определённом направлении, получая информацию о произошедших столкновениях. Производительность рейкастинга зависит от типов коллайдеров на сцене и длины луча.</p>
3 <p>Предлагаем вам<strong>ряд советов по применению рейкастинга</strong>: - очевидно, но факт: стремитесь к наименьшему числу лучей; - не стоит делать лучи длиннее, чем это действительно надо, ведь чем длиннее будет луч, тем больше объектов придётся проверять на столкновение; - не стоит применять рейкасты внутри метода FixedUpdate(). Мало того, иногда бывает излишним даже применение их внутри метода Update(); - обращайте внимание на типы используемых коллайдеров. Например, рейкастинг с меш-коллайдером обойдётся достаточно дорого. При этом неплохим решением станет создание дочернего объекта с примитивными коллайдерами и повторение с их помощью приблизительной формы меша. Ведь все дочерние коллайдеры у родительского Rigidbody будут вести себя, как составные коллайдеры. Если же вам очень надо использовать именно меш-коллайдеры, то сделайте их хотя бы выпуклыми; - уточняйте, во что конкретно должен попадать луч и, если это возможно, конкретизируйте слой-маску в функции рейкаста; - не забывайте, что данные, которые указываются вами в функции рейкаста, являются не идентификатором слоя, а битовой маской. Если желаете, чтобы луч сталкивался с объектом, находящимся на слое с идентификатором 10, указывайте битовый сдвиг влево на 10 (1&lt;&lt;10), а не просто 10. Если желаете, чтобы луч врезался во всё, кроме объектов на слое 10, используйте побитовый оператор дополнения (~) - он инвертирует каждый бит в побитовой маске.</p>
3 <p>Предлагаем вам<strong>ряд советов по применению рейкастинга</strong>: - очевидно, но факт: стремитесь к наименьшему числу лучей; - не стоит делать лучи длиннее, чем это действительно надо, ведь чем длиннее будет луч, тем больше объектов придётся проверять на столкновение; - не стоит применять рейкасты внутри метода FixedUpdate(). Мало того, иногда бывает излишним даже применение их внутри метода Update(); - обращайте внимание на типы используемых коллайдеров. Например, рейкастинг с меш-коллайдером обойдётся достаточно дорого. При этом неплохим решением станет создание дочернего объекта с примитивными коллайдерами и повторение с их помощью приблизительной формы меша. Ведь все дочерние коллайдеры у родительского Rigidbody будут вести себя, как составные коллайдеры. Если же вам очень надо использовать именно меш-коллайдеры, то сделайте их хотя бы выпуклыми; - уточняйте, во что конкретно должен попадать луч и, если это возможно, конкретизируйте слой-маску в функции рейкаста; - не забывайте, что данные, которые указываются вами в функции рейкаста, являются не идентификатором слоя, а битовой маской. Если желаете, чтобы луч сталкивался с объектом, находящимся на слое с идентификатором 10, указывайте битовый сдвиг влево на 10 (1&lt;&lt;10), а не просто 10. Если желаете, чтобы луч врезался во всё, кроме объектов на слое 10, используйте побитовый оператор дополнения (~) - он инвертирует каждый бит в побитовой маске.</p>
4 <h2>Как это выглядит на практике</h2>
4 <h2>Как это выглядит на практике</h2>
5 <p>Теперь рассмотрим простую демо-сцену, в которой объект стреляет лучами, которые сталкиваются лишь с зелёными объектами.</p>
5 <p>Теперь рассмотрим простую демо-сцену, в которой объект стреляет лучами, которые сталкиваются лишь с зелёными объектами.</p>
6 <p>Простая демо-сцена с рейкастами:</p>
6 <p>Простая демо-сцена с рейкастами:</p>
7 <p>Здесь, чтобы получить данные профилировки, ведётся управление числом и длиной лучей. Давайте посмотрим на них на графике, где представлена зависимость производительности от числа лучей:</p>
7 <p>Здесь, чтобы получить данные профилировки, ведётся управление числом и длиной лучей. Давайте посмотрим на них на графике, где представлена зависимость производительности от числа лучей:</p>
8 <p>А теперь посмотрим на зависимость производительности от длины лучей:</p>
8 <p>А теперь посмотрим на зависимость производительности от длины лучей:</p>
9 <p>А теперь посмотрим, что произойдёт, если мы поменяем примитивные коллайдеры на меш-коллайдеры. Меш-коллайдеры на сцене (110 полигонов на коллайдер):</p>
9 <p>А теперь посмотрим, что произойдёт, если мы поменяем примитивные коллайдеры на меш-коллайдеры. Меш-коллайдеры на сцене (110 полигонов на коллайдер):</p>
10 <p>Примитивные коллайдеры по сравнению с меш-коллайдерами в данных профилировки:</p>
10 <p>Примитивные коллайдеры по сравнению с меш-коллайдерами в данных профилировки:</p>
11 <p>Как вы видите на данных профилировки, рейкастинг меш-коллайдеров заставляет физический движок работать больше.</p>
11 <p>Как вы видите на данных профилировки, рейкастинг меш-коллайдеров заставляет физический движок работать больше.</p>
12 <p><em>По материалам статьи "<a>Physics Best Practices</a>"</em></p>
12 <p><em>По материалам статьи "<a>Physics Best Practices</a>"</em></p>
13 <p>Также возможно вам будет интересно: - "<a>Оптимизируем физику в Unity: слои и матрица коллизий</a>".</p>
13 <p>Также возможно вам будет интересно: - "<a>Оптимизируем физику в Unity: слои и матрица коллизий</a>".</p>
14  
14