Bluehat Games 프로젝트 소개 및 회고

Seonghun
9 min readFeb 16, 2023

--

Bluehat은 작은 동물 친구들로 마을을 먹어 치우는 귀엽고 무시무시한 게임입니다. 갖고 있는 동물을 합성하고, 다양한 모자 아이템으로 개성을 표현할 수 있습니다. 내 동물들을 NFT로 소유하고 게임 내의 마켓에서 거래할 수 있습니다.

졸업작품으로 22년 3월부터 12월까지 진행했던 프로젝트입니다. 서버 개발과 클라이언트 마켓 부분을 담당하여 개발을 진행하였습니다. 프로젝트 소개와 함께 프로젝트를 회고를 진행해보고자 합니다.

메인 화면

메인 화면에서는 현재 내가 보유한 동물들을 확인할 수 있으며, FSM 구성을 통해서, 동물이 맵 내에서 자연스럽게 이동할 수 있도록 구성하였습니다. 화면 터치를 통해 맵을 돌려가며 내가 가진 동물들을 확인할 수 있습니다.

개발된 기능

  • 멀티 플레이 기능
  • 동물 합성 기능
  • 블록체인 로컬 지갑, NFT 거래를 위한 마켓
  • 동물 획득, 미션등
  • 음향효과, 게임 음악, 로그아웃 등의 기능을 위한 설정

멀티 플레이

처음부터 NFT 게임 개발을 목표로 했기 때문에, 마켓 기능 및 동물 합성 등의 다양한 로직이 많이 포함되어 있기에 자체적으로 게임 서버를 구축하기에는 다소 시간이 부족했었습니다. 따라 메인 기능에 초점을 맞추기로 하고 멀티 플레이의 서버는 온프레미스 타입의 Photonengine의 클라우드 서버를 사용하였습니다.

게임 서버를 추가로 구축할 필요 없이 클라이언트 개발만으로 Multiplay 게임 중 다른 동물의 Transform (Position, Rotation, Scale) 및 Animation State 정보를 실시간으로 동기화할 수 있도록 하였습니다.

또한, 게임내의 재미요소를 위해, 마을의 오브젝트를 먹을수록 동물의 사이즈가 점점 커지도록 하였습니다. 멀티 플레이 게임을 통해서 알과 코인을 획득할 수 있고 알을 통해서 새로운 동물 획득이 가능하며 코인은 연금술이나 마켓에서 활용할 수 있습니다.

연금술(동물 합성)

연금술에서는 동물 색상 변경, 동물 모자 획득, 동물 합성과 같은 3가지 기능을 제공합니다. 게임을 진행하게 되면서 알을 획득하면 메인 화면에서 새로운 동물을 획득할 수 있습니다. 하지만 새로운 동물은 색상이 없는 상태로 알에서 나오기 때문에, 동물 색상 변경에서 코인을 통해서 랜덤으로 동물 색상을 변경하거나 모자 획득을 통해 새로운 모자를 씌울 수 있습니다.

Runtime Thumbnail

연금술에서는 나의 동물 목록을 불러오는 부분이 존재하는데, 동물의 종류, 색, 모자 등의 데이터는 서버에서 받아온 데이터에 따라 달라지기 때문에, 저장된 이미지가 아닌 Runtime에 동물의 thumbnail을 캡처하여 UI에 적용하는 방식을 취하고 있습니다.

동물 합성(NFT 화)

동물 합성을 통해서는 NFT 동물을 획득하게 됩니다. OpenSea등의 다른 마켓에서 동물을 확인하기 위해서는 이미지가 필요합니다. 동물을 합성한 뒤 클라이언트에서 이미지를 캡처하여, 서버로 전송하게 됩니다.

이렇게 서버로 전송된 동물 이미지와 메타데이터는 분산형 파일 저장시스템 IPFS에 저장됩니다.이 IPFS 주소 정보를 Klaytn 블록체인내에 담아 NFT를 생성합니다.

IPFS 이미지 및 메타데이터 업로드

실제로 Bluehat의 이름으로 생성된 NFT는 아래의 klaytn scope를 통해서 확인할 수 있습니다.

블록체인 지갑과 NFT 마켓

