본문 바로가기

Unity3D Car/Camera

Car following Camera

이동하는 자동차를 따라다니는 카메라


앞에서는 자동차의 이동/방향전환 등의 방법을 알아보았고 이번에는 자동차의 뒤를 카메라가 따라가는 기능을 작성해 보려고 한다

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


카메라가 이동하는 오브젝트를 따라간다는 것은 오브젝트가 항상 화면의 중앙에 오도록 카메라를 회전하는 것과 오브젝트의 속도에 반응하면서 부드럽게 오브젝트를 추적해가는 것을 의미한다

이번 작업과 같이 인터넷에서 배포되는 3D 모델을 사용하는 경우에는 유니티로 임포트해보면 모델의 앞뒤가 다르게 인식되는 경우가 있는데 이런 경우에는 빈 게임오브젝트를 생성하고 그 안에 모델을 자식 오브젝트로 포함하고 자식 오브젝트를 적절하게 회전하여 방향을 보정해 주고 실제 회전을 적용할 때는 부모 오브젝트가 회전하도록 코드상에 제어하면 문제를 해결할 수 있다.

여기에서 사용한 자동차 모델도 이와 같은 문제가 있어서 언급한 방법을 사용하여 문제를 해결했다.




아래와 같이 FollowCam.cs 를 작성하여 Hierarchy 뷰의 Main Camera 에 드래그하여 설정한다

using UnityEngine;

using System.Collections;


public class FollowCam : MonoBehaviour

{

public Transform carTransform;

public float distance = 6.4f;

public float height = 20f;

public float rotationDamping = 3.0f;

public float heightDamping = 2.0f;

public float zoomRatio = 0.5f;

public float defaultFOV = 60f;


private Vector3 rotationVector = new Vector3();

// Use this for initialization

void Start ()

{

}


void LateUpdate() {

float wantedAngle = rotationVector.y;//carTransform.eulerAngles.y;

float wantedHeight = carTransform.position.y + height;

float camAngle = transform.eulerAngles.y;

float camHeight = transform.position.y;

camAngle = Mathf.LerpAngle(camAngle, wantedAngle, rotationDamping*Time.deltaTime);

camHeight = Mathf.Lerp(camHeight, wantedHeight, heightDamping*Time.deltaTime);

Quaternion qt = Quaternion.Euler(0,camAngle,0);

transform.position = carTransform.position;

transform.position -= qt * Vector3.forward*distance;

transform.position += qt * Vector3.up* camHeight;

transform.Rotate(Vector3.up*rotationVector.y);

transform.LookAt(carTransform);

}


void FixedUpdate() {

Vector3 localVelocity = carTransform.InverseTransformDirection(carTransform.rigidbody.velocity);

if(localVelocity.z < -0.5f) {

rotationVector.y = carTransform.eulerAngles.y + 180; // 후진시 카메라가 앞쪽에서 차를 바라보도록 한다

}else{

rotationVector.y = carTransform.eulerAngles.y;

}

float acc = carTransform.rigidbody.velocity.magnitude;

camera.fieldOfView = defaultFOV + acc*zoomRatio;

}

}



위에서 작성한 FollowCam.cs 를 드래그하여 Hierarchy 뷰의 Main Camera 에 할당하고 스크립트의 public 변수인 carTransform에 Car 오브젝트를 할당한다



실행하여 방향키를 눌러 속도와 방향을 제어하고 후진하면 카메라가 반대 방향으로 이동하여 따라가는 것을 확인할 수 있다