[Paper2D로 게임 만들기 필기] 9. 게임 인스턴스, 컴포넌트, UI, 유지보수
게임 인스턴스
이제껏 만들어서 사용하던 BP_gamemode 라는 gamemode는 레벨에 종속적이다. 따라서 레벨이 바뀌면(ex. 맵 이동) 정보가 휘발될 수 있음. 따라서 전역적인 변수는 관리가 힘들다.
그 다음으로 많이 사용한 get actor of class 는 정석적인 관리법은 아니다.(임의로 액터에 접근하여 데이터 관리)
따라서 게임 시작부터 끝까지 유지 되어야 하는 정보가 있다면 '게임 인스턴스' 를 사용한다.
게임 인스턴스는 게임의 시작과 끝까지 유지되는 클래스라고 생각하면 된다.
컴포넌트
컴포넌트의 종류는 두 가지인데, Actor Component와 Scene 컴포넌트 이다.
액터 컴포넌트(Actor Component) - 어느 액터에나 붙을 수 있는 컴포넌트 / 액터에 대한기능만 가지고 있음
씬 컴포넌트(Scene Component) - 씬에 쓰이고, 씬에 붙을 수 있는 컴포넌트 / 액터에 대한 회전, 좌표 변경 등이 가능하고 계층적 구조를 띈다.
유니티의 컴포넌트와 같은데, 언리얼에서는 미리 이렇게 틀이 만들어져 있다. 만약 플레이어의 정보를 따로 저장하고 싶다면 액터 컴포넌트를 만들어 그 곳에 몰아주면 된다. 또 만약 씬 컴포넌트를 사용한다면 액터의 회전 등 눈에 보이는 변형이 가능하다 생각하면 편할 듯하다.
UI
이전에 체력 바를 만들 때 위젯으로 만들어서 플레이어에 달아 주었었다.
Text block 에는 Kill Count 를 세어 줄 수 있게 함수를 만들어 출력해 준다. 위젯에서 Kill Count를 셀 수 있도록 변수를 만들기 보다는 게임모드 / 인스턴스에서 가져오는 것이 좋다는 것을 우린 이미 알고 있다. 설계를 잘 해서 코드의 작동이 꼬이지 않도록 해 주자. 버그는 이러한 사소한 것들에서 생긴다고 했다.
유지 보수 관점에서의 함수 사용시 주의점
Rookiss 님의 설명을 참고해서 적어보자면, 현업에서는 한 코드를 한 명만 보는 것도 아니고, 코드를 복사해서 쓰는 일도 비일비재하다 한다. 따라서 코드의 관리가 수월하게 해 주어야 한다.
예를 들어 내가 짠 함수가 앞의 좌표를 확인 후 공격을 하는 함수라고 해보자. 그러면 이 함수는 '좌표 계산 + 공격' 이 한번에 들어간 함수이다. 만약 팀장님이 오셔서 이제부터 플레이어가 공격만 하는 것이 아닌, 앞의 좌표에 대한 계산 후 공격이 끝나면 아이템을 줍는 행동도 할 수 있게 만들고 싶다고 하신다. 그러면 이전 함수 전체를 복사해서 아이템을 줍는 함수를 새로 만드는 것이 아니라, '좌표 계산' + '공격' 을 따로 분리해 준다면 '좌표 계산' + '아이템 줍기' 형식으로 새 함수를 쉽게 만들 수 있을 것이다. 또한 좌표 계산에 변형을 가해야 한다면 손쉽게 함수를 찾아서 수정할 수 있다.
말 그대로 어떤 협업자가 와도 함수 이름이 직관적으로 이해하기 쉽게 잘 쓰여 있다면, 함수만 떼서 사용하는 식으로 사용이 가능하다는 말이다.
몬스터 랜덤 스폰, 디스폰
몬스터를 수동으로 계속 배치해줄 수는 없으니 랜덤한 시간에 랜덤한 위치에 몬스터를 설정해 둔 수 사이로 스폰을 하고, 체력을 전부 깎아서 몬스터가 죽으면 디스폰을 하는 블루프린트를 만들 예정이다.
우선 위에서 설명한 액터 컴포넌트를 TileMap 에 붙여준다.
블루프린트의 내용은 보면 알겠지만 단순히 랜덤 정수를 받아와 그 시간만큼 delay 후 몬스터를 스폰하는 것이다.
완성
이렇게 2D 게임 만들기 실습이 완료되었다. 바로 3D로 넘어갈지 툴에 익숙해지는 시간을 가질지는 고민해봐야 할 것 같다.