server | v5 switch to v4  

단계별 지침서

목차

지침서 소개

이 안내서의 목적은 첫 번째 Photon Server 플러그인의 생성, 구성 및 사용 방법을 보여 주는 것입니다.

이 지침서는 Photon Server 플러그인을 처음 접해보는 사용자를 대상으로 합니다. 본 지침서는 단계별로 주의 깊게 따라서 해야 합니다.

이 지침서는 매뉴얼과는 별개입니다.

메인 화면으로

첫 번째 플러그인

이 파트에서는 최소한의 플러그인을 생성하고 배포합니다.

  1. Photon 계정을 생성합니다.
  2. Photon 플러그인 SDK를 다운로드합니다.
  3. SDK를 압축 해제합니다. 이 지침서 내에서는 결과 폴더 경로를 "{pluginsSdkFolder}"로 지칭합니다.
  4. 무료 100 CCU를 여기에서 "{pluginsSdkFolder}\deploy\bin_Win64" 폴더로 다운로드합니다.
  5. 새로운 Visual Studio 프로젝트 (이 지침서에서는 Visual Studio 2019 Community 에디션을 사용했습니다)를 생성합니다:

    • "Class Library (.NET Framework)" 유형으로 새로운 프로젝트를 추가합니다.
    • 프로젝트 이름: "MyFirstPlugin"
    • 위치: "{pluginsSdkFolder}\src-server\Plugins"
    • 확인: "솔루션과 프로젝트를 동일한 디렉토리에 위치시킵니다"
    • 프레임워크: ".NET Framework 4.6.1" (또는 그 이상)

    New Project Creation Window in Visual Studio 2019
    Visual Studio 2019에서 생성한 새로운 프로젝트 윈도우

  6. 의존성 추가: 한 개의 라이브러리만 필요합니다: "PhotonHivePlugin.dll". Visual Studio에서 추가하기 위해:

    • 프로젝트에서 우측 클릭하여 "참조" 선택
    • "참조 추가.." 클릭
    • "탐색" 선택
    • "탐색"을 클릭하고 "{pluginsSdkFolder}\src-server\Plugins\lib\net461\PhotonHivePlugin.dll"를 선택
    • "OK"로 확인
  7. 플러그인 클래스 추가:

    • VS에 의해서 자동으로 생성된 "Class.cs" 파일을 "MyFirstPlugin.cs"로 이름 변경.
    • VS가 클래스 명도 이름을 변경할 것을 제안하면, 수용합니다. 그렇지 않으면 클래스 이름을 Class 에서 MyFirstPlugin로 직접 변경해야 합니다.
    • PluginBase를 기본 클래스로 변경합니다.
        using Photon.Hive.Plugin;
    
    
        namespace MyFirstPlugin
        {
            public class MyFirstPlugin : PluginBase
            {
            }
        }
  8. 플러그인 이름 설정:

        public override string Name => "MyFirstPlugin";
    • 예약된 플러그인 이름은 "Default" 및 "ErrorPlugin" 입니다.
  9. 로거를 생성하기 위해 SetupInstance를 오버라이드 합니다:

        private IPluginLogger pluginLogger;
    
    
    public override bool SetupInstance(IPluginHost host, Dictionary<string, string> config, out string errorMsg)
    {
        this.pluginLogger = host.CreateLogger(this.Name);
        return base.SetupInstance(host, config, out errorMsg);
    }
  10. 콜백에서 로그 메시지를 추가합니다:

        public override void OnCreateGame(ICreateGameCallInfo info)
    {
        this.pluginLogger.InfoFormat("OnCreateGame {0} by user {1}", info.Request.GameId, info.UserId);
    }
  11. 하나의 콜백 처리 메소드를 호출합니다:

        public override void OnCreateGame(ICreateGameCallInfo info)
    {
        this.pluginLogger.InfoFormat("OnCreateGame {0} by user {1}", info.Request.GameId, info.UserId);
        info.Continue(); // same as base.OnCreateGame(info);
    }
  12. 플러그인 팩토리 클래스를 추가합니다:

    • 새로운 클래스를 추가하고 MyPluginFactory로 이름을 부여합니다.
    • public 으로 만들어 줍니다.
        using Photon.Hive.Plugin;
    
    
    namespace MyFirstPlugin
    {
        public class MyPluginFactory
        {
        }
    }
  13. 기본 클래스를 PluginFactoryBase로 변경합니다:

        using Photon.Hive.Plugin;
    
    
    namespace MyFirstPlugin
    {
        public class MyPluginFactory : PluginFactoryBase
        {
            public override IGamePlugin Create(string pluginName)
            {
                throw new NotImplementedException();
            }
        }
    }
  14. 플러그인을 생성하고 리턴합니다:

        public override IGamePlugin Create(string pluginName)
    {
        return new MyFirstPlugin();
    }
  15. 솔루션을 빌드 합니다 (F6).

  16. 플러그인 환경 구성을 변경합니다:

    • "{pluginsSdkFolder}\deploy\LoadBalancing\GameServer\bin\plugin.config"를 오픈합니다.
    • 다음과 같이 "PluginSettings" 노드를 변경합니다:
        <Configuration>
      <PluginSettings Enabled="true">
        <Plugins>
          <Plugin
            Name="MyFirstPlugin"
            AssemblyName="MyFirstPlugin.dll"
            Type="MyFirstPlugin.MyPluginFactory" />
        </Plugins>
      </PluginSettings>
    </Configuration>

    자체 호스팅 된 Photon Server의 플러그인 환경 구성에 대해서 더 읽어보세요.

  17. 바이너리 파일들을 예상되는 경로에 복사합니다:

    "{pluginsSdkFolder}\src-server\Plugins\MyFirstPlugin\bin\Debug\"의 모든 파일들을 "{pluginsSdkFolder}\deploy\Plugins\MyFirstPlugin\bin\"에 복사합니다.

  18. PhotonControl을 오픈합니다. "{pluginsSdkFolder}\bin_Win64\PhotonControl.exe"에 있습니다.

  19. 애플리케이션으로 Photon Server를 시작합니다:

    Start LoadBalancing from PhotonControl
    PhotonControl에서 LoadBalancing 시작

  20. 로그를 확인합니다:

    PhotonControl에서 직접 로그를 오픈할 수 있습니다:

    Open Logs from PhotonControl
    PhotonControl에서 로그 오픈

    "{pluginsSdkFolder}\deploy\log\GSGame.log"에서 해석된 플러그인 환경 구성과 성공적으로 처리된 것을 볼 수 있어야 합니다:

        2021-05-24 16:00:06,904 [1] INFO  Photon.Hive.Plugin.PluginManager - Plugin configured: name=MyFirstPlugin
    2021-05-24 16:00:06,909 [1] DEBUG Photon.Hive.Plugin.PluginManager - Plugin path is set to 'D:\ExitGames\SDKs\Plugins\photon-server-plugin-sdk_v5-0-12-24499-rc1\deploy\Plugins/MyFirstPlugin//bin/MyFirstPlugin.dll'
    2021-05-24 16:00:06,931 [1] INFO  Photon.Hive.Plugin.PluginManager - Loaded Assembly Name=MyFirstPlugin, Version=1.0.0.0, Culture=, PublicKey token=, Path=D:\ExitGames\SDKs\Plugins\photon-server-plugin-sdk_v5-0-12-24499-rc1\deploy\Plugins/MyFirstPlugin//bin/MyFirstPlugin.dll
    2021-05-24 16:00:06,931 [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=
    2021-05-24 16:00:06,932 [1] INFO  Photon.Hive.Plugin.PluginManager - Referenced Assembly Name=PhotonHivePlugin, Version=1.1.0.24499, Culture=, PublicKey token=, Path=
    2021-05-24 16:00:06,932 [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
    2021-05-24 16:00:06,933 [1] INFO  Photon.Hive.Plugin.PluginManager - Plugin manager (version=1.1.0.24499) is setup. type=MyFirstPlugin.MyPluginFactory;path=D:\ExitGames\SDKs\Plugins\photon-server-plugin-sdk_v5-0-12-24499-rc1\deploy\Plugins/MyFirstPlugin//bin/MyFirstPlugin.dll;version=1.1.0.24499
  21. Photon Server로 접속합니다. 아무 클라이언트 SDK를 사용합니다.

  22. 룸을 생성합니다. CreateRoom 오퍼레이션을 구현하는 SDK에 적합한 메소드를 호출합니다.
  23. 로그를 다시 확인합니다: "{pluginsSdkFolder}\deploy\log\GSGame.log"에서 플러그인 콜백으로부터의 사용자 지정 로그 메시지 이후 플러그인 생성을 볼 수 있어야 합니다:

        2021-05-24 16:03:19,734 [20] INFO  Photon.Hive.Plugin.PluginManager - Plugin successfully created:Type:MyFirstPlugin.MyPluginFactory, path:D:\ExitGames\SDKs\Plugins\photon-server-plugin-sdk_v5-0-12-24499-rc1\deploy\Plugins/MyFirstPlugin//bin/MyFirstPlugin.dll
    2021-05-24 16:03:19,760 [20] INFO  Plugin.MyFirstPlugin - OnCreateGame 81f04234-892d-4b14-ae17-3708e9f7fe5c by user 848140c0-a7fb-4d61-ba5f-5846184a9b78
    2021-05-24 16:03:19,761 [20] DEBUG Photon.Hive.Plugin.CreateGameCallInfo - Continue.

메인 화면으로

디버그 모드

두 번째 파트에서는 플러그인 개발을 위한 권장 작업 흐름을 보여줍니다.

  1. Visual Studio 프로젝트를 닫고 다시 오픈하지만 이때는 "{pluginsSdkFolder}\src-server\Plugins\MyFirstPlugin\MyFirstPlugin.sln" 솔루션 파일을 더블 클릭하여 오픈합니다. 이 단계는 매우 중요한데, 단계 3에 있는 솔루션 폴더 경로의 상대 경로를 사용하기 위해서입니다.
  2. 플러그인 프로젝트의 "Post-Build Events"를 업데이트합니다:

    이 아이디어는 프로젝트 빌드 출력 디렉토리에서 Photon 구성에 의해 예상 경로로 적용 및 붙여넣기를 통해 플러그인 바이너리를 자동으로 업데이트하는 것입니다.

    스크린샷에 표시된 "Post-Build Events" 텍스트 영역에서 빌드에 성공한 직후에 이 작업을 수행하는 이 명령을 입력합니다. 편의성과 휴대성을 위해 상대 경로를 사용합니다.

        xcopy /Y /Q "$(TargetDir)*.*" "$(SolutionDir)..\..\..\deploy\Plugins\MyFirstPlugin\bin\"

    Post Build Events
    포스트 빌드 이벤트

    저장하는 것을 잊지 마세요.

  3. 플러그인 프로젝트의 "Debug" 액션을 업데이트합니다:

    여기서는 디버깅 플러그인이 시작될 때 자동으로 Photon Server를 시작하고 플러그인이 중지될 때 자동으로 중지하는 것을 목표로 합니다.

    스크린샷에 표시된 대로 "시작 액션" 및 "시작 옵션"을 구성합니다. 편의성과 휴대성을 위해 상대 경로를 사용합니다.

    • "외부 프로그램 시작":

              ..\..\..\deploy\bin_Win64\PhotonSocketServer.exe
    • "명령어 라인 아규먼트":

              /run LoadBalancing /configPath ..\..\..\..\..\deploy\bin_Win64

    Debug Start Action
    디버그 시작 액션

    저장하는 것을 잊지 마세요.

  4. 중단점을 추가합니다:

    Breakpoint in MyFirstPlugin.OnCreateGame
    MyFirstPlugin.OnCreateGame의 중단점

  5. PhotonControl에서 Photon Server 중지:

    Stop LoadBalancing from PhotonControl
    PhotonControl에서 LoadBalancing 중지

  6. Visual Studio (F5)에서 Photon Server 시작하기:

    Photon Server debug started from Visual Studio
    Visual Studio에서 Photon Server 시작된 디버그

    작업 관리자를 사용하여 서버가 시작되었는지 확인할 수 있습니다. 이 프로세스의 이름은 Photon입니다.

  7. Photon Server로 접속합니다. 어떤 클라이언트 SDK를 사용해도 무방합니다.

  8. 룸을 생성합니다. CreateRoom 작업을 구현하는 SDK에 적합한 메소드를 호출합니다.
  9. 중단점이 트리거 될 때까지 기다립니다:

    Breakpoint Triggered
    트리거된 중단점


기술문서 TOP으로 돌아가기