멀티플레이 환경

Eunho Bae·2022년 5월 25일

코드 수정

지난 시간에 sendBuffer를 만들어서 클라 측으로 보냈던 코드를 Send() 함수를 새로 정의해서 그 안에 옮겨놓았다.

Server::ClientSession

		public void Send(IMessage packet)
        {
			string msgName = packet.Descriptor.Name.Replace("_", string.Empty);
			MsgId msgId = (MsgId)Enum.Parse(typeof(MsgId), msgName); // MsgId에 해당하는 enum 중에서 msgName과 이름이 같은 놈을 리턴

			ushort size = (ushort)packet.CalculateSize();
			byte[] sendBuffer = new byte[size + 4];
			Array.Copy(BitConverter.GetBytes((ushort)(size + 4)), 0, sendBuffer, 0, sizeof(ushort));
			Array.Copy(BitConverter.GetBytes((ushort)msgId), 0, sendBuffer, 2, sizeof(ushort));
			Array.Copy(packet.ToByteArray(), 0, sendBuffer, 4, size);

			Send(new ArraySegment<byte>(sendBuffer));
		}

        public override void OnConnected(EndPoint endPoint)
		{
			Console.WriteLine($"OnConnected : {endPoint}");

			// PROTO Test
			S_Chat chat = new S_Chat()
			{
				Context = "안녕하세요"
			};

			Send(chat);
		}

ServerCore의 보안

유니티 프로젝트의 Assets->Libs 폴더에 ServerCore.dll을 넣어두었는데 이는 ServerCore의 실제 cs 코드들이 들어있기 때문에 보안에 취약해진다. 그래서 dll 파일은 삭제하고 진짜 필요한 코드만 복사해서 유니티 프로젝트에 붙여놓도록 한다.

빌드 자동화

매번 코드를 수정하고 빌드 후 빌드된 폴더로 가서 실행파일을 눌러 실행하는 것은 번거롭다.
이번 시간에는 빌드 자동화를 수행하고 원하는 개수 만큼의 실행파일을 실행시켜주는 코드를 작성해보자

코드

코드를 딱히 암기할 필요는 없다.

public class MultiplayersBuildAndRun
{
    [MenuItem("Tools/Run Multiplayer/2 Players")]
    static void PerformWin64Build2()
    {
        PerformWin64Build(2);
    }

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

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

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

        // 프로젝트 이름과 i를 이용해 각기 다른 이름으로 exe파일을 만들어줌
        for(int i=1; i<=playerCount; i++)
        { 
            // 만들자마자 자동 실행
            BuildPipeline.BuildPlayer(GetScenePaths(), "Builds/Win64/" + GetProjectName() + i.ToString() + "/" + GetProjectName() + i.ToString() + ".exe", BuildTarget.StandaloneWindows64, BuildOptions.AutoRunPlayer);
        }
    }

    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; // "Assets/Scenes/Game.unity"
    }
}

빌드 결과


profile
개인 공부 정리

0개의 댓글