오늘은 유니티 교재를 통해 간단한 탄막 피하기 게임을 만들었다.이 게임은 과거 고무 플레이어 이스터 에그로 내장됐던 닷지 게임 형식이다.
![]()
우선 프로젝트의 전체적인 모습의 Hierarchy부터 살펴보자.기본적으로는 프로젝트 생성 시 주어지는 MainCamera와 Directional Light 외에 전체적인 맵, 생성기, 오브젝트 풀을 포함하는 Level 오브젝트와 캡슐형 플레이어, 그리고 UI 관련 Canvas, 그리고 이에 대해 이벤트를 처리하는 자동 생성되는 EventSystem, 마지막으로 전체적인 게임 관리를 해주는 GameManager 오브젝트까지 있다. 우선 Main Camera부터 보자
메인 카메라의 인스펙터 창을 보면 기본으로 세팅되어 있는 트랜스폼과 Size, 그리고 투영 방식을 기존의 Perspective에서 Orthographic으로 바꾼 모습을 볼 수 있는데, 이 프로젝트 자체는 3D 프로젝트로 생성했기 때문에 기본 카메라가 3D에 맞게 설정되어 있는 것을 어차피 쉽게 2D로 보이도록 하기 위해 바꿨다.
Directional Light도 기본적으로는 약간 비스듬히 비춰주지만 굳이 그럴 필요가 없어 카메라 방향과 동일하게 위에서 아래로 내리쬐도록 바꿨다. (Transform의 Rotation 값 변경으로 인해)
이번에는 Level 오브젝트를 보자.바닥으로 쓰이는 Plane과 주변을 막아주는 벽, 4번째 벽이 장면상에서 보이지 않는데 왜 그런지 모르겠다 게임 장면에서는 잘 보인다.일단 패스.. 그리고 총 9개의 캡슐이 있는데 이것이 Bullet Spawner 객체로서 총알을 생성하는 역할을 하는 객체이며 마지막으로 총알을 비활성화 상태로 넣고 필요에 따라 하나씩 꺼내주는 Object Pool 객체를 확인할 수 있다.Plane 오브젝트의 인스펙터 창은 기본적으로 가지고 있는 컴포넌트로 Transform Mesh Filter, Mesh Render, Mesh Collider 그리고 기본적으로는 흰색의 머티리얼을 가지고 있지만 프로젝트 폴더에서 Plane Color라는 새로운 머티리얼을 생성하고 그 색을 바꿔서 Attach해 주었다.Wall이 총 4개가 있는데 우선 여기서 Tag가 Wall로 되어 있는 것을 확인할 수 있는데 Tag를 추가해서 바꾼 이유는 이 예제 자체가 쉽게 만든 것이기 때문에 탄환의 비활성화를 단순히 일정 시간이 지나면 Destroy 함수를 호출해서 파괴하는 방식인데 이렇게 해버리면 Wall 밖을 나가버리는 탄환들의 신경이 쓰일 수도 있기 때문에 Tag를 부여하고 나중에 충돌 처리로 벽에 닿으면 탄환을 없애기 위해 설정해주었다.Transform의 Position이 저렇게 되어있는 이유는 4개의 Wall을 동시에 잡아서 인스펙터 창에 표시하는데 각각 다른 값이 들어있는 것은 -표시되고 4개가 같은 값을 갖는 값은 해당 값을 표시해준다.Bullet Spawner 객체는 아까 총 9개 지점에 각각 배치되어 있고 저기 추가되어 있는 Bullet Spawner 스크립트를 통해 이를 제어할 것이다. 스크립트 아래에 Bullet Prefab, Spawn Rate Min, Spawn Rate Max가 있는데, 이는 인스펙터 창에서 확인하고 제어할 수 있도록 스크립트 안에서 public으로 설정되어 있기 때문이다.스크립트의 내용을 보면 위에서 언급한 바와 같이 public 접근 제한자로서 3가지가 선언되어 있음을 알 수 있다.그리고 그 밑에 다른 멤버 변수로 Transform 형식의 target이라는 변수, float형의 두 가지 변수가 있는데 각각 주석에서 어떻게 쓰이는지 적어놨다.그리고 Update 호출 전에 Start문을 이용하여 이 변수를 초기화해 준다.Update문을 보면 스위치문에서 static으로 선언된 GameManager의 Level변수를 통해서 꼭대기에서 선언된 두 변수를 제어한다.수준에 의해서 생성 주기를 줄이고 난이도를 만들어 본 것이다.그리고 논리를 통해서 Time.delta Time을 누적하고 더한 값을 spawn Rate변수와 비교하여 해당 시간이 경과하면 더한 변수를 0으로 되돌리고, Object Pool의 Get Object함수를 이용하여 객체 수영장에서 비활성화 상태로 갖고 있는 총알을 가져오고 생성하는 것이다.그리고 해당 탄환의 초기 위치는 탄환을 생성한 BulletSpawner객체의 위치 값으로 static함수 LookAt에서 해당 target(Start문에서 PlayerController컴포넌트를 가진, 즉 플레이어의 위치 값)을 바라보게 하고 재생성을 언제 할지를 정한 spawnRate변수를 다시 랜덤으로 부여한다.그리고 정리하고 발견했지만, 저렇게 주석으로 지워진 부분이 본래의 예이며, 이는 위에서 public으로 선언한 Bullet의 프레화브을 Instantiate함수에서 생성하고 있지만 이를 객체 풀링 방식으로 바꾸고 위에 프레화브을 넣은 것은 지워도 좋다.Object Pool 객체에 붙어 있는 스크립트를 보자.일단 오브젝트 풀을 싱글톤 패턴으로 하고 아까 위에서는 인스펙터 창에서 제어할 수 있도록 public으로 해줬다면 이번에는 private로 해줬는데 위 사진에서는 똑같이 public으로 한 것처럼 인스펙터 창에 노출되는 것을 볼 수 있는데 이것은 저[Serialize Field]속성 속성을 주었기 때문입니다. 유니티에서 기본적으로 지원하는 기능.그리고 총알을 넣을 Queue를 선언하고 Awake 함수로서 Initalize라는 함수를 이용하여 아래에서 작성한 Create New Object 함수로 큐에 하나하나 생성하여 넣는다.매개변수로 int값을 받아 해당 개수만 만들되 일단 30개 정도를 만들어 사용하고 만약 이보다 많은 탄환이 필요하다면 추가적으로 더 만들 수 있게 해줄 것이다.설명은 주석으로 해놨어~플레이어 오브젝트도 Tag가 지정되어 있는데, 이는 따로 만들지 않아도 유니티에서 기본적으로 제공해주는 Tag이기 때문에 사용 물리 연산을 하기 위해 Rigid Body 컴포넌트를 붙여 중력을 이용해 바닥에서 만든 Plane 위에서 움직일 예정이다. 그리고 Constrains로 축을 제한하여 이동은 y축을 막고 x, z축으로만 이동하고 회전은 y축으로만 돌아가도록 하였다.플레이어 오브젝트도 Tag가 지정되어 있는데, 이는 따로 만들지 않아도 유니티에서 기본적으로 제공해주는 Tag이기 때문에 사용 물리 연산을 하기 위해 Rigid Body 컴포넌트를 붙여 중력을 이용해 바닥에서 만든 Plane 위에서 움직일 예정이다. 그리고 Constrains로 축을 제한하여 이동은 y축을 막고 x, z축으로만 이동하고 회전은 y축으로만 돌아가도록 하였다.
![[스킵 피티] 어린이 보드게임 추천/전략적 사고능력 발달에 좋은 유아 수학 보드게임 [스킵 피티] 어린이 보드게임 추천/전략적 사고능력 발달에 좋은 유아 수학 보드게임](https://thx2.sfo2.cdn.digitaloceanspaces.com/detail_meaning/%EC%82%AC%EA%B3%A0%EB%8A%A5%EB%A0%A5_1.webp)

