Home 메이플스토리 월드 | 배지 추가하기
Post
Cancel

메이플스토리 월드 | 배지 추가하기

게임 회사는 유저가 질리지 않고 오랫동안 게임을 플레이할 수 있도록 다양한 방법을 강구하는데, 보편적으로 사용되는 방법 중 하나는 업적 시스템입니다. 업적 시스템은 달성 목표를 설정하고 그에 맞는 보상을 제공하여 유저들의 성장 및 수집 욕구를 자극하는 시스템입니다. 메이플스토리 월드에서는 배지 시스템이라는 업적 시스템이 존재하며, 이번 포스팅은 월드에 배지를 추가하고 달성 목표를 이룬 유저에게 배지를 지급하는 것을 직접 실습해 보겠습니다.

실습 월드는 카드 짝 맞추기 리메이크이며 직접 해당 월드를 제작해 보고 싶은 분은 공식 문서를 참조해 주시길 바랍니다.

배지 등록하기

월드에 배지를 추가하기 위해서는 우선 배지의 정보를 등록해야 합니다. 배지 등록 화면은 메이플스토리 월드 공식 홈페이지의 월드 만들기-배지 관리배지 등록과 메이커의 Panels-Badge ViewerCreate New Badge를 통해 접근하실 수 있습니다.

배지 등록 화면배지 등록 화면

제가 만든 월드인 카드 짝 맞추기 리메이크는 60초 동안 같은 카드 짝을 최대한 많이 맞추는 게임입니다. 한 스테이지는 다음과 같이 총 30개의 카드로 구성되어 있으며, 스테이지의 모든 카드 짝을 맞추면 새로운 스테이지가 진행되는 구조로 게임이 진행됩니다.

카드 짝 맞추기 리메이크 게임 화면게임 화면

카드 짝 맞추기 리메이크는 짝을 맞출 때마다 점수가 10점씩 증가하며, 한 스테이지에서 얻을 수 있는 최대 점수는 150점입니다. 유저들이 헷갈릴만한 비슷한 카드들을 여럿 배치한 만큼, 실수 없이 스테이지를 완료한 유저들을 기념할 배지를 다음과 같이 등록했습니다.

카드 짝 맞추기 리메이크 배지배지 현황

배지 지급하기

배지 등록이 완료되었다면 배지의 달성 목표를 이룬 유저들에게 배지를 지급하는 코드를 추가해 봅시다.

1. 배지 지급 코드 추가

메이플스토리 월드에서 제공되는 APIBadgeService(공식 문서)는 유저가 배지를 획득할 수 있게 하거나 배지 정보를 조회하는 기능을 제공합니다. 따라서 다음과 같이 유저에게 배지를 지급하는 함수를 가진 컴포넌트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. 유저의 실수 여부 파악

유저의 실수 여부를 파악하기 위해 DefaultPlayerPlayerStats 컴포넌트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. 유저가 같은 짝 찾기에 실패했을 때, Faulttrue로 바꿔주는 코드를 추가합니다.

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의 코드가 유저가 같은 짝을 찾을 때가 아닌 새로운 스테이지가 시작될 때 작동되도록 코드의 위치를 옮겨봅시다.

실습 결과

실습을 완료했다면 메이커에서 게임을 실행하여 다음과 같이 배지가 획득되는지 확인해 봅시다.

카드 짝 맞추기 리메이크 배지 획득

This post is licensed under CC BY 4.0 by the author.

웹 기반(HTML, CSS, JavaScript) RPG 만들기 - Life of YOUNGGYU

메이플스토리 월드 | 랭킹 시스템 구현하기