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 변수들이 할당된 상태의 그림