유니티 1인칭 카메라 스크립트

유니티 1인칭 카메라 스크립트

Author : Jino Bae / Send Mail (Updated: )

유니티를 간만에 사용할 일이 생겼는데 간만에 하니까 정말 아무것도 기억이 안났다. 물론 간보듯이 살짝 해본게 가장 큰 문제였겠지만… 여튼간에 다시 사용해 본 김에 제대로 다시 공부하고 공부한 내용을 기록해 놓으려고 한다.


기본 환경

기본환경

기본적인 환경 구성은 위와 같다. 아무 움직임 없는 큐브와 카메라로 구성되어 있다.

스크립트

CameraMove라는 스크립트를 생성하였다. 해당 스크립트를 카메라로 드래그하여 적용시켜 주었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMove : MonoBehaviour
{
    int speed = 5;

    void Start()
    {
    }
    
    void Update()
    {
        moveObject();
    }
    void moveObject()
    {
        // Code Here !!!
    }
}

일단 모든 코드를 일일이 나열하면 굉장히 길어질 수 있으므로 기본적인 코드에 기본적인 구조는 위와같으며 아래에 작성된 모든 코드는 위 코드에 나열된 Code Here !!! 부분에 들어간다.


앞뒤로 움직임

1
2
3
4
5
6
7
8
9
if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
{
    transform.Translate(Vector3.forward * speed * Time.smoothDeltaTime, Space.World);
}

if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
{
    transform.Translate(Vector3.forward * speed * Time.smoothDeltaTime * -1, Space.World);
}

transform.Translate(Vector3.forward)라는 함수를 사용하고 있다. DownArrow 에서는 -1을 곱해주어 반대 방향으로 움직이도록 하였다. 화살표 뿐만 아니라 W, A, S, D도 함께 사용하기 위해 위와같이 작성하였다.


좌우로 움직임

1
2
3
4
5
6
7
8
9
if(Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))
{
    transform.Translate(Vector3.right * speed * Time.smoothDeltaTime, Space.World);
}

if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))
{
    transform.Translate(Vector3.right * speed * Time.smoothDeltaTime * -1, Space.World);
}

transform.Translate(Vector3.right)라는 함수를 사용하고 있다.


상하로 움직임

앞뒤 좌우로만 움직이면 한계가 있으므로 Ctrl과 Space를 이용하여 상하로 움직이는 동작을 만들어 보고자 하였다.

1
2
3
4
5
6
7
8
9
if (Input.GetKey(KeyCode.Space))
{
    transform.Translate(Vector3.up * speed * Time.smoothDeltaTime, Space.World);
}

if (Input.GetKey(KeyCode.LeftControl))
{
    transform.Translate(Vector3.up * speed * Time.smoothDeltaTime * -1, Space.World);
}

transform.Translate(Vector3.up)라는 함수를 사용하고 있다. Vector의 각 값에 대해선 꼭 알아보도록 해야겠다. 회전도 간단하게 구현을 했지만 회전이 되었을 경우 움직임에 문제가 있어서 수정 후 올리도록 해야겠다.


완성된 코드

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
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMove : MonoBehaviour
{
    int speed = 5;

    void Start()
    {
    }

    void Update()
    {
        moveObject();
    }
    void moveObject()
    {
        if(Input.GetKey(KeyCode.RightArrow) || Input.GetKey(KeyCode.D))
        {
            transform.Translate(Vector3.right * speed * Time.smoothDeltaTime, Space.World);
        }

        if (Input.GetKey(KeyCode.LeftArrow) || Input.GetKey(KeyCode.A))
        {
            transform.Translate(Vector3.right * speed * Time.smoothDeltaTime * -1, Space.World);
        }

        if (Input.GetKey(KeyCode.UpArrow) || Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward * speed * Time.smoothDeltaTime, Space.World);
        }

        if (Input.GetKey(KeyCode.DownArrow) || Input.GetKey(KeyCode.S))
        {
            transform.Translate(Vector3.forward * speed * Time.smoothDeltaTime * -1, Space.World);
        }

        if (Input.GetKey(KeyCode.Space))
        {
            transform.Translate(Vector3.up * speed * Time.smoothDeltaTime, Space.World);
        }

        if (Input.GetKey(KeyCode.LeftControl))
        {
            transform.Translate(Vector3.up * speed * Time.smoothDeltaTime * -1, Space.World);
        }
    }
}

+2019-05-17

수정된 코드

회전에서 문제가 있다고 했었는데 transform.Translate()함수에서 Space부분에 World라고 호출한 것이 화근이었다. Space.World는 세상을 중심으로 움직이다보니 forward를 했을때 절대적인 앞으로 이동하게 된다. 아래는 수정하여 회전과 위아래를 볼 수 있는 코드다. 마우스로 움직이려면 주석처리된 부분을 풀어주면 된다.

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CameraMove : MonoBehaviour
{
    public float speed = 5.0f;
    public float rotate = 20.0f;

    // public float mouseSensitivity = 2f;
    // private float rotY;
    // private float rotX;

    void Start()
    {
    }

    void Update()
    {
        CameraMoving();
        CameraRotate();
        CameraUpDown();
    }

    void CameraMoving()
    {
        if(Input.GetKey(KeyCode.D))
        {
            transform.Translate(Vector3.right * speed * Time.smoothDeltaTime);
        }
        if (Input.GetKey(KeyCode.A))
        {
            transform.Translate(Vector3.left * speed * Time.smoothDeltaTime);
        }
        if (Input.GetKey(KeyCode.W))
        {
            transform.Translate(Vector3.forward * speed * Time.smoothDeltaTime);
        }
        if (Input.GetKey(KeyCode.S))
        {
            transform.Translate(Vector3.back *  speed * Time.smoothDeltaTime);
        }
    }

    void CameraRotate()
    {
        if (Input.GetKey(KeyCode.E))
        {
            transform.Rotate(Vector3.back * rotate * Time.smoothDeltaTime);
        }
        if (Input.GetKey(KeyCode.Q))
        {
            transform.Rotate(Vector3.forward * rotate * Time.smoothDeltaTime);
        }

        if (Input.GetKey(KeyCode.LeftArrow))
        {
            transform.Rotate(Vector3.down * rotate * Time.smoothDeltaTime);
        }
        if (Input.GetKey(KeyCode.RightArrow))
        {
            transform.Rotate(Vector3.up * rotate * Time.smoothDeltaTime);
        }
        if (Input.GetKey(KeyCode.DownArrow))
        {
            transform.Rotate(Vector3.right * rotate * Time.smoothDeltaTime);
        }
        if (Input.GetKey(KeyCode.UpArrow))
        {
            transform.Rotate(Vector3.left * rotate * Time.smoothDeltaTime);
        }

        /*
        rotY = Input.GetAxis("Mouse X") * mouseSensitivity;
        rotX = Input.GetAxis("Mouse Y") * mouseSensitivity;

        transform.localRotation *= Quaternion.Euler(0, rotY, 0);
        transform.localRotation *= Quaternion.Euler(-rotX, 0, 0);
        */
    }

    void CameraUpDown()
    {
        if (Input.GetKey(KeyCode.Space))
        {
            transform.Translate(Vector3.up * speed * Time.smoothDeltaTime, Space.World);
        }
        if (Input.GetKey(KeyCode.LeftControl))
        {
            transform.Translate(Vector3.down * speed * Time.smoothDeltaTime, Space.World);
        }
    }
}

Jino Bae
WRITTEN BY

Jino Bae

Digital is a purely man-made playground. That's why I like.
im@baejino.com


comments powered by Disqus