6. 3인칭 카메라 구현

2013. 7. 9. 00:44게임 개발/Unity

 


게임에 사용되는 카메라 컴포넌트 작성을 시작으로, 카메라가 캐릭터를 따라 이동, 3인칭 시점의 카메라 이동하는 부분에 대한 구현이다.

 

<<기본 프로젝트 Scene Setting 절차>>

a. 바닥 (Ground)

- Plane Game Object 생성 (121 vertexs, 200 tris uv plane Mesh가 생성)
-
캐릭터와 바닥이 충돌이 일어 나야 하기 때문에 Mesh Collider를 추가

- Mertial
를 생성해서 기본적인 Texture를 추가

b. 광원

-       Directional light 를 추가 해주고, 적당하게 위치를 추가

스크립트 전용 게임 오브젝트 생성

-       Main Camera Scene 이 최초 생성될 때 같이 생성되며, 적당한 위치값을 조정

c.장애물

-       Cube를 이용해서 만들어 주고, 바닥과 마찬가지로 구성

d. 캐릭터 (Character)

-       실제로 마우스 input을 받아서 움직여 주는 기능의 주체

-       3D Max 로 제작한 캐릭터를 임포트해서 적용한다.

-       충돌을 위해서 사람의 형태인 Capsule Collider 제공
(
기즈모를 이용해서 x,y,z, 축 및  Radius 조절해서 맞춰 준다.)

-       Rigidbody(강체)를 적용한다. 물리에 대한 부분을 적용하기 위해서..
한번 만든 부분을 위의 사항에 따라 매번 반복하지 않게 하기 위해 prefab 을 제공한다
.
(
쉽게 보면 prefab 자체는 template 로 보면 된다.)

Navigation Mesh 활용

-       캐릭터가 클릭한 위치까지 이동을 하는데 있어서, 장애물을 회피해서 캐릭터 이동

 

 

1.     CameraControl.cs 체크

여기에서는 Mathf.Lerp 에 대해서 나오는데, 두 사이의 값 의 평균을 보간?? 해준다는데.>
다시 말해 자연스러운 회전,이동등에 연출되는 값이라고 생각하면 쉽다
.?

///
/// 3rd person camera with smooth damping.
///
public class FollowCamera : MonoBehaviour
{
    public Transform target = null;
   
    public float distance = 10.0f;
    public float minHeight = 5.0f;
    public float height = 5.0f;
    public float maxHeight = 30.0f;
    public float heightDamping = 2.0f;

    public float rotation = 0;
    public float rotationDamping = 3.0f;

    public float rotationFactor = 1;
    public float zoomFactor = 1;

    private Transform tm;

    // Use this for initialization
    void Start ()
    {
               // lcoal caching for the performance.
               this.tm = this.gameObject.transform;
    }

    // Update is called once per frame
    void Update ()
    {
        if (target)
               {
                          // adjust height.
                          if(this.height < this.minHeight)
                                    this.height = this.minHeight;
                          else if(this.height > this.maxHeight)
                                    this.height = this.maxHeight;

                          float wantedHeight = target.position.y + this.height;
                          float currentHeight = transform.position.y;
                          if(this.heightDamping != 0)
                          {
               currentHeight = Mathf.Lerp(currentHeight, wantedHeight, this.heightDamping * Time.deltaTime);
                       }
                          else
                                    currentHeight = wantedHeight;

                          // position.
                          this.tm.position = target.position;
                          this.tm.position -= Vector3.forward * distance;

                          Vector3 pos = this.tm.position;
                          pos.y = currentHeight;
                          this.tm.position = pos;

                          // rotation.
                          float wantedRotation = this.rotation;
                          if(this.rotationDamping != 0)
                          {
    wantedRotation = Mathf.LerpAngle(tm.eulerAngles.y, this.rotation, this.rotationDamping * Time.deltaTime);
                          }
                          this.tm.RotateAround(target.position, Vector3.up, wantedRotation);
                          this.tm.LookAt(target);                         
               }
    }
}

 

 

활용팁

1.     Unity3D에서 scene 은 반드시 하나 이상의 카메라를 가져야 한다.
바꾸어 말하면 scene 에는 여러 개의 카메라가 존재 할 수 있다.

2.     이 때 화면을 렌더링하는 카메라는 Camera.main 으로 얻어 올 수 있다.

3.     여러 개의 카메라를 사용 할 때 3D 공간을 렌더링 하는 카메라는 Clear flag Skybox 로 설정되어야 하며, UI를 렌더링 하는 카메라의 경우 Clear Flag Depth Only 로 설정한다.