Взаимодействие с движущейся платформой / лифтом

Например, у нас в игре есть платформа (или лифт), позицию которой мы анимируем с помощью аниматора Unity. Если игрок заходит на нее, то она по идеи должна перевезти персонажа на другую сторону, либо платформа/лифт движется постоянно из стороны в сторону, не важно. Дело в том, что если зайти на такую платформу, то удержаться на ней не получится. Тоже самое касается и любых других объектов, которые положить на движущийся объект. Наличие компонента Rigidbody с любой массой, ничего не изменит. Разберемся, как нормально взаимодействовать с движущейся платформой, лифтом и тому подобное.

Решить эту проблему очень просто на самом деле, но надо учитывать несколько деталей, вне зависимости от того, 2D или 3D у нас проект.

Как нужно делать движущеюся платформу или лифт?
Прежде чем приступать к анимации, надо создать пустой объект с именем, например Platformа и сделать модель платформы дочерней. Затем, на родителя цепляем коллайдер и настраиваем его размеры, плюс, добавляем небольшой скрипт MovePlatform:

using UnityEngine;
using System.Collections;

public class MovePlatform : MonoBehaviour {

	void OnCollisionEnter(Collision coll)
	{
		coll.transform.parent = transform;
	}

	void OnCollisionExit(Collision coll)
	{
		coll.transform.parent = null;
	}
}

Этот скрипт, делает все объекты дочерними, которые контактируют с Platformа. Таким образом дети (вложенные объекты) будут наследовать позицию родителя, которого мы анимируем.

Для 2D физики, скрипт будет выглядеть вот так:

using UnityEngine;
using System.Collections;

public class MovePlatform : MonoBehaviour {

	void OnCollisionEnter2D(Collision2D coll)
	{
		coll.transform.parent = transform;
	}

	void OnCollisionExit2D(Collision2D coll)
	{
		coll.transform.parent = null;
	}
}


Теперь о важной детали. Для чего нужна заморочка с пустым объектом, если анимацию и скрипт можно повесить на саму модель платформы? Дело в том, что кроме позиции, наследуются так-же вращение и масштаб. А дочерние объекты, включая саму платформу, могут иметь различный масштаб. И если у родителя тоже масштаб изменен, то будут искажения у вложенных объектов.

Чтобы такого небыло, мы делаем родителя платформы у которого масштаб всегда должен быть один к одному:

Взаимодействие с движущейся платформой / лифтом

Комментариев 3

Офлайн
GetDownLow 7 июля 2015
Очень полезная информация.
Спасибо автору!
Офлайн
mav
mav 19 сентября 2017
Доброго времени суток!
Спасибо что выкладываете различные обучающие материалы по Unity. Для новичка на сайте огромное количество полезного материала.
Есть вопрос, было бы здорово получить хоть малейшее направление в правильную сторону.
В 2D игре сделал лифт, игрок спокойно на нем остаётся, благодаря вашему скрипту выше, но я никак не могу доделать, чтобы в зависимости от нажатия вверх или вниз, стоя на платформе, она двигалась до определенной ближайшей точки (этажа).
Буду благодарен если поможете!)
Офлайн
Light 21 сентября 2017
mav, тут суть в том, что нужно создать массив точек, для каждого лифта свой и когда игрок на платформе, просто переключаться между этими точками. Однако, чтобы ловить нажатие клавиш, нужен Update, но если лифтов в игре будет много, то это плохо для оптимизации. Поэтому, чтобы решить эту проблему, можно сделать отдельный класс, типа менеджера, в котором ловиться нажатие клавиши, и когда игрок заходит в лифт, данный лифт отправлять в менеджер. Получится, что лифтов может быть множество в игре, а класс управления будет только один.

Если возникнут трудности с данной конструкцией, пиши в ЛС.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика