언리얼 엔진 - 게임 프로젝트/AWS GameLift를 활용한 데디케이트 FPS 프로젝트

Game Sessions - 4) GameSession 생성

monstro 2026. 5. 22. 14:27
728x90
반응형

- 개요

FindOrCreateGameSession 람다에서 반환된 GameSession들의 상세정보를 활용하여

동작중인 GameSession이 없다면 새로운 GameSession생성하는 기능을 추가한다

해당 기능은 CreateGameSessionCommand API를 사용하여 수행한다

 

- 절차

FindOrCreateGameSession 람다에 대한 정책 수정

 

FindOrCreateGameSession 람다에 적용한 정책을 위와 같이 수정한다 

GameLift Servers 서비스의 CreteGameSession API를 사용할 수 있도록 추가한다

 

import {GameLiftClient, ListFleetsCommand, DescribeFleetAttributesCommand, DescribeGameSessionsCommand, CreateGameSessionCommand} from "@aws-sdk/client-gamelift";

export const handler = async (event) => {
  const gameLiftClient = new GameLiftClient({region : process.env.REGION});

  try {
    const listFleetsInput = {
      Limit: 10
    };
    const listFleetsCommand = new ListFleetsCommand(listFleetsInput);
    const listFleetsResponse = await gameLiftClient.send(listFleetsCommand);
    const fleetIds = listFleetsResponse.FleetIds;

    const describeFleetAttributesInput = {
      FleetIds : fleetIds,
      Limit: 10
    };

    const describeFleetAttributesCommand = new DescribeFleetAttributesCommand(describeFleetAttributesInput);
    const describeFleetAttributesResponse = await gameLiftClient.send(describeFleetAttributesCommand);

    const fleetAttributes = describeFleetAttributesResponse.FleetAttributes;

    let fleetId;
    for (const fleetAttribute of fleetAttributes){
      if(fleetAttribute.Status === "ACTIVE"){
        fleetId = fleetAttribute.FleetId;
        break;
      }
    }

    const describeGameSessionsInput = {
      FleetId : fleetId,
      Limit : 10,
      Location : "custom-Home-LocalPC",  // 테스트용 Anywhere 로케이션(추후 EC2 Managed 로케이션으로 수정)
      StatusFilter : "ACTIVE"
    };

    const describeGameSessionsCommand = new DescribeGameSessionsCommand(describeGameSessionsInput);
    const describeGameSessionsResponse = await gameLiftClient.send(describeGameSessionsCommand);
    const gameSessions = describeGameSessionsResponse.GameSessions;

    let gameSession;
    for (const session of gameSessions) {
      if (session.CurrentPlayerSessionCount < session.MaximumPlayerSessionCount && session.PlayerSessionCreationPolicy === "ACCEPT_ALL") {
        gameSession = session;
        break;
      }
    }

    if (gameSession) {
      // 동작중인 GameSession이 탐색됨
    } else {
      // GameSession이 존재하지 않음 -> 새로 생성
      const createGameSessionInput = {
        GameProperties: [
          {
            Key: "difficulty", // 게임 난이도 - 초보자로 설정
            Value: "novice", 
          },
        ],
        FleetId: fleetId,
        MaximumPlayerSessionCount: 20,
        Location: "custom-Home-LocalPC" // 테스트용 Anywhere 로케이션(추후 EC2 Managed 로케이션으로 수정)
      };
      const createGameSessionCommand = new CreateGameSessionCommand(createGameSessionInput);
      const createGameSessionResponse = await gameLiftClient.send(createGameSessionCommand);
      gameSession = createGameSessionResponse.GameSession;
    }

    return gameSession;

  } catch(error){
    return error;
  }

  
};

 

이후 람다의 코드를 위와 같이 수정한다

수정 사항은 다음과 같다

  • DescribeGameSessionsCommand API 실행 결과에서 GameSession 정보가 담긴 배열gameSessions 변수에 저장
  • gameSessions 변수를 순회하면서 플레이어가 바로 들어갈 수 있으면 gameSession 변수에 저장
  • 다음의 조건에 따라 다르게 동작
    • GameSession이 탐색됨 : 로직을 아직 작성하지 않음
    • GameSession이 탐색되지 않음 : CreateGameSessionCommand API를 사용하여 최대 20명이 들어갈 수 있는 새로운 GameSession을 생성
  • 이후 gameSession 변수 반환

 

- 실행

# 1) 토큰 발급
aws gamelift get-compute-auth-token ^
--fleet-id "플릿 ID" ^
--compute-name "컴퓨팅 자원 이름" ^
--region "사용중인 리전" ^
--profile "프로필 이름" // 해당 옵션은 필요한 경우 사용

# 2) 발급된 토큰을 사용하여 서버 exe 파일 실행
"경로\Build\Build_1\운영체제Server\프로젝트Server.exe" -log -glAnywhere ^
-glAnywhereAuthToken="발급된토큰" ^
-glAnywhereHostId="컴퓨팅 자원 이름" ^
-glAnywhereFleetId="플릿 ID" ^
-glAnywhereWebSocketUrl="리전에 따른 소켓 URL" ^
-port=7777 // 기본 포트번호

 

위와 같이 AWS CLI에 입력하여 서버의 exe 파일을 실행한다

 

 

exe 파일 실행 후에 Lambda 함수를 실행하면 위와 같이 Game Session이 활성 상태인 것을 확인할 수 있다

728x90
반응형