본문 바로가기

Unity3D Car/Wheel Steering

Car Wheel Steering in Unity

유니티에서 차 바퀴가 이동방향으로 향하도록 설정하는 예


앞선 내용 참고 : http://micropilot.tistory.com/category/Unity3D%20Car/Camera


유니티에서 자동차의 좌우 이동방향을 제어할 때 좌우 방향키를 사용한다면 눌린 방향키에 따라서 자동차는 그 방향으로 이동할 뿐만 아니라 위에서 관찰할 때 이동방향으로 앞바퀴 2개가 수직축을 중심으로 하여 좌우로 회전하도록 하면 더 실감날 것이다.

한가지 생각할 점은 자동차가 이동하면 바퀴는 계속 로컬 X 축을 중심으로 회전하므로 로컬 Y축이 회전하는 상태가 되므로 로컬 Y축을 중심으로 바퀴를 회전하게 할 수 없다는 점이다. 그래서 항상 변하지 않는 Y축인 월드 Y축을 중심으로 바퀴를 회전해야만 자동차의 방향전환시 앞 바퀴를 제대로 표현할 수 있다는 것이다


[그림, 눌린 방향키에 따라서 앞바퀴가 이동방향으로 향하고 있다]

 중립상태의 앞바퀴

우측 방향키가 눌렸을 때의 앞바퀴 상태

 좌측 방향키가 눌렸을 때의 앞바퀴 상태



Car 오브젝트에 포함되는 스크립트

using UnityEngine;

using System.Collections;


public class Car : MonoBehaviour {


// 자동차 바퀴 방향조종을 위한 Transform 4개

public Transform tireTransformFL;

public Transform tireTransformFR;

public Transform tireTransformRL;

public Transform tireTransformRR;


public WheelCollider colliderFR;

public WheelCollider colliderFL;

public WheelCollider colliderRR;

public WheelCollider colliderRL;

// 바퀴 회전을 위한 Transform

public Transform wheelTransformFL;

public Transform wheelTransformFR;

public Transform wheelTransformRL;

public Transform wheelTransformRR;

public int maxTorque;

private float prevSteerAngle;

// Use this for initialization

void Start () {

maxTorque = 30;

rigidbody.centerOfMass=new Vector3(0,-1,0); // 무게중심이 높으면 차가 쉽게 전복된다

}

// Update is called once per frame

void FixedUpdate () {

//전진, 후진

colliderRR.motorTorque = -maxTorque * Input.GetAxis("Vertical");

colliderRL.motorTorque = -maxTorque * Input.GetAxis("Vertical");

//좌우 방향전환

colliderFR.steerAngle = 17 * Input.GetAxis("Horizontal");

colliderFL.steerAngle = 17 * Input.GetAxis("Horizontal");

// 바퀴회전효과

wheelTransformFL.Rotate (colliderFL.rpm/60*360 * Time.fixedDeltaTime, 0, 0);

wheelTransformFR.Rotate (colliderFR.rpm/60*360 * Time.fixedDeltaTime, 0, 0);

wheelTransformRL.Rotate (colliderRL.rpm/60*360 * Time.fixedDeltaTime, 0, 0);

wheelTransformRR.Rotate (colliderRR.rpm/60*360 * Time.fixedDeltaTime, 0, 0);

}


void Update() {

// 앞바퀴 2개를 이동방향으로 향하기

tireTransformFL.Rotate (Vector3.up, colliderFL.steerAngle-prevSteerAngle, Space.World);

tireTransformFR.Rotate (Vector3.up, colliderFR.steerAngle-prevSteerAngle, Space.World);

prevSteerAngle = colliderFR.steerAngle;

}

}



위의 스크립트가 Car 오브젝트에 포함되어 모든 public 변수들이 할당된 상태의 그림