Скрипт работал бы на любой версии Unity, если б не "Vector3.ProjectOnPlane". Эта функция есть только в пятой юне. "Vector3.Project" работает как-то иначе. Кидать прямо на колесо. Реализовано Raycast'ом.
Плюсы: +Скрипт учитывает скорость перемещения платформы, на которой стоит колесо. +Настройка LayerMask для игнорирования каких-либо поверхностей. +Простота в использовании, интуитивно понятные переменные. +Два варианта контроля скорости: переменная AddForce(ускорение) и переменная Speed(скорость). +Переменная BreakForce - тормоз (должна быть больше нуля). +В WheelMesh можно назначить меш колеса. +Сам протестил, при должных настройках неплохой управляемый дрифт. Минусы: -Не знаю, чем заменить "Vector3.ProjectOnPlane", только для Unity5+ -Не без багов при превышении определенного барьера значения некоторых настроек (похожее на стандартный WheelCollider).
Могут быть еще минусы, как, впрочем, и плюсы.
Особенность:
Сила трения разделена на две составляющие: 1-баланс на наклонной поверхности - балансирующая сила, 2-сила трения - останавливающая сила.
Переменная Speed при FixedSpeed = false воздействует на вторую силу, таким образом, задавая колесу постоянную скорость вращения. Через нее, к примеру, можно задавать одинаковую скорость вращения всем тракам танка. Переменная AddForce при FixedSpeed = true делает так же, только мягче и учитывая текущую скорость вращения колеса.
StaticFriction / SlidingFriction - множители первой силы в обычном состоянии / состоянии скольжения (от 0 до 1). StaticForce / SlidingForce - множители второй силы в обычном состоянии / состоянии скольжения ( от 0 до бесконечности).
MaxStaticForce - при такой силе трения колесо переходит на скольжение. MinSlidingForce - при такой силе трения колесо перестает скользить.
Желательно назначить колесу любой Сollider и настроить, условие Center.y * 2 = Size.y, чтобы нижня сторона коллайдера была посредине колеса. Без него вполне возможно, что при падении колесо провалится сквозь землю.
Демо (яндекс диск): Демо 36мб. (только что, 24.06, обновил демку. Была шестиколесная телега, сейчас авто из Car Tutorial)
Вот, собственно, сам скрипт:
Код
#pragma strict //////////////////////////////////Script "Wheel" by VolkOrievith/////////////////////////////// @HeaderAttribute("Wheel setup") var WheelMesh : Transform; var Radius : float = 0.3; var ForceApPointDistance : float; var SuspensionDistance : float = 0.3; var FixedSpeed : boolean; //переключатель контроля. Либо через Speed, либо через AddForce. var BeakForce : float; var Speed : float; var AddForce : float; var MuvingPlatform : LayerMask; @Space(8) var RPM : float;
@Space(15) @HeaderAttribute("Suspension")
var Spring : float = 5000; var Dumper : float = 500;
@Space(15) @HeaderAttribute("Friction") var StaticFriction : float; var SlidingFriction : float; @Space(5) var StaticForce : float = 2000f; var SlidingForce : float = 800f; @Space(5) var MaxStaticForce : float = 1500f; var MinSlidingForce : float = 800f; @Space(5) var Sliding : boolean;
private var LastDist : float; private var LastPoint : Vector3; private var LastTRDPoint : Vector3; private var LastTRDO : Transform; private var RB : Rigidbody;
function Start () { RB = GetComponentInParent.<Rigidbody>(); LastPoint = transform.position; } private var Vel : Vector3; function FixedUpdate () { Vel = Vector3.zero;
var wh : RaycastHit; //Debug.DrawLine (transform.position,transform.position - transform.up * SuspensionDistance); if ( Physics.Raycast ( transform.position + transform.up*0.1, -transform.up, wh, SuspensionDistance+0.1, MuvingPlatform)){ if (WheelMesh) WheelMesh.position = wh.point + transform.up * (Radius);
Посмотрел демку - ездит нормально, но вот на заносах уж по мне слишком сильно перекашивает, даже когда на малой скорости, машино может очень занести. Думаю стоит все же для демки еще чуть-чуть подправить переменные. Ну а в целом мне понравилось, хорошая альтернатива стандартному