단계별 지침서
지침서 소개
이 지침서는 첫 번째 Photon Server 플러그인을 생성, 구성 및 사용하는 방법을 보여주기 위함입니다.
이 지침서는 Photon Server 플러그인을 처음으로 접하시는 사용자를 대상으로 합니다.
이 지침서는 단계별로 순서대로 신중하게 따라하셔야 합니다.
이 지침서는 매뉴얼은 아닙니다.
첫 번째 플러그인
첫 번째 파트에서는 최소한의 플러그인을 생성하고 디플로이할 것 입니다.
SDK를 압축해제합니다. 이 지침서에서 압축을 푼 폴더를 "{pluginsSdkFolder}"로 지칭하도록 하겠습니다.
새로운 Visual Studio 프로젝트(이 지침서에서 사용된 것은 Visual Studio 2019 Community 에디션입니다)를 생성합니다:
- "Class Library (.NET Framework)" 형태의 새로운 프로젝트를 추가합니다.
- 프로젝트 명: "MyFirstPlugin"
- 위치: "{pluginsSdkFolder}\src-server\Plugins"
- 체크: "동일한 디렉토리에 솔루션과 프로젝트를 위치하도록 합니다"
- 프레임워크: ".NET Framework 4"
디펜던시 추가:
하나의 라이브러리만 필요합니다: "PhotonHivePlugin.dll".
Visual Studio에서 추가합니다:- 프로젝트의 "References"를 우측 클릭합니다
- "Add Reference.." 클릭
- "Browse" 선택
- "Browse" and choose "{pluginsSdkFolder}\src-server\Plugins\lib\PhotonHivePlugin.dll" 클릭
- "OK"로 확인
플러그인 클래스 추가:
- VS 에서 자동 생성된 파일 이름을 "Class.cs" 에서 "MyFirstPlugin.cs" 로 변경합니다.
- VS 에서도 클래스 이름을 변경하라고 제한할 것 입니다. 그렇지 않으면
Class
에서MyFirstPlugin
로 변경하세요. PluginBase
확장.
C#
using Photon.Hive.Plugin; namespace MyFirstPlugin { public class MyFirstPlugin : PluginBase { } }
플러그인 이름 설정:
C#
public override string Name { get { return "MyFirstPlugin"; } }
- 예약된 플러그인 이름은 "Default" 및 "ErrorPlugin" 입니다.
콜백에 로그 메시지를 추가합니다:
C#
public override void OnCreateGame(ICreateGameCallInfo info) { this.PluginHost.LogInfo(string.Format("OnCreateGame {0} by user {1}", info.Request.GameId, info.UserId)); }
콜백 처리 메소드를 호출합니다:
C#
public override void OnCreateGame(ICreateGameCallInfo info) { this.PluginHost.LogInfo(string.Format("OnCreateGame {0} by user {1}", info.Request.GameId, info.UserId)); info.Continue(); // same as base.OnCreateGame(info); }
플러그인 팩토리 클래스를 추가합니다:
- 새로운 클래스를 추가하고
MyPluginFactory
로 이름을 부여합니다 - public 으로 만들어 줍니다.
C#
using System.Collections.Generic; using Photon.Hive.Plugin; namespace MyFirstPlugin { public class MyPluginFactory { } }
- 새로운 클래스를 추가하고
IPluginFactory
인터페이스를 구현합니다:C#
using System.Collections.Generic; using Photon.Hive.Plugin; namespace MyFirstPlugin { public class MyPluginFactory : IPluginFactory { public IGamePlugin Create(IPluginHost gameHost, string pluginName, Dictionary<string, string> config, out string errorMsg) { throw new NotImplementedException(); } } }
생성하여 plugin을 리턴합니다:
C#
public IGamePlugin Create(IPluginHost gameHost, string pluginName, Dictionary<string, string> config, out string errorMsg) { MyFirstPlugin plugin = new MyFirstPlugin(); if (plugin.SetupInstance(gameHost, config, out errorMsg)) { return plugin; } return null; }
솔루션 빌드(F6).
플러그인 환경설정 업데이트:
- "{pluginsSdkFolder}\deploy\LoadBalancing\GameServer\bin\Photon.LoadBalancing.dll.config" 열기
- 다음과 같이 "PluginSettings" 노드를 업데이트합니다:
XML
<PluginSettings Enabled="true"> <Plugins> <Plugin Name="MyFirstPlugin" AssemblyName="MyFirstPlugin.dll" Type="MyFirstPlugin.MyPluginFactory" /> </Plugins> </PluginSettings>
예정된 경로에 바이너리들을 복사합니다:
모든 것을 "{pluginsSdkFolder}\src-server\Plugins\MyFirstPlugin\bin\Debug" 에서 "{pluginsSdkFolder}\deploy\Plugins\MyFirstPlugin\bin" 로 복사합니다.
[PhotonControl] 오픈합니다. "{pluginsSdkFolder}\bin_Win64\PhotonControl.exe" 에 있습니다.
Photon Server를 어플리케이션으로 시작합니다:
로그를 확인합니다:
PhotonControl에서 로그를 직접 오픈할 수 있습니다:
"{pluginsSdkFolder}\deploy\log\GSGame.log" 에서 plugin configuration parsed and processed successfully라는 메시지가 있어야 합니다:
Plain Old Text
2019-07-04 15:18:40,272 [1] INFO Photon.Hive.Plugin.PluginManager - Plugin configured: name=MyFirstPlugin 2019-07-04 15:18:40,326 [1] INFO Photon.Hive.Plugin.PluginManager - Loaded Assembly Name=MyFirstPlugin, Version=1.0.0.0, Culture=, PublicKey token=, Path=D:\ExitGames\SDKs\Plugins\Photon-OnPremise-Server-Plugin-SDK_v4-0-29-11263\deploy\Plugins\MyFirstPlugin\\bin\MyFirstPlugin.dll 2019-07-04 15:18:40,327 [1] INFO Photon.Hive.Plugin.PluginManager - Referenced Assembly Name=mscorlib, Version=4.0.0.0, Culture=, PublicKey token=B7-7A-5C-56-19-34-E0-89, Path= 2019-07-04 15:18:40,329 [1] INFO Photon.Hive.Plugin.PluginManager - Referenced Assembly Name=PhotonHivePlugin, Version=1.0.15.11060, Culture=, PublicKey token=, Path= 2019-07-04 15:18:40,330 [1] INFO Photon.Hive.Plugin.PluginManager - Plugin Type MyFirstPlugin.MyPluginFactory from assembly MyFirstPlugin, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null was successfuly created 2019-07-04 15:18:40,331 [1] INFO Photon.Hive.Plugin.PluginManager - Plugin manager (version=1.0.15.11060) is setup. type=MyFirstPlugin.MyPluginFactory;path=D:\ExitGames\SDKs\Plugins\Photon-OnPremise-Server-Plugin-SDK_v4-0-29-11263\deploy\Plugins\MyFirstPlugin\\bin\MyFirstPlugin.dll;version=1.0.15.11060
Photon Server에 연결합니다. Use any client SDK를 사용합니다.
룸을 생성합니다. CreateRoom을 구현하는 SDK에 적합한 방법을 호출합니다.
로그를 재확인합니다:
"{pluginsSdkFolder}\deploy\log\GSGame.log"에서 플러그인 콜백에서 나온 커스텀 로그 메시지 이후 플러그인 생성 메시지가 나와야 합니다:Plain Old Text
2019-07-04 15:25:40,540 [11] INFO Photon.Hive.Plugin.PluginManager - Plugin successfully created:Type:MyFirstPlugin.MyPluginFactory, path:D:\ExitGames\SDKs\Plugins\Photon-OnPremise-Server-Plugin-SDK_v4-0-29-11263\deploy\Plugins\MyFirstPlugin\\bin\MyFirstPlugin.dll 2019-07-04 15:25:42,435 [11] INFO Photon.Hive.HiveGame.HiveHostGame.Plugin - OnCreateGame 870c3120-bcdd-4091-b072-8e92ea07bec5 by user 495fca21-b67e-4103-b1ce-c6ce945e6207
디버그 모드
두 번째 파트에서는 플러그인 개발에 권장되는 워크플로우를 보여드리겠습니다.
- 플러그인 프로젝트의 "Post-Build Events"를 갱신합니다:
여기서의 아이디어는 Photon 구성을 통해 프로젝트 빌드 출력 디렉토리를 처리하고 예상 경로로 붙여넣음으로써 플러그인 바이너리 파일을 자동으로 업데이트하는 것입니다.
스크린샷에 표시된 대로 "Post-Build Events" 텍스트 영역에서 빌드가 성공한 직후에 이 명령을 입력합니다.
편의성과 휴대성을 위해 상대적인 경로를 이용합니다.
플러그인 프로젝트의 "Debug" 액션을 업데이트합니다:
플러그인의 디버깅이 시작될 때 Photon Server를 자동으로 시작하고 플러그인이 중지될 때 Photon Server를 자동으로 시작하는 것이 좋습니다.
스크린샷에 표시된 대로 "시작 액션" 및 "시작 옵션"을 구성합니다.
편의성과 휴대성을 위해 상대적인 경로를 이용합니다."외부 프로그램 시작":
Plain Old Text
..\..\..\deploy\bin_Win64\PhotonSocketServer.exe
"커맨드 라인 아규먼트":
Plain Old Text
/run LoadBalancing /configPath ..\..\..\..\..\deploy\bin_Win64
저장하는 것을 잊지 마세요.
브레이크포인트 추가:
[PhotonControl]에서 Photon Server 중지:
Visual Studio (F5)로 Photon Server 시작:
작업 관리자를 사용하여 서버가 시작되었는지 확인할 수 있습니다. 이 프로세스의 이름은 Photon입니다.
Photon Server에 연결합니다. 클라이언트 SDK 아무거나 사용하세요.
룸을 생성합니다. CreateRoom 오퍼레이션을 구현한 SDK의 적당한 메소드를 호출합니다.
브레이크포인트가 트리거될때까지 기다리세요: