[C# Unity] 멀티플레이 게임 테스트용 다중 클라이언트 실행 방법

Arthur·2023년 8월 2일
1
post-thumbnail

정리하게된 계기


인프런에 Rookiss님의 강의(링크)를 들으면서 나왔던 내용을 정리하게 되었습니다.

멀티플레이 서버를 구축하고 클라이언트에서 빌드를 진행 후 다중 클라이언트를 구동하는 자동화 코드에 관한 내용이였습니다.

멀티플레이 게임을 구축할 때 거의 모든 프로젝트에서 세팅해야 하는 것입니다.

이런 세팅 관련된 것을 단순히 가져다가 사용하는게 아니라,
각 환경에 맞게 세팅해야 하기 때문에 코드에 대한 내용을 좀 더 찾아보고 정리하기로 했습니다.



다중 클라이언트 실행 관련 방법 및 설명


using UnityEditor;
using UnityEngine;

public class MultiplayerBuildAndRun
{
    [MenuItem("Tools/Run Multiplayer/Win64/1 Players")]
    static void PerformWin64Build1()
    {
        PerformWin64Build(1);
    }

    #region Window
    [MenuItem("Tools/Run Multiplayer/Win64/2 Players")]
    static void PerformWin64Build2()
    {
        PerformWin64Build(2);
    }

    [MenuItem("Tools/Run Multiplayer/Win64/3 Players")]
    static void PerformWin64Build3()
    {
        PerformWin64Build(3);
    }

    [MenuItem("Tools/Run Multiplayer/Win64/4 Players")]
    static void PerformWin64Build4()
    {
        PerformWin64Build(4);
    }

    static void PerformWin64Build(int playerCount)
    {
        EditorUserBuildSettings.SwitchActiveBuildTarget(
            BuildTargetGroup.Standalone, BuildTarget.StandaloneWindows);

        for (int i = 1; i <= playerCount; i++)
        {
            BuildPipeline.BuildPlayer(GetScenePaths(),
                "Builds/Win64/" + GetProjectName() + i.ToString() + "/" + GetProjectName() + i.ToString() + ".exe",
                BuildTarget.StandaloneWindows64, BuildOptions.AutoRunPlayer);
        }
    }
    #endregion

    #region Mac
    [MenuItem("Tools/Run Multiplayer/Mac/1 Players")]
    static void PerformMacBuild1()
    {
        PerformMacBuild(1);
    }

    [MenuItem("Tools/Run Multiplayer/Mac/2 Players")]
    static void PerformMacBuild2()
    {
        PerformMacBuild(2);
    }

    [MenuItem("Tools/Run Multiplayer/Mac/3 Players")]
    static void PerformMacBuild3()
    {
        PerformMacBuild(3);
    }

    [MenuItem("Tools/Run Multiplayer/Mac/4 Players")]
    static void PerformMacBuild4()
    {
        PerformMacBuild(4);
    }

    static void PerformMacBuild(int playerCount)
    {
        // 유니티 빌드세팅 API를 사용
        // 빌드 타겟 설정 => 윈도우, 맥, 안드로이드, IOS 중 어떤걸로 설정할 지
        EditorUserBuildSettings.SwitchActiveBuildTarget(
            BuildTargetGroup.Standalone,
            BuildTarget.StandaloneWindows
        );

        // 실행할 클라이언트(플레이어) 갯수 만큼 반복문 실행
        for (int i = 1; i <= playerCount; i++)
        {
            // 씬의 경로를 추가
            // 프로젝트 이름과 플레이어 번호를 사용해서 빌드 경로와 파일 설정
            BuildPipeline.BuildPlayer(GetScenePaths(),
                "Builds/Win64/" + GetProjectName() + i.ToString() + "/" + GetProjectName() + i.ToString() + ".app",
                BuildTarget.StandaloneOSX, BuildOptions.AutoRunPlayer
            );
        }
    }
    #endregion

    static string GetProjectName()
    {
        string[] s = Application.dataPath.Split('/');
        return s[s.Length - 2];
    }

    static string[] GetScenePaths()
    {
        string[] scenes = new string[EditorBuildSettings.scenes.Length];

        for (int i = 0; i < scenes.Length; i++)
        {
            scenes[i] = EditorBuildSettings.scenes[i].path;
        }

        return scenes;
    }
}

*MAC 빌드와 Win64 빌드 두 가지를 위해 구현되어 있는 코드입니다.



2 ~ 4 개의 유니티 클라이언트를 실행 할 수 있게하는 코드입니다.
해당 코드를 프로젝트에 추가하면 Tools 메뉴가 생깁니다.

  • GetScenPaths - 게임 씬 경로를 가져오는 함수 구현
  • PerformWin64Build - 실질적으로 빌드를 하는 함수
  • GetProjectName - 빌드 경로 설정 시 프로젝트 네임을 추가하기 위해 프로젝트 네임을 가져오는 함수
  • PerformWin64Build2, 3, 4 - 유니티에 메뉴에 N개의 클라이언트를 실행하기 위한 메뉴 추가하는 함수

최종적으로 위 이미지와 같이 빌드 후 다수의 플레이어를 실행하는 메뉴가 추가됩니다.



2 Players 메뉴를 선택해서 실행하면 위와 같이 실행됩니다.
(빨간색 케릭터는 몬스터입니다.)

위와 같은 자동화 방법을 코드로 작성하지 않으면 직접 빌드를 하고 실행해야 하는 번거로움이 있습니다.
멀티플레이 게임에서 동기화를 맞추기 위해 개발 시 반복적으로 발생하는 것을 단순화 시키는 방법입니다.

짧은 코드 몇줄이 생산성을 확 올려주는 유용한 코드였습니다.



참고자료


  • [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part7: MMO 컨텐츠 구현 (Unity + C# 서버 연동 기초) => 링크
profile
기술에 대한 고민과 배운 것을 회고하는 게임 서버 개발자의 블로그입니다.

1개의 댓글

comment-user-thumbnail
2024년 4월 21일

감사합니다

답글 달기