이 튜토리얼에서는 기본적으로 작동하는 사륜구동 차량을 PhysX 휠 콜라이더로 생성하는 프로세스를 안내합니다.
이 단계에는 다음이 포함됩니다.
지침을 따르려면 다음이 필요합니다.
지면을 생성하려면 다음을 따르십시오.
Ground
로 변경합니다. 이 평면은 차량이 주행할 지면입니다.먼저 차량 모델을 씬에 배치합니다.
Car
에셋을 선택합니다.Assets
폴더(기본 위치)에 저장합니다.계층(Hierarchy) 창에서 차량 게임 오브젝트의 계층 구조를 확인합니다. Car
라고 하는 루트 게임 오브젝트가 있고, 차체 모델 및 각 휠 모델의 자식 게임 오브젝트가 있습니다.
차체를 충돌에 대해 설정합니다.
Car
루트 게임 오브젝트에 Rigidbody 컴포넌트를 추가합니다.1500
으로 설정합니다. 이 값은 차량의 무게를 킬로그램 단위로 정의합니다. 1500은 휠 콜라이더의 기본 서스펜션 설정에 적합한 무게입니다. 자세한 내용은 휠 콜라이더 서스펜션: 질량 및 서스펜션 값을 참조하십시오.Car Body
게임 오브젝트에 Mesh Collider 컴포넌트를 추가합니다.휠 모델에 휠 콜라이더를 추가하려면 4개의 새로운 별도 게임 오브젝트를 휠 모델과 동일한(하지만 휠의 자식 게임 오브젝트와는 다른) 위치에 생성해야 합니다.
거의 동일한 위치에 설정하는 빠른 방법은 휠 게임 오브젝트를 복제하고 새 게임 오브젝트를 설정하는 것입니다.
Wheel Back Left (1)
). 명확성을 위해 게임 오브젝트 이름에 ‘Collider’라는 단어를 추가합니다(예: Wheel Back Left collider
).이제 차량 게임 오브젝트 계층 구조는 다음과 같습니다.
다음으로 휠 모델에 맞게 휠 콜라이더의 위치와 크기를 조정해야 합니다.
휠 콜라이더를 선택하면 씬 뷰에 휠 콜라이더 설정을 시각화하는 기즈모가 표시됩니다. 휠 콜라이더 시각화를 참조하십시오. 기즈모를 사용하면 휠 모델의 위치 및 크기와 비교하여 휠 콜라이더의 위치와 크기를 확인할 수 있습니다.
휠 방향과 기즈모를 더 명확하게 보려면 씬의 드로우 모드를 Wireframe으로, 씬 방향을 Isometric으로 설정합니다.
휠 콜라이더 추가에 설명된 워크플로로 휠 콜라이더를 처음 추가하면 위치가 너무 낮게 나타납니다(씬 뷰에서 휠 모델 메시 아래에 휠 콜라이더 원이 나타남). 이는 Suspension Distance가 이러한 게임 오브젝트의 위치에서 시작하여 Suspension Distance 설정에 지정된 거리만큼 아래쪽으로 확장되기 때문입니다. 씬 뷰 시각화에서는 Suspension Distance가 휠 콜라이더 기즈모의 Y축 아래 주황색 선으로 표시됩니다.
녹색 원 윤곽선은 서스펜션 거리 범위의 중간 지점에 있는 휠을 표시하며, 자동차가 서스펜션에 눌리거나 올라가지 않았을 때 휠의 일반적인 위치로 간주해야 합니다. 따라서 각 휠 콜라이더의 녹색 윤곽선은 해당 휠 메시의 중앙에 있어야 합니다.
이 문제를 해결하려면 WheelCollider 게임 오브젝트를 휠 콜라이더의 Suspension Distance 값의 절반만큼 Y축을 따라 위로 옮겨야 합니다. 이 예제 프로젝트에서 Suspension Distance는 0.3(기본값)이므로 휠 콜라이더 게임 오브젝트를 0.15유닛만큼 위로 옮겨야 합니다.
Unity에서는 숫자 필드에 간단한 수학 계산식을 입력할 수 있습니다. 이를 사용하여 Y축 값에 수를 더할 수 있습니다.
+0.15
를 더합니다. 예를 들어, 값이 0.5인 경우 이제 값은 0.5+0.15
가 되어야 합니다.Unity가 이전 값에 +0.15를 적용하여 휠 콜라이더 게임 오브젝트를 Y축에서 위로 0.15유닛만큼 옮깁니다.
이제 휠 콜라이더 기즈모가 완벽하게 휠 메시의 중앙에 위치해야 합니다.
휠 콜라이더 추가에 설명된 워크플로로 휠 콜라이더를 처음 추가하면 셰이프가 너무 크게 나타납니다(씬 뷰에서 휠 콜라이더 기즈모가 휠 모델 메시보다 큼).
이 문제를 정확하게 수정하려면 휠 모델의 정확한 반지름을 알아야 합니다. 이 정보는 3D 모델링 소프트웨어 또는 모델을 저작한 테크니컬 아티스트를 통해 제공받아야 합니다.
이 예시 프로젝트에서 휠 모델의 반지름은 0.44입니다.
0.44
로 설정합니다.휠 모델의 정확한 반지름을 알 수 없거나 사용할 수 없는 경우 휠 콜라이더 기즈모를 사용하여 반지름을 모델과 대략적으로 맞출 수 있습니다. 또는 스피어 콜라이더를 사용하여 반지름을 구할 수 있습니다. 스피어 콜라이더는 연결된 모델의 메시를 포함하도록 자동으로 크기가 조정되기 때문입니다.
스피어 콜라이더로 반지름을 구하려면 다음을 따르십시오.
이제 휠 콜라이더가 휠 모델의 위치 및 크기와 정확히 일치합니다.
차량을 제어하려면 프로젝트에 스크립트를 추가하여 다음을 수행해야 합니다.
이 예시에서는 이를 위해 두 개의 스크립트인 CarControl.cs
및 WheelControl.cs
를 사용합니다.
CarControl.cs
라는 C# 파일을 생성하고 아래 코드를 붙여 넣습니다.
using UnityEngine;
public class CarControl : MonoBehaviour
{
public float motorTorque = 2000;
public float brakeTorque = 2000;
public float maxSpeed = 20;
public float steeringRange = 30;
public float steeringRangeAtMaxSpeed = 10;
public float centreOfGravityOffset = -1f;
WheelControl[] wheels;
Rigidbody rigidBody;
// Start is called before the first frame update
void Start()
{
rigidBody = GetComponent<Rigidbody>();
// Adjust center of mass vertically, to help prevent the car from rolling
rigidBody.centerOfMass += Vector3.up * centreOfGravityOffset;
// Find all child GameObjects that have the WheelControl script attached
wheels = GetComponentsInChildren<WheelControl>();
}
// Update is called once per frame
void Update()
{
float vInput = Input.GetAxis("Vertical");
float hInput = Input.GetAxis("Horizontal");
// Calculate current speed in relation to the forward direction of the car
// (this returns a negative number when traveling backwards)
float forwardSpeed = Vector3.Dot(transform.forward, rigidBody.velocity);
// Calculate how close the car is to top speed
// as a number from zero to one
float speedFactor = Mathf.InverseLerp(0, maxSpeed, forwardSpeed);
// Use that to calculate how much torque is available
// (zero torque at top speed)
float currentMotorTorque = Mathf.Lerp(motorTorque, 0, speedFactor);
// …and to calculate how much to steer
// (the car steers more gently at top speed)
float currentSteerRange = Mathf.Lerp(steeringRange, steeringRangeAtMaxSpeed, speedFactor);
// Check whether the user input is in the same direction
// as the car's velocity
bool isAccelerating = Mathf.Sign(vInput) == Mathf.Sign(forwardSpeed);
foreach (var wheel in wheels)
{
// Apply steering to Wheel colliders that have "Steerable" enabled
if (wheel.steerable)
{
wheel.WheelCollider.steerAngle = hInput * currentSteerRange;
}
if (isAccelerating)
{
// Apply torque to Wheel colliders that have "Motorized" enabled
if (wheel.motorized)
{
wheel.WheelCollider.motorTorque = vInput * currentMotorTorque;
}
wheel.WheelCollider.brakeTorque = 0;
}
else
{
// If the user is trying to go in the opposite direction
// apply brakes to all wheels
wheel.WheelCollider.brakeTorque = Mathf.Abs(vInput) * brakeTorque;
wheel.WheelCollider.motorTorque = 0;
}
}
}
}
CarControl.cs
스크립트를 Car
루트 게임 오브젝트에 추가합니다.
CarControl.cs
스크립트는 사용자 입력을 기반으로 가속화, 토크, 제동과 같은 차량 동작을 처리합니다. 자세한 내용은 코드 주석을 참조하십시오.
CarControl.cs
스크립트의 일부 요소는 다음 섹션에서 생성되는 WheelControl.cs
스크립트를 참조합니다.
WheelControl.cs
라는 C# 파일을 생성하고 다음 코드를 붙여 넣습니다.
using UnityEngine;
public class WheelControl : MonoBehaviour
{
public Transform wheelModel;
[HideInInspector] public WheelCollider WheelCollider;
// Create properties for the CarControl script
// (You should enable/disable these via the
// Editor Inspector window)
public bool steerable;
public bool motorized;
Vector3 position;
Quaternion rotation;
// Start is called before the first frame update
private void Start()
{
WheelCollider = GetComponent<WheelCollider>();
}
// Update is called once per frame
void Update()
{
// Get the Wheel collider's world pose values and
// use them to set the wheel model's position and rotation
WheelCollider.GetWorldPose(out position, out rotation);
wheelModel.transform.position = position;
wheelModel.transform.rotation = rotation;
}
}
이 스크립트를 각 휠 콜라이더 게임 오브젝트에 추가합니다.
WheelControl.cs
스크립트는 WheelCollider.GetWorldPose
를 사용하여 휠 콜라이더의 씬 내 포지션을 얻습니다. 그러면 스크립트가 해당 포지션 정보를 지정된 휠 모델 게임 오브젝트에 할당합니다. 자세한 내용은 코드 주석을 참조하십시오.
WheelControl.cs
스크립트의 각 인스턴스는 해당 휠 모델 게임 오브젝트에 대한 레퍼런스를 포함해야 합니다.
각 휠 콜라이더에 맞는 휠 모델 게임 오브젝트를 할당하려면 다음을 따르십시오.
또한 CarControl 스크립트에서 모터 입력과 스티어링 입력을 받을 휠을 선택해야 합니다. Wheel Control 프로퍼티를 통해 사륜구동 차량을 시뮬레이션하려면 다음을 따르십시오.
차량을 테스트하려면 플레이 모드로 들어가서 화살표 또는 WASD 키를 사용하여 옮기고 스티어링합니다. 입력 컨트롤은 Game(게임) 뷰에 포커스가 있을 때만 작동합니다.
씬에서 움직이는 차량을 더 잘 보려면 다음을 따르십시오.
Car
루트 게임 오브젝트를 선택한 다음 Shift + F를 누릅니다.이제 기본 설정이 완료되었으므로 다양한 설정을 변경하여 차량의 움직임에 어떤 영향을 미치는지 살펴볼 수 있습니다. 다른 차량 모델에 대해서도 이 지침을 따라 설정의 유사점과 차이점을 살펴볼 수 있습니다.