Отскок и трение
Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 12 из 63.
То, как коллайдер отскакивает и скользит, зависит от его PhysicsMaterial (название в Unity 6; в более старых версиях он назывался PhysicMaterial). bounciness изменяется от 0 (без отскока) до 1 (сохраняет всю свою скорость). dynamicFriction замедляет скользящее тело, а staticFriction определяет, с какой силой нужно толкнуть покоящееся тело, прежде чем оно начнёт скользить. Коллайдер без материала ведёт себя так, будто его трение равно 0.6, а упругость — 0. Этот супер-мяч задаёт собственному коллайдеру упругий материал:
void Start()
{
PhysicsMaterial mat = GetComponent<Collider>().material; // собственная копия этого коллайдера
mat.bounciness = 0.9f;
mat.bounceCombine = PhysicsMaterialCombine.Maximum;
}В контакте участвуют два коллайдера, поэтому Unity объединяет их значения. Каждый материал задаёт способ объединения: для упругости это bounceCombine, а для трения — frictionCombine. Для каждого доступны четыре режима: Average (по умолчанию), Minimum, Multiply или Maximum. Если два коллайдера задают разные режимы, побеждает тот, который стоит позже в этом списке. На полу без материала режим Average дал бы мячу (0.9 + 0) / 2 = 0.45. С режимом Maximum мяч сохраняет 0.9 своей скорости при каждом отскоке, что составляет 0.9 x 0.9 = 81% его высоты, поскольку высота зависит от квадрата скорости.
.material возвращает собственную копию материала этого коллайдера, поэтому изменения влияют только на него. .sharedMaterial — это сам ресурс материала, общий для всех использующих его коллайдеров; у коллайдера, которому материал не назначали, его значение равно null.
Задание
ЛегкоДобавь поверхности на игровую площадку. Скрипт Surface находится на синем батуте (bounce 0.8, friction 0.6) и на полосе льда (bounce 0, friction 0.1). У мяча и ящика нет собственных материалов.
- В
Start()задай собственному материалу этого коллайдера значенияbounceиfriction(как динамическое, так и статическое трение). - Всё, что приземляется на поверхность, должно отскакивать с полным значением
bounceэтой поверхности, а всё, что скользит по ней, должно получать собственное значениеfrictionповерхности, а не смешанное со значением 0.6 у объектов без материала.
Нажми Play, чтобы посмотреть, как мяч отскакивает, затем нажми Check: ящик тоже скользит по льду.
Попробуйте сами
using UnityEngine;
public class Surface : MonoBehaviour
{
public float bounce = 0f;
public float friction = 0.6f;
void Start()
{
// Назначьте этому коллайдеру собственный материал с параметрами bounce и friction
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора