Кинематические тела
Часть раздела Физика и игровой процесс путешествия по 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 не действует на кинематическое тело, а кинематические тела никогда не сталкиваются со статическими коллайдерами или друг с другом: с ними сталкиваются только динамические тела.
Задание
ЛегкоБаржа нависает над лавой, а стрелки должны перемещать её влево и вправо вдоль оси 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 с помощью стрелок
}
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Физика и игровой процесс
1Твёрдое тело
Гравитация и массаТолкаем с помощью AddForceПрыжок с импульсомFixedUpdate для физикиСкоростьКинематические телаПовторение: пусковая площадка2Столкновения
OnCollisionEnterВо что я попал?Разрушение при столкновенииСтояние на землеОтскок и трениеФормы коллайдеровПовторение: разрушаемая стена5Проект: Погоня за монетами
Катящийся мячМонеты для сбора