[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 변수의 거리만큼 카메라를 벌려주면
카메라가 멀리서 플레이어를 바라보는것처럼 만들수 있다.
결과
'Unity3D > Project' 카테고리의 다른 글
[Unity3D] RPG게임 카메라 - 줌 인/아웃, 카메라 회전. [Part 3] (3) | 2017.03.08 |
---|---|
[Unity3D] RPG게임 카메라 - 줌 인/아웃, 카메라 회전. [Part 2] (0) | 2017.03.07 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 5] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 4] (0) | 2017.03.02 |
[Unity3D] 캐릭터 움직임, 충돌체크, 물리엔진사용 X [Part 3] (1) | 2017.03.02 |