[Unity Engine] 유니티 엔진 게임 개발 일지 #2

신형석·2023년 3월 6일
0

게임 개발 일지

목록 보기
2/10

이전 일지에서는, 탱크를 전후좌우 움직이는 방법을 알아보았다. 이번엔, 적어놓은 목표 중 2번을 해보려고 한다.

  1. 탱크에서 포탄이 마우스 방향으로 발사되어야 한다.

처음엔 마우스 방향으로 발사하는 것이 어려워, 마우스를 클릭할 시 포탄의 프리팹을 복사해 탱크 위치로 보내는 프로그램을 작성해보았다.

[SerializeField] GameObject bulletPrefab;
[SerializeField] GameObject tank;
void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            GameObject bullet = Instantiate(bulletPrefab);
            bullet.transform.position = tank.transform.position;
        }
    }

설명해야 할 것이 많다. 하나씩 설명하겠다.

우선, Input.GetMouseButton에 대해 먼저 설명해야 한다. Input은 유니티의 클래스 중 하나로, GetMouseButton 이외에도 다른 함수들이 있다. 이는 이름에서도 보이다시피, 입력을 받아올 수 있는 클래스이다. 예를 들어,

Input.GetKey(KeyCode.키 이름);

이 코드는 키 이름을 가진 키를 눌렀을 때 반응하는 코드이다. 또한,

Input.GetMouseButtonDown(0);

이 코드는 마우스 버튼을 눌렀을 때 반응하는 코드이다. 키보드의 키를 눌러야 한다면 위의 코드를, 마우스를 클릭하는 일이 있다면 밑의 코드를 사용하면 되겠다.

GameObject bullet = Instantiate(bulletPrefab);

위 코드는 SerializeField로 받아온 bullet의 프리팹을 복사하여, GameObject 변수의 bullet에 넣는 코드이다. Instantiate는 적어놓은대로, 특정 게임오브젝트를 복사하는 함수이다. 현재는 3개의 인수밖에 없지만, Unity Documentation을 참고하면

public static Object Instantiate (Object original, Vector3 position, Quaternion rotation);

이와 같이 3개의 함수를 가지고 있다. original은 말 그대로 복사할 오브젝트의 원형, position은 복사한 오브젝트의 생성 위치, rotation은 복사한 오브젝트의 회전값을 의미한다.

적는 김에 Vector3와 Quarternion의 의미도 적도록 하겠다.
Vector3는 3차원 벡터를 표현하는 방법이다.

Vector3(0, 0, 0)

와 같이 표현하며, 2차원에서는 Vector2 변수를 따로 사용하지만 Z값의 변화는 2차원에서는 드러나지 않는다.

Quarternion은 유니티에서 오브젝트의 실제 회전량을 저장하기 위해 사용하는 클래스이다. 이는 오브젝트 회전을 위해 인스펙터에 표시되는 각인 오일러 각과는 다른 형태의 클래스이다. 쿼터니언 값은 우리가 실제로 이해하기 힘들기 때문에, 인스펙터에서 보여주는 값은 오일러 각이다. 그러나 인스펙터에서 실제로 값을 조정하면, 컴퓨터에서는 쿼터니언 값으로 인식하여 움직인다. 쿼터니언도 클래스라 여러 가지 함수를 가지고 있지만, 여기서는 회전값을 나타내기 위한 변수형으로 쓰였다.

다음은 이 코드를 보겠다.

bullet.transform.position = tank.transform.position;

코드를 많이 봤다면 익숙하겠지만, 이 코드는 bullet의 transform의 position을 tank의 transform의 position으로 하라는 뜻이다. 조금 더 풀어서 설명하자면, bullet의 위치를 tank의 위치로 옮겨달라는 명령문이다. bullet은 위의 Instantiate 함수를 통해 복사된 오브젝트이므로, 복사된 오브젝트를 현재 탱크의 위치로 옮겨주는 코드라고 생각하면 된다.

이렇게 마우스 클릭을 했을 때, bullet을 탱크 위치로 옮기는데 성공하였다. 길이 너무 길어졌으므로, 다음 포스팅에서 마우스 방향으로 발사하는 함수를 추가하도록 하겠다.

0개의 댓글

관련 채용 정보