[Unity3D] RPG게임 카메라 - 줌 인/아웃, 카메라 회전. [Part 1]

※ 주의 

이 글은 아마추어가 개인적으로 생각하여 작성하는 것으로, 이곳에 나오는 내용을 맹신하지 않는것을 당부드립니다.

 

 

기능정리

 

1. 플레이어를 따라오는 카메라.

1.5. 플레이어의 움직임.

2. 마우스 휠 카메라 줌 인,아웃 기능.

3. 마우스 오른쪽 버튼 클릭 후 카메라 회전.

- x,y축 회전

- x축 회전의 한계치 설정.

 

 

완성작 미리보기.

 

 

 

 

1. 플레이어를 따라오는 카메라.

 

카메라가 플레이어와 아에 멀리 떨어져 있어도 따라오는 카메라를 만들어야 한다.

 

 

카메라가 직접 플레이어를 따라가게 만들지 않을것이다.

카메라이라는 빈 객체를 만들어서 이 객체가 플레이어를 직접적으로 따라갈 것이고,

카메라는 카메라맨과 일정 거리를 유지한체 따라다닐 것이다.

 

이러한 번거로운 작업을 할 필요 없이 '카메라를 플레이어의 자식으로 두면 되는거 아닌가요?' 라고 묻는다면

그냥 따라다니기만 할거라면 그렇게 해도 되지만, 우리는 줌 인/아웃 또는 카메라를 회전시킬 것이기 때문에

이러한 과정이 필요하다고 말해두겠다. 

물론 이렇게 넣는다고 해서 이러한 과정이 불 가능해 지는것은 아니지만, 매우 귀찮은 코딩이 필요해 지기 때문에

그러한 과정은 피하도록 하겠다.

 

 

1. 빈 오브젝트를 만든다. - 이름은 CameraMan

2. 또다시 빈 오브젝트를 만든다. - 이름은 CameraVector

3. 또다시 빈 오브젝트를 만든다. - 이름은 Axis

4. CameraMan에 자식으로 CameraVector를 넣는다.

5. CameraMan에 자식으로 Axis를 넣는다.

6. Axis의 자식으로 Camera를 넣는다. (이 카메라는 메인카메라이다.)

 

 

 

 

재료를 만들었으니 이제 스크립트를 작성해 보자.

 

스크립트의 이름은 CameraMan이다.

이 스크립트는 CameraMan오브젝트에 넣으면 된다.

 

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class CameraMan : MonoBehaviour {
 
    // 공개
    public float MoveSpeed;     // 플레이어를 따라오는 카메라 맨의 스피드.
 
    // 비공개
    private Transform Target;   // 플레이어의 트랜스 폼.
    private Vector3 Pos;        // 자신의 위치.
 
    void Start()
    {
        // Player라는 태그를 가진 오브젝트의 transform을 가져온다.
        Target = GameObject.FindGameObjectWithTag("Player").transform;
    }
 
    // 플레이어를 따라다님.
    void Update () 
    {
        Pos = transform.position;
        transform.position += (Target.position - Pos) * MoveSpeed;
    }
}
cs

 

 

(플레이어의 위치 - 자신의 위치)를 빼주면 현재 카메라맨의 위치에서 플레이어의 벡터(방향)가 구해진다.

그 벡터를 향해 값을 플러스(+) 해주면 카메라맨은 플레이어를 쫓아가게 된다.

* MoveSpeed는 카메라맨이 플레이어를 쫓아가는 스피드다.

 

 

※ 플레이어의 Transform을 가져오기위한 설정.

 

플레이어는 그냥 큐브를 하나 만들어주고 이름을 Player로 바꿔주고,

태그를 Player로 바꿔주면 된다.

 

 

 

 

그 뒤 실행을 해보면

 

※ CameraMan스크립트 컴포넌트에서 MoveSpeed를 설정해주지 않으면 카메라맨이 움직이지 않는다.

 

카메라맨이 플레이어를 따라가지만, 카메라에 비치지 않는것을 확인 할 수 있다.

이것은 당연한 것이다. 우리는 아직 카메라맨과 카메라와의 유지거리를 설정해주지 않았기 때문이다!

 

카메라의 유지거리를 설정하기 위한 스크립트를 짜보도록 하자. 

 

Axis스크립트.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Axis : MonoBehaviour {
 
    // 공개
    public float Distance;          // 카메라와의 거리.
 
    // 비공개
    private Vector3 AxisVec;        // 축의 벡터.
    private Transform MainCamera;   // 카메라 컴포넌트.
 
    void Start()
    {
        MainCamera = Camera.main.transform;
    }
 
    void Update()
    {
        DisCamera();
    }
 
    void DisCamera()
    {
        AxisVec = transform.forward * -1;
        AxisVec *= Distance;
        MainCamera.position = transform.position + AxisVec;
    }
}
cs

 

현재 플레이어의 Position == CameraMan의 Position == Axis의 Position은 같다.

왜냐하면 CameraMan이 플레이어를 추적하기 때문이다.

Axis가 같은 이유는 CameraMan의 자식이기 때문이다.

 

그렇기 때문에 Axis의 전방벡터 (transform.forward)는 플레이어의 전방벡터 이기도 하다.

이러한 전방벡터에 -1을 곱한다는것은 플레이어의 후방벡터의 방향을 뜻한다.

 

플레이어가 보고있는 방향의 반대 방향으로 Distance 변수의 거리만큼 카메라를 벌려주면

카메라가 멀리서 플레이어를 바라보는것처럼 만들수 있다.

 

 

 

 

 

 

결과