제가 담당했던 부분입니다. 백엔드에서 NFT 생성 및 거래 하는 부분과 클라이언트 부분에서 마켓의 화면 및 데이터 처리 부분을 담당하였습니다. Unity와 C#이 처음이여서 때문에 팀내의 클라이언트 개발자한테 많은 도움을 받았습니다.

종합설계 과목이 1과 2로 학기가 나누어져 있었기 때문에, 1학기에는 NFT 생성할 수 있도록 개발하고, 마켓에서 판매할 경우 판매유저의 Private Key를 받아 DB에 저장하여 구매 처리를 할 수 있도록 구성하였습니다. 2학기에는 게임내부에서 NFT 마켓에 접속할 수 있도록 Unity를 통해 마켓을 개발했습니다.

클라이언트를 개발하면서 가장 고민이 되었던 부분은 블록체인 지갑의 구현이였습니다. IOS기반이였기 때문에 웹에서 활용되는 kaikas등을 활용하기 어려웠습니다. 다른 방법으로는 카카오톡 내부에서 사용이 가능한 Klip이라는 지갑을 활용하는 것이 였습니다. 이 경우 Klip Ios SDK만 제공하고 있었기 때문에 Unity — IOS 간에 통신을 할 수 있도록 구성해야 했으며, 결정적으로 Klip과 파트너쉽 계약 이후에 이용할 수 있었기 때문에 활용하기 어려웠습니다.

결과적으로 Unity 내부에 로컬지갑을 개발하기로 결정하였습니다. 로그인 할 경우 Private Key를 기반으로 서비스 서버에서 유효성을 검사하고, 서버에는 지갑 주소만을 저장하고, 로컬 내부에만 Private Key를 저장하여, 마켓에서 판매와 구매의 경우에만 로컬에 있는 Private Key를 전송하여 처리할 수 있도록 구성하였습니다.

마켓에서 구매의 경우 판매자의 지갑에 있는 NFT를 구매자의 지갑으로 전송하는 로직이 필요한데, 이때 판매자의 지갑에 접근하기 위해서는 지갑의 Private Key가 필요하기 때문에 이를 DB에 저장하여 활용하고 있었습니다. 하지만, 보안상 위험하다고 판단하여 다른 방법을 찾아보았습니다.

Bluehat에서는 Klaytn의 KIP-17을 활용하여 NFT 서비스를 개발하였습니다. KIP17에서는 .approve(to, tokenId, [sendParam]) 메서드를 활용하여, 주어진 NFT의 소유자가 토큰을 다른 계정에 전송할 권한을 줄 수 있습니다. 이 메서드를 활용하여, 서버에 NFT를 전송 권한을 받는 Operator를 두어 판매시 판매자는 Private Key를 통해 서버의 Operator에 결제 허가를 주고 구매자가 구매요청시 서버는 허가 받은 Operator가 구매자에게 NFT를 전송하는 스마트 컨트랙트를 진행할 수 있도록 하였습니다. 이를 통해 서버에서 유저의 Private Key를 저장하지 않고 마켓로직을 구현할 수 있었습니다.

기타

추가적으로 유저이름, 음향 설정, 로그아웃 상태를 변경할 수 있는 설정 패널을 개발하였습니다. 게임의 재미요소를 위해 Mission 시스템을 구성해 맞춤형 미션을 수행하고 해당하는 보상을 받을 수 있도록 구상하였습니다.

프로젝트 회고

이번 프로젝트를 통해서 Docker, Redis 등의 다양한 기술 스택등을 도입하면서, Docker의 내부 네트워크 작동방식에 대한 이해, 기초적인 Redis 사용법에 대해 알 수 있었습니다. NFT 게임 프로젝트가 많이 없어서 참고자료를 찾는데 다소 어려운 점이 있었지만, 다양한 공식 문서를 읽고 트러블 슈팅을 하면서 실력 향상을 경험할 수 있었습니다.

개발하고자 하는 기능이 매우 많았기 때문에, 단순히 API 호출하여 값을 확인하는 방법으로만 테스트를 진행했었고, 단위테스트는 진행되지 않았던 점이 아쉬운 부분이라고 생각합니다.

프로젝트 Source Code

Server

Client

--

--

Seonghun
Seonghun

No responses yet