Car Steering Ratio Control in Unity
자동차의 속도에 따라서 방향변화 속도 조정하기
앞선 내용 참고 : http://micropilot.tistory.com/category/Unity3D%20Car/Wheel%20Steering
자동차는 속도가 높아짐에 따라서 방향을 조정하기가 어려워지고 높은 속도에서 갑자기 방향을 전환하면 바퀴가 미끄러지는 현상도 발생한다. 낮은 속도에서는 방향전환이 쉽고 빠르게 되지만 높은 속도에서는 좀더 느리게 방향이 전환되도록 속도에 따른 방향 전환율을 달리 적용해보려고 한다
Car 오브젝트에 포함된 Car.cs 파일을 다음과 같이 약간만 변경하면 된다
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 float highestSpeed = 500f;
public float lowSpeedSteerAngle = 0.1f;
public float highSpeedStreerAngle = 25f;
public int maxTorque = 15;
private float prevSteerAngle;
// Use this for initialization
void Start () {
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");
// 속도에 따라 방향전환율을 달리 적용하기 위한 계산
float speedFactor = rigidbody.velocity.magnitude / highestSpeed;
/** Mathf.Lerp(from, to, t) : Linear Interpolation(선형보간)
* from:시작값, to:끝값, t:중간값(0.0 ~ 1.0)
* t가 0이면 from을 리턴, t가 1이면 to 를 리턴함, 0.5라면 from, to 의 중간값이 리턴됨
*/
float steerAngle = Mathf.Lerp (lowSpeedSteerAngle, highSpeedStreerAngle, 1/speedFactor);
steerAngle *= Input.GetAxis("Horizontal");
//좌우 방향전환
colliderFR.steerAngle = steerAngle;
colliderFL.steerAngle = steerAngle;
/*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;
}
}