Menu
CoddyTech

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

Часть раздела Физика и игровой процесс путешествия по Unity на Coddy. Урок 12 из 71.

То, как коллайдер отскакивает и скользит, зависит от его 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

Задание

Легко

Задай батуту и льду собственные значения отскока и трения.

  1. В Start() возьми PhysicsMaterial mat = GetComponent<Collider>().material; и задай mat.bounciness = bounce;, mat.dynamicFriction и mat.staticFriction значение friction.
  2. Задай mat.bounceCombine = PhysicsMaterialCombine.Maximum; и mat.frictionCombine = PhysicsMaterialCombine.Minimum;, чтобы использовались собственные значения поверхности.

Нажми «Играть»: мяч высоко подпрыгнет на батуте. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class Surface : MonoBehaviour
{
    public float bounce = 0f;
    public float friction = 0.6f;

    void Start()
    {
        // Назначьте этому коллайдеру собственный материал с параметрами bounce и friction
    }
}

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

Потренируйтесь самостоятельно: Песочница Unity