Menu
CoddyTech

Отскок и трение

Часть раздела Физика и игровой процесс путешествия по 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.

challenge icon

Задание

Легко

Добавь поверхности на игровую площадку. Скрипт 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
    }
}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Физика и игровой процесс