Menu
CoddyTech

Кинематические тела

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

Движущиеся платформы, лифты и двери должны сталкиваться с другими объектами как твёрдые тела, но они не должны падать или сдвигаться от того, что на них приземляется. Это кинематическое тело: установи rb.isKinematic = true, и гравитация, силы и удары больше не будут его перемещать. Его коллайдер по-прежнему учитывается, поэтому динамическое тело (которое перемещает физика) ударяется о него, как о стену, и стоит на нём, как на полу. Кинематическое тело ты перемещаешь сам с помощью rb.MovePosition.

Этот лифт поднимается со скоростью lift м/с, пока не достигнет top. MovePosition принимает позицию, в которой тело должно оказаться после этого шага, поэтому код добавляет перемещение за один шаг, используя Time.fixedDeltaTime:

void Start()
{
    rb = GetComponent<Rigidbody>();
    rb.isKinematic = true;
}

void FixedUpdate()
{
    if (rb.position.y < top)
    {
        rb.MovePosition(rb.position + Vector3.up * lift * Time.fixedDeltaTime);
    }
}

Почему бы не установить transform.position? Это телепортирует объект, и физика не узнаёт, что он переместился: ящик на скользящей платформе останется на месте, вместо того чтобы двигаться вместе с ней. MovePosition сообщает физике, что тело переместилось в новое место за этот шаг, поэтому соприкасающиеся с ним объекты правильно перемещаются и отталкиваются. AddForce не действует на кинематическое тело, а кинематические тела никогда не сталкиваются со статическими коллайдерами или друг с другом: с ними сталкиваются только динамические тела.

challenge icon

Задание

Легко

Баржа нависает над лавой, а стрелки должны перемещать её влево и вправо вдоль оси x со скоростью speed м/с (2 в Inspector). Сейчас у неё обычный Rigidbody, поэтому она падает в лаву.

  • Когда игра начинается, сделай баржу кинематической, чтобы она висела в воздухе и ничто из того, что в неё попадёт, не могло её сдвинуть.
  • Перемещай её с помощью MovePosition в FixedUpdate(), используя необработанную ось Horizontal.

Нажми Play и перемести баржу, затем нажми Check.

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

using UnityEngine;

public class Barge : MonoBehaviour
{
    public float speed = 2f;
    private Rigidbody rb;

    void Start()
    {
        rb = GetComponent<Rigidbody>();
        // Сделайте баржу кинематической
    }

    void FixedUpdate()
    {
        // Перемещайте её вдоль оси x с помощью стрелок
    }
}
quiz iconПроверьте себя

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

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