DiarkisExtension を使用したゲームスレッドでのコールバック

ここでは、DiarkisPluginSample に含まれる DiarkisExtension の DiarkisDispatch クラスを使用して、ゲームスレッドでコールバック関数を実行する方法を説明します。

DiarkisDispatch クラスを使用したイベント処理については、イベント処理の注意点 を参照してください。

circle-info

「DiarkisExtension」では様々な機能が実装されていますが、「UE Plugin」と異なりこれらはあくまでサンプルコードとなりますので、将来的に互換性が無い仕様変更が発生したり、不具合が存在する可能性があります。 ここではチュートリアルのため、「DiarkisExtension」に含まれる NetworkManager を使用し、ゲームスレッドでコールバック関数を実行しておりますが、コールバック処理を受け取る仕組みについては自前で実装されることをご検討ください。

DiarkisExtension のインストール

  1. DiarkisExtension のコピー

    • 解凍した DiarkisPluginSample の Source フォルダ内の DiarkisExtension フォルダをチュートリアルプロジェクトの Source フォルダにコピーします。

    .
    ├── Config
    ├── Content
    ├── Source
    │   └── DiarkisExtension ← (ここに配置)
    ├── Plugins
    └── Tutorial.uproject
  2. DiarkisExtension をプロジェクトの依存関係に追加

    • Source/Tutorial/Tutorial.Build.cs を開き、 以下のように DiarkisExtension を依存関係に追加します。

    // Tutorial.Build.cs
    
    public class Tutorial : ModuleRules
    {
        public Tutorial(ReadOnlyTargetRules Target) : base(Target)
        {
            PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
        
            PublicDependencyModuleNames.AddRange(new string[] {
                "Core",
                "CoreUObject",
                "Engine",
                "InputCore",
                "EnhancedInput",
                "Diarkis",
                "DiarkisExtension" // <-- 追加
            });
  3. プロジェクトを再ビルド

    • DiarkisExtension を追加した後、プロジェクトを再ビルドします。

DiarkisUdpDelegate の子クラスの作成

DiarkisUdpBase クラスのコールバックを受け取るために、 IDiarkisUdpDelegate の子クラスを作成します。

Tools -> New C++ Class をクリックし、親クラスに None を指定します。

DiarkisUdpTutorialDelegate という名前でクラスを作成します。

IDiarkisUdpDelegate クラスを継承します。

コールバックの実装

接続が完了したときのコールバックを実装します。

Delegate クラスを継承したこのクラスでは、ゲームスレッドでコールバック関数が実行されるため、AddOnScreenDebugMessage 関数などの UE 関連の機能を安全に使用することができます。

DiarkisNetworkManager を使用した Diarkis サーバーへの接続

DiarkisDispatch クラスを使用したイベント処理を行うためには、DiarkisNetworkManager クラスを使用して DiarkisInterface インスタンスを管理する必要があります。そこで、TutorialSubsystem クラスを書き換え、DiarkisNetworkManager クラスの ConnectAsync 関数を使います。 DiarkisInterfaceBase::DiarkisInit 関数の呼び出しは DiarkisNetworkManager 内で行われるため、TutorialSubsystem クラス内で呼び出す必要はありません。詳細については、DiarkisNetworkManager クラスの実装を参照してください。

DiarkisUdpTutorialDelegate クラスの登録

ゲームスレッドでコールバックを実行するには、DiarkisUdp クラスの SetDelegate 関数を実行し、IDiarkisUdpDelegate を継承したクラスを登録する必要があります。

DiarkisUdpTutorialDelegate クラスのインスタンスを作成し、DiarkisUdp に登録します。

Deinitialize 関数内で UdpDelegate_ をリセットします。

動作確認

コールバックを実装した後は、再度ビルドし、ゲーム起動時に 画面上に "Connected to the UDP server" というデバッグメッセージとログが表示され、ゲーム終了時に "Disconnected from the UDP server." というログが表示されることを確認します。

ここまでで、UDP サーバーに非同期的に接続し、ゲームスレッドでコールバック関数を実行することができました。

最終更新

役に立ちましたか?