Matchmaking

같은 월드 안에서 다른 서버에 접속한 플레이어들을 모아서 연결 랜드로 함께 이동시키는 기능이에요.

같은 월드 안에서 서로 다른 서버에 접속한 유저들을, 특정 조건으로 대기열에 등록해서 같은 조건의 대기열에 등록된 유저들끼리 연결 랜드로 함께 이동시킬 수 있어요.

연결 랜드가 있는 월드에서, 각 랜드에 유저가 접속한 서버가 아래와 같이 있을 때, 서로 다른 서버에 있는 유저들을 같은 매칭 대기열에 등록하면, 특정 랜드로 모아서 이동시킬 수 있어요.

매칭 대기열 등록 📍

매칭 대기열에 유저를 등록할 때, 레이팅이나 점수, 직업 같은 필터 안에서 특정 범위내에 해당하는 유저들끼리만 모아서 이동시킬 수 있어요.

ex) 예를 들어 점수가 1~100인 유저들은 A랜드, 점수가 101~200인 유저들은 B랜드로 이동시킬 수 있어요.

AddMatchQueue 함수의 인자는 다음과 같이 구성되며, ❗ Player와 FilterValue를 제외한 함수의 인자가 모두 같으면, 같은 대기열로 간주해요.

--ServerScript에서 
local function RequestAddMatch(player)        
    local filterType  = "Raiting"  -- 필터타입 (ex : 레이팅, 점수, 클래스 종류 등)
    local filterValue = player.MMR -- 필터범위에서 사용할 플레이어별 값 (ex : 레이팅, 점수, 클래스 종류 등)
                                   -- 필터 값은 숫자만 가능하며 필터범위 최소값~최대값 이내여야 등록 처리돼요.
    
    local rangeMin    = 5          -- 필터범위 (최소값)
    local rangeMax    = 20         -- 필터범위 (최대값)
    
    local maxPlayer   = 2          -- 이동에 필요한 인원(이동할 랜드의 랜드인원 수보다 크지 않아야 해요.)
    local waitTime    = 20         -- 기다릴 시간       
    
    
    player.MatchLandOrder = 3      -- 매칭으로 이동할 랜드의 연결 순서를 할당해요.
    
    -- 매칭 대기열에 유저 등록 
    Game:AddMatchQueue(player, player.MatchLandOrder, filterType, filterValue, rangeMin, rangeMax, maxPlayer, waitTime)       
end

매칭 대기열 등록 결과 이벤트 📨

매칭 대기열에 유저 등록이 완료되면 호출되는 이벤트에요.

--ServerScript에서 
local function MatchCallback(player, matchID, playerCount)    
    -- 매칭 대기열에 유저 등록을 실패하면 matchID가 반환되지 않아요.
    if matchID == nil or matchID == "" then
        --매칭 관련 정보 초기화 
        player.MatchID = nil
        player.MatchLandOrder = nil

    -- 매칭 대기열에 유저 등록을 성공하면 반환된 매칭 서버 ID를 할당해요.
    else
        player.MatchID = matchID
        
        --유저가 등록된 시점에서 매칭 대기열의 현재 인원 수를 확인할 수 있어요.
        print("현재 매칭 서버에 등록된 유저의 수 : ", playerCount)
    end
end
Game.OnAddMatchQueueEvent:Connect(MatchCallback)

매칭 이동 이벤트 🚀

매칭 대기열에 등록된 유저의 수가 최대 인원(MaxPlayer)이 되거나, 대기 시간(WaitTime)을 경과하면 호출되는 이벤트에요.

--ServerScript에서 
local function MatchTeleportCallback(player)
    local playerID = player:GetPlayerID()
    
    -- 매칭 대기열 서버(MatchID)에 등록된 랜드(MatchLandOrder)로 이동 시작 
    Game:TeleportToMatchServer(playerID, player.MatchLandOrder, player.MatchID)
end
Game.OnMatchTeleportEvent:Connect(MatchTeleportCallback)

매칭 대기열에 등록된 유저 삭제 🚪

매칭 대기열에 유저를 등록할 때 반환된 MatchID 정보로 매칭 대기열에 등록된 유저를 삭제해요.

--ServerScript에서 
local function RequestRemoveMatch(player)   
    --MatchID가 없으면 
    if not player:IsValidValue("MatchID") or player.MatchID == "" then
        print(player, "에게 MatchID가 없습니다.")
        
    --MatchID가 있으면 매칭 대기열에서 유저 제거
    else
        Game:RemoveMatchQueue(player.MatchID, player)
    end
    
    --매칭 관련 정보 초기화 
    player.MatchID = nil
    player.MatchLandOrder = nil
end

Last updated