Физика авто в платформере [2D]

Данный материал для тех, кто хочет понять, как прикрутить колеса к двумерной модельке авто, в своем платформере, и прикрутить управление этой конструкцией. В текущем виде, решение, далеко от идеала и требует самостоятельной заточки под конкретные нужды, так как это всего лишь пример. За основу мы возьмем спрайт мотоцикла, в любые случаи для любого транспорта, в платформера более двух колес не требуется. Есть два варианта решения вопроса, присоединить раму к колесу, или наоборот колесо к раме. Оба способа рабочие, однако, второй способ показывает лучшие результаты, его мы будет использовать.

Для начала, нам нужен сам транспорт, рисуем нужные спрайты, рама и колеса - отдельно.

На колеса вешаем Circle Collider 2D и Rigidbody 2D. Еще, чтобы улучшить сцепление колеса с поверхностью создаем Physics Material 2D добавляем материал в коллайдер колеса. У физического материала, Bounciness ставим на ноль, а Friction допустим на три.

Теперь, делаем делаем колеса дочерними объектами рамы и расставляем их в нужные позиции.

Следующий шаг, добавляем на раму Wheel Joint 2D в качестве, Connected Rigid Body указываем наше колесо:

Физика авто в платформере [2D]

Тут нужно настроить якоря. Убираем галочку у Wheel Joint 2D, где Auto Configure Connected Anchor.


Connected Anchor не трогаем, он должен оставаться в центре колеса. А второй якорь перемещаем в центр первого.

Получается вот так:


Если потребуется приподнять раму, то этот якорь можно чуть ниже центра сделать.

Тоже самое делаем для второго колеса, а на раму добавляем компонент Polygon Collider 2D.

Далее, на раму цепляем скрипт управления:

using UnityEngine;
using System.Collections;

public class CarMovement2D : MonoBehaviour {
 
	public KeyCode move = KeyCode.D; // движение вперед
	public KeyCode smoothStop = KeyCode.A; // плавное торможение
	public KeyCode stop = KeyCode.Space; // быстрое торможение
	public float moveSpeed = 250; // макс скорость
	public bool invert = true; // инвертировать направление
	public float smoothStep = 1; // плавное ускорение/торможение
	public float stopStep = 10; // шаг для быстрого торможения
	public float freeStep = 0.05f; // постепенное падение скорости, когда клавиша движения не нажата
	[HideInInspector]public float velocity; // текущая скорость тела по Х
	private JointMotor2D jointMotor;
	private WheelJoint2D[] wheel;
	private Rigidbody2D body;
	private int inv;
	private float curSpeed, curSmooth;

	void Awake()
	{
		body = GetComponent<Rigidbody2D>();
		wheel = GetComponents<WheelJoint2D>();
		jointMotor.maxMotorTorque = 10000;
		jointMotor.motorSpeed = 0;
		foreach(WheelJoint2D w in wheel)
		{
			w.useMotor = true;
			w.motor = jointMotor;
		}
	}

	float Round(float value, float to) // округлить до указанного значения
	{
		return ((int)(value * to)) / to;
	}

	void MovementControl()
	{
		if(Input.GetKey(move))
		{
			curSpeed = moveSpeed * inv;
			curSmooth = smoothStep;
		}
		else if(Input.GetKey(smoothStop))
		{
			curSpeed = 0;
			curSmooth = smoothStep;
		}
		else if(Input.GetKey(stop))
		{
			curSpeed = 0;
			curSmooth = stopStep;
		}
		else
		{
			curSpeed = 0;
			curSmooth = freeStep;
		}
	}

	void Update()
	{
		velocity = Round(body.velocity.x, 100f); // округляем до сотых
		if(invert) inv = -1; else if(!invert) inv = 1;

		MovementControl();
		AdjustSpeed();
	}

	void AdjustSpeed()
	{
		jointMotor.motorSpeed = Mathf.Lerp(jointMotor.motorSpeed, curSpeed, curSmooth * Time.deltaTime);
		foreach(WheelJoint2D w in wheel)
		{
			w.motor = jointMotor;
		}
	}
}

Простенький скрипт, по мнимому.

Если нужно чтобы колесо не цеплялось за коллайдер, например, если это стена, то для коллайдера стены просто создаем новый физический материал и ставим всех значения на ноль.

Скачать демо проект:

Внимание! Посетители, находящиеся в группе Гости, не могут скачивать файлы.
Информация
Посетители, находящиеся в группе Гости, не могут оставлять комментарии к данной публикации.
  • Яндекс.Метрика