지난 시간에 sendBuffer를 만들어서 클라 측으로 보냈던 코드를 Send() 함수를 새로 정의해서 그 안에 옮겨놓았다.
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);
}
유니티 프로젝트의 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"
}
}

