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

※ 주의 

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



기능정리


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

1.5. 플레이어의 움직임.

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

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

- x,y축 회전

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



1.5 플레이어의 움직임.


플레이어부터 움직여 보도록 하자.

카메라가 잘 따라오는지 확인하려면 플레이어가 움직여야 되지 않는가?



Player스크립트를 하나 만들어준다.

이 스크립트에는 2가지 함수가 들어갈 것이다.


1. Run();

2. Rotation();


첫 번째 함수는 플레이어를 움직이게 만드는 함수이고,

두 번째 함수는 플레이어에게 회전을 주어서 원하는 방향으로 이동할수 있게 한다.




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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class Player : MonoBehaviour {
 
    public float Speed;         // 움직이는 스피드.
 
    private Transform Vec;      // 카메라 벡터.
    private Vector3 MovePos;    // 플레이어 움직임에 대한 변수.
 
    void Init()
    {
        MovePos = Vector3.zero;
    }
 
    void Start()
    {
        Vec = GameObject.Find("CameraVector").transform;
        Init();
    }
 
    void Update () 
    {
        Run();
    }
 
    // 플레이어 움직임.
    void Run()
    {
        int ButtonDown = 0;
        if (Input.GetKey(KeyCode.LeftArrow))    ButtonDown = 1;
        if (Input.GetKey(KeyCode.RightArrow))   ButtonDown = 1;
        if (Input.GetKey(KeyCode.UpArrow))      ButtonDown = 1;
        if (Input.GetKey(KeyCode.DownArrow))    ButtonDown = 1;
 
        // 플레이어가 움직임. 버튼에서 손을 땠을 때 Horizontal, Vertical이 0으로 돌아감으로써
        // 플레이어의 회전상태가 다시 원상태로 돌아가지 않게 하기 위해서.
        if (ButtonDown != 0)
            Rotation();
        else
            return;
 
        transform.Translate(Vector3.forward * Time.deltaTime * Speed * ButtonDown);
    }
 
    // 플레이어 회전.
    void Rotation()
    {
        MovePos.Set(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));   // 벡터 셋팅.
        Quaternion q = Quaternion.LookRotation(Vec.TransformDirection(MovePos));  // 회전
 
        if (MovePos != Vector3.zero)
            transform.rotation = q;
    }
}
cs


1. float Speed; 플레이어가 움직이려면 힘이 필요하다. Speed변수를 하나 만들어준다.

2. Transform Vec; 카메라 벡터는, 카메라가 회전한다고 해서 플레이어의 벡터가 달라지는것이 아니므로, 카메라의 벡터를 이용하여 플레이어를 이동시켜주기 위한 변수이다.



3. Vector3 MovePos; 키의 입력을 받아서 플레이어의 벡터를 셋팅해줄 변수이다.



Run() 함수 안에 ButtonDown변수는 키 입력에 반응해 값을 대입 받는다.

키 입력을 받지 않으면 값이 0으로 들어가 플레이어는 움직일수 없게 된다.


반대로 키 입력을 받아 ButtonDown변수에 0이 아닌 값이 들어간다면 플레이어는 움직이게 된다.

그리고, 회전 함수도 함께 수행된다.


ButtonDown변수가 0이 아닐때에만 회전함수를 수행하는 이유는

MovePos에 Horizontal, Vertical로 값을 입력받기 때문이다.


Horizontal은 ←,→에 입력에 따라 -1 ~ +1 의 값이 들어간다.

(※ Vertical은 ↑,↓)

키(Horizontal)를 입력받지 않을 때에는 반환 값이 0으로 들어가는데, 이때 회전 함수가 키 입력(Input.GetKey)에 상관없이 수행된다면 Horizontal에 반환 값 0을 입력받아 플레이어가 다시 원래의 벡터 방향으로 회전하게 된다.

이것을 방지해 주기 위한 처리이다.


1
2
3
4
5
6
7
8
9
10
11
12
    void Run()
    {
        int ButtonDown = 0;
        if (Input.GetKey(KeyCode.LeftArrow))    ButtonDown = 1;
        if (Input.GetKey(KeyCode.RightArrow))   ButtonDown = 1;
        if (Input.GetKey(KeyCode.UpArrow))      ButtonDown = 1;
        if (Input.GetKey(KeyCode.DownArrow))    ButtonDown = 1;
 
        Rotation();
 
        transform.Translate(Vector3.forward * Time.deltaTime * Speed * ButtonDown);
    }
cs


회전 함수를 예외처리 없이 수행했을 경우.



대각선으로 이동하다가 키에 손을 때면 게속 정면을 바라보게 된다.



다음은 회전함수를 살펴보도록 하자.

MovePos.Set을 활용하여 Horizontal과 Vertical의 입력 값을 셋팅한다.

그리고 쿼터니언(Quaternion)을 활용하여 플레이어에게 회전값을 줄것이다.


Quaternion.LookRotation( Vector3 ); - 이 함수는 인자에 들어온 벡터의 방향으로 물체를 회전시켜준다.

만약 A라는 물체가 B라는 물체를 바라보고 싶을때 B까지의 벡터를 구해 이 함수의 인자로 넣어주면

A는 B를 바라보도록 회전시켜준다.


TransformDirection( Vector3 ); - 이 함수는 인자로 들어온 값을 로컬공간에서 월드공간으로 방향을 변환해준다.

인자로 MovePos를 넣어, CameraVector오브젝트의 벡터를 현재 플레이어의 벡터로 활용하는 것이다.


그뒤 transform.rotation에 회전 값 q를 넣어서 적용시켜주면 적절히 회전하게 된다.