게임 회사는 유저가 질리지 않고 오랫동안 게임을 플레이할 수 있도록 다양한 방법을 강구하는데, 보편적으로 사용되는 방법 중 하나는 업적 시스템입니다. 업적 시스템은 달성 목표를 설정하고 그에 맞는 보상을 제공하여 유저들의 성장 및 수집 욕구를 자극하는 시스템입니다. 메이플스토리 월드에서는 배지 시스템이라는 업적 시스템이 존재하며, 이번 포스팅은 월드에 배지를 추가하고 달성 목표를 이룬 유저에게 배지를 지급하는 것을 직접 실습해 보겠습니다.
실습 월드는 카드 짝 맞추기 리메이크이며 직접 해당 월드를 제작해 보고 싶은 분은 공식 문서를 참조해 주시길 바랍니다.
배지 등록하기
월드에 배지를 추가하기 위해서는 우선 배지의 정보를 등록해야 합니다. 배지 등록 화면은 메이플스토리 월드 공식 홈페이지의 월드 만들기
-배지 관리
의 배지 등록
과 메이커의 Panels
-Badge Viewer
의 Create New Badge
를 통해 접근하실 수 있습니다.
배지 등록 화면
제가 만든 월드인 카드 짝 맞추기 리메이크는 60초 동안 같은 카드 짝을 최대한 많이 맞추는 게임입니다. 한 스테이지는 다음과 같이 총 30개의 카드로 구성되어 있으며, 스테이지의 모든 카드 짝을 맞추면 새로운 스테이지가 진행되는 구조로 게임이 진행됩니다.
게임 화면
카드 짝 맞추기 리메이크는 짝을 맞출 때마다 점수가 10점씩 증가하며, 한 스테이지에서 얻을 수 있는 최대 점수는 150점입니다. 유저들이 헷갈릴만한 비슷한 카드들을 여럿 배치한 만큼, 실수 없이 스테이지를 완료한 유저들을 기념할 배지를 다음과 같이 등록했습니다.
배지 현황
배지 지급하기
배지 등록이 완료되었다면 배지의 달성 목표를 이룬 유저들에게 배지를 지급하는 코드를 추가해 봅시다.
1. 배지 지급 코드 추가
메이플스토리 월드에서 제공되는 API인 BadgeService
(공식 문서)는 유저가 배지를 획득할 수 있게 하거나 배지 정보를 조회하는 기능을 제공합니다. 따라서 다음과 같이 유저에게 배지를 지급하는 함수를 가진 컴포넌트인 PlayerGetBadge
를 만들어 DefaultPlayer
에 해당 컴포넌트를 추가합니다.
1
2
3
4
5
6
7
8
9
10
Method:
[server]
void GetBadge(string BadgeID)
{
local awardingUserID = self.Entity.Name
if not _BadgeService:UserHasBadgeAndWait(awardingUserID, BadgeID) then
_BadgeService:AwardBadgeAndWait(awardingUserID, BadgeID)
end
}
위 코드에서 주의하실 점은 목표 달성 여부를 체크하여
GetBadge
함수를 호출하는 것은 클라이언트이지만,BadgeService
가 실행되는 곳은 서버이기 때문에 함수의 실행 공간을 [server]로 설정하셔야 한다는 점입니다.
2. 유저의 실수 여부 파악
유저의 실수 여부를 파악하기 위해 DefaultPlayer
의 PlayerStats
컴포넌트에 boolean 자료형인 Fault
를 추가합니다.
1
2
3
Property:
[None]
boolean Fault = false
3. 목표 달성 여부 체크 및 GetBadge
함수 호출
마지막으로 목표 달성 여부를 체크하여 GetBadge
함수를 호출하는 코드를 CardPairGameLogic
에 추가합니다.
EndGame
함수
게임을 종료할 때마다, 유저의 점수와 실수 여부를 초기화하는 코드를 추가합니다.
1
2
3
local me = _UserService.LocalPlayer
me.PlayerStats.Score = 0
me.PlayerStats.Fault = false
OnCardClicked
함수
#1. 유저가 같은 짝 찾기에 실패했을 때, Fault
를 true로 바꿔주는 코드를 추가합니다.
1
2
local me = _UserService.LocalPlayer
me.PlayerStats.Fault = true
#2. 유저가 같은 짝을 찾을 때마다 현재 점수와 유저의 실수 여부를 체크하여 배지를 지급하는 코드를 추가합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
local me = _UserService.LocalPlayer
-- 실수 없이 150점 달성 시 '동색 메소' 배지 획득
if me.PlayerStats.Score >= 150 and me.PlayerStats.Fault == false then
me.PlayerGetBadge:GetBadge("YSJL1VMWU") -- '동색 메소' 배지의 ID
end
-- 실수 없이 300점 달성 시 '은색 메소' 배지 획득
if me.PlayerStats.Score >= 300 and me.PlayerStats.Fault == false then
me.PlayerGetBadge:GetBadge("BI8JEJ1KH") -- '은색 메소' 배지의 ID
end
-- 실수 없이 450점 달성 시 '금색 메소' 배지 획득
if me.PlayerStats.Score >= 450 and me.PlayerStats.Fault == false then
me.PlayerGetBadge:GetBadge("MZP88FDKO") -- '금색 메소' 배지의 ID
end
위 코드에서 주의하실 점은 코드마다 실행되는 공간이 클라이언트나 서버로 다르기 때문에 이 함수를 작동시키기 위해서는
OnCardClicked
함수의 실행 공간을 사용하지 않음으로 설정하셔야 한다는 점입니다.
(추가 실습) 코드 최적화를 위해 #2의 코드가 유저가 같은 짝을 찾을 때가 아닌 새로운 스테이지가 시작될 때 작동되도록 코드의 위치를 옮겨봅시다.
실습 결과
실습을 완료했다면 메이커에서 게임을 실행하여 다음과 같이 배지가 획득되는지 확인해 봅시다.