# Diarkis Plugin Sample

## DiarkisPluginSample の確認手順

## 目次

* [Diarkis Unreal Engine プラグインについて](#diarkis-unreal-engine-puraguinnitsuite)
* [サンプル概要](#sanpuru)
* [確認手順](#que-ren-shou-shun)
  * [Windowsの確認手順](#windowsno)
  * [選択ビューポート](#bypto)
* [各画面の説明](#no)
  * [ログイン画面](#roguin)
  * [MainMenu 画面](#mainmenu-hua-mian)
  * [Room 画面](#room-hua-mian)
  * [Room InGame 画面](#room-ingame-hua-mian)
  * [LOD Room InGame 画面](#lod-room-ingame-hua-mian)
  * [Field 画面](#field-hua-mian)
  * [MatchMaker Host/Search 画面](#matchmaker-hostsearch-hua-mian)
  * [MatchMaker Host/Search InGame 画面](#matchmaker-hostsearch-ingame-hua-mian)
  * [MatchMaker Ticket 画面](#matchmaker-ticket-hua-mian)
  * [DirectMessage 画面](#directmessage-hua-mian)
  * [Session 画面](#session-hua-mian)
  * [Group 画面](#group-hua-mian)
  * [Zombie 画面](#zombie-hua-mian)
  * [Zombie InGame 画面](#zombie-ingame-hua-mian)
  * [DGS](#dgs)
  * [動作確認（マルチプレーオプション）](#maruchipuropushon)
* [コードについて](#kdonitsuite)
  * [C++ サンプルコード](#c-sanpurukdo)
  * [DiarkisPluginSample 側の主なコード（Diarkis Pluginを利用したサンプル）](#diarkispluginsample-nonakdodiarkis-pluginwoshitasanpuru)
  * [Diarkis Plugin + Sample の主なコード](#diarkis-plugin-sample-nonakdo)
  * [libDiarkis のコードについて](#libdiarkis-nokdonitsuite)
  * [diarkis-module Client のコードについて](#diarkis-module-client-nokdonitsuite)
  * [diarkis-module Extension のコードについて](#diarkis-module-extension-nokdonitsuite)
  * [DiarkisNetwork のコードについて](#diarkisnetwork-nokdonitsuite)
  * [Blueprint用 コールバックイベント キューイング のコードについて](#blueprint-krubakkuibento-kyingu-nokdonitsuite)
  * [イベントの Delegate のコードについて](#ibentono-delegate-nokdonitsuite)
* [クラス図](#kurasu)
* [同期機能について](#nitsuite)
  * [Diarkis Plugin で同期できる機能について](#diarkis-plugin-dedekirunitsuite)
  * [サンプル上で同期を利用している機能](#sanpurudewoshiteiru)
* [動作確認環境](#dong-zuo-que-ren-huan-jing)
  * [UE のバージョン毎の確認環境](#ue-no-bjonno)
* [動作確認手順](#dong-zuo-que-ren-shou-shun)
  * [Windows のパッケージ作成手順](#windows-nopakkji)
  * [Android 端末で動作確認手順（別途AndroidStudio環境のセットアップが必要](#android-deandroidstudionosettoappuga)

## Diarkis Unreal Engine プラグインについて

プラグインの詳細については Diarkis ヘルプセンターの [Diarkis Unreal Engine](https://help.diarkis.io/diarkis-client/game-engine-integration/ue) のページを参照してください。

## サンプル概要

* UnrealEngine 用プラグイン `Diarkis UnrealEngine Plugin` を使用したサンプルプロジェクト (`DiarkisPluginSample`) です。
* `Diarkis`の `Room, P2P, RPC, Field, MatchMaker, DirectMessage, Session, Group` 機能を確認することができます。
* 複数の `DiarkisPluginSample` を起動することで、他のクライアント端末で動作しているキャラクターの位置同期を確認できるサンプルです。
* キャラクターの位置同期は `UDP/TCP` プロトコルまたは `P2P` プロトコルを用いて確認することができます。
* 対応プラットフォームは、Windows10/11, Mac, iOS, Android, Nintendo Switch 2, PS5, Xbox Series X|S です。

## 確認手順

### Windowsの確認手順

1. DiarkisPluginSample.uproject の右クリックコンテキストメニューから「Visual Studio プロジェクトファイルの生成」を選択する。
2. Visual Studio で DiarkisPluginSample.sln を開く。
3. ビルド＆実行
   * Windowsで実行する： VisualStudio で `DebugGame_Editor` と `Win64` を選択し、ビルドと実行を行う。

### 選択ビューポート

1. UE5Editorを起動し、ツールバーの`Play`ボタンをクリックします。
   * `Selected Viewport`と`Multiplayer Option`で`Number of Players: 1`を選択します。

     ![image](/files/A9zW7yHkU3kFYQWyTTxc)

## 各画面の説明

### ログイン画面

* 起動後、以下のログインメニューが最初に表示されます。

  ![image](/files/U6jjXsoY6rgRu6yxIUea)
* Diarkisサーバーの設定を行います。
  * **HostName :** Diarkis HTTP サーバの URL を指定します。
  * **ClientKey :** DiarkisサーバーにClientKeyがある場合は、それを指定します。ない場合は空欄にしてください。
  * **UID :** 他のクライアントと異なるユニークなUIDを指定します。 ※ 他のクライアントと同じUIDを指定すると同期できません。デフォルトで、マシン名とクライアントのプロセスIDの組み合わせになっています。
  * **Protocol :** 通信方式（UDP/TCP）を選択します。
* **Start ボタン :** MainMenu 画面に移動します。
* フレームレート設定
  * **Show Stat :** フレームレートなどの情報を表示します。
  * **Fix FPS :** FPSを固定します。
  * **FPS :** 固定FPSを30FPSと60FPSの間で切り替えます。

### MainMenu 画面

* ログイン後、以下のメインメニューが表示されます。

<figure><img src="/files/h3My9TVQutsjigRqs0RJ" alt=""><figcaption></figcaption></figure>

* サンプルタイプを選びます。
  * **Room :** Room 画面に遷移します。
  * **Field :** Field 画面に遷移します。Field は使用する Pod (UDP / TCP サーバー) の数に応じて Grid で分割されます。
    * デフォルトでは、1Podの UDP サーバーが起動しているため、1Mapが4Gridに分割されます。
    * 他のキャラクターが隣の Grid にいても、そのキャラクターが自分の視界内にいれば、そのキャラクターの位置情報が送信されます。
  * **Host/Search :** MatchMaker Host/Search 画面に遷移します。
  * **Ticket :** MatchMaker Ticket 画面に遷移します。
  * **DirectMessage :** DirectMessage 画面に遷移します。
  * **Session :** Session 画面に遷移します。
  * **Group :** Group 画面に遷移します。
  * **Zombie :** Zombie 画面に遷移します。
  * **Disconnect :** Diarkis から切断してログインメニューに戻ります。

### Room 画面

* MainMenu 画面の Room ボタンをクリックすると、Room の作成や参加が行える Room 画面に遷移します。&#x20;

<figure><img src="/files/I54iC0SdrlR0Gr7V5G0z" alt=""><figcaption></figcaption></figure>

* **Max Members :** Room に参加できる最大人数を指定します。
* **Allow Empty :** クライアントが誰も参加していない場合でも、Room を保持するかどうかを決定します。
* **TTL :** Room が空になった後の生存時間を秒単位で指定します。
* **Interval :** サーバがブロードキャストを処理する間隔をミリ秒単位で指定します。
* **Join Random Room ボタン :** 利用可能な Room がある場合は、参加し、なければ Room を新規作成します。
* **Create Room ボタン :** Room を新規作成します。
* **Join Room ボタン :** 指定した Room ID の Room に参加します。
* **Create Or Join By CustomID ボタン :** 指定した Custom ID を使い、利用可能な Room がある場合は、参加し、なければ Room を新規作成します。
* **LOD Room Sample ボタン :** キャラクターの位置情報で使用する通信データにサーバ側で LOD を適用して通信量を削減するサンプルです。
  * ※ LOD Room Sample の動作確認を行うためには、diarkis-server-template の examples/room/lod の diarkis server を使用する必要があります。
    * diarkis-server-template の examples をインストールするには、下記のドキュメントをご参照ください。 [diarkis-server-template examples のインストール方法](https://github.com/Diarkis/diarkis-server-template/tree/develop/examples/README.md)
    * examples をインストールしたあとは、`examples/room/lod`フォルダに移動し、下記のドキュメントの手順に従ってください。 [LOD Room Sample に対応した diarkis server のビルド方法](https://github.com/Diarkis/diarkis-server-template/tree/develop/examples/room/lod/README.md)
    * この diarkis server では LOD Room Sample の動作のみ対応しております。他の Field サンプルや Session サンプルの実行には対応しておりません。

### Room InGame 画面

* Room 画面でボタンをクリックすると、Room InGame 画面に遷移し、キャラクターの位置が同期されます。&#x20;

  <figure><img src="/files/jRQ8PmlQZjWHux1R8x89" alt=""><figcaption></figcaption></figure>
* **Back ボタン :** Room 画面に戻ります。
* **Copy RoomID ボタン :** Room ID をクリップボードにコピーします。Windows, Mac OS, Linux プラットフォームでのみ動作します。
* **P2P Start ボタン :** P2P 機能を使って各クライアントとの通信を開始します。
* **Recovery ボタン :** RPC機能を使ってHPを回復します。
* アプリケーション操作

```キー
  wキー: 前進
  sキー: 後退
  aキー: 左に移動
  dキー: 右に移動
  スペースキー: ジャンプ
  カメラコントロール: マウス
  弾丸発射: 左マウスボタン
```

* P2P接続の確認方法
  * Room InGame 画面の`P2P Start`ボタンをクリックします。
  * クライアントとの接続(HolePunch)に成功すると、Room InGame 画面に`P2P Connect： 1 Client`と表示され、クライアント間でP2P通信が開始されます。

### LOD Room InGame 画面

* Room 画面で LOD Room Sample ボタンをクリックすると、LOD Room InGame 画面に遷移し、キャラクターの位置が同期されます。

<figure><img src="/files/IYY2OQGuPb9hyvYJCpCd" alt=""><figcaption></figcaption></figure>

* サンプルの動作概要
  * クライアントが送信した位置データをサーバ上で LOD を適用する機能のサンプル実装です
    * クライアントは高頻度で自分の位置をサーバへ送信します
    * サーバではプレイヤーの位置を元に LOD を適用し、近くにいる他のユーザーは高頻度で、遠くにいる他のユーザーは低頻度で位置データを送信するように制御を行い通信量を削減します
  * LOD に関するパラメータはサーバ側に設定を持っており、画面右側に表示しています
    * 設定値
      * Distance(N) cm:
        * サーバの設定項目名: `MaxDistanceForNearby`
        * LOD 処理を適用開始する距離です。
      * Distance(F) cm:
        * サーバの設定項目名: `MaxDistanceForFar`
        * LOD 処理が適用される最大距離です。
        * この距離以上離れるとサーバから位置情報が送られなくなります。
      * SyncIntr(N) ms:
        * サーバの設定項目名: `SyncIntervalForNearby`
        * 更新頻度の最小値です
        * Distance(N) 未満の場合はこの設定で位置情報が送信されます
      * SyncIntr(F) ms:
        * サーバの設定項目名: `SyncIntervalForFar`
        * 更新頻度の最大値です
  * プレイヤー毎の情報
    * 各リモートキャラクターの頭上にはそのキャラクターの通信状況に関する情報が表示されています
    * TotalSyncs:
      * 総受信パケット数
    * SyncRate:
      * 秒間何パケット受信したか
  * 位置情報全体の通信状況
    * デバッグメッセージの領域に位置同期全体の情報が表示されています
      * 青文字のテキストが実際に計測された値で総パケット数と通信量
      * 黄文字のテキストで LOD を適用しない場合の総パケット数と通信量の概算値

### Field 画面

* MainMenu 画面の Field ボタンをクリックすると、Field 画面に遷移します。
* Field は Join や Create のような事前コマンドを必要しません。
* Field は1つのサーバタイプに1つしか存在せず、ユーザーは一度に1つの位置にしか存在できません。

| Item          | Description                                             | Example |
| ------------- | ------------------------------------------------------- | ------- |
| Grid Size     | Field のサイズ。全体の Field のサイズとそれを分割する Grid のサイズが変更されます。     | 10000   |
| Server Count  | メッシュネットワーク内の Diarkis サーバーの数は、Field を分割する Grid の数に影響します。 | 4       |
| FOV Halfwidth | 視界の範囲。視界の範囲に入るリモートキャラクターが同期されます。                        | 1800    |
| Main Menu     | MainMenu 画面に戻ります。                                       |         |

![image](/files/oZVhwirbaBnuG4np2lD7)

### MatchMaker Host/Search 画面

* ※ この一連のサンプルを実行するには、マッチメイキング用の Diarkis サーバとは別に、TURN というサーバタイプ名で起動している Diarkis サーバが必要です。 環境変数`DIARKIS_SERVER_TYPE`に TURN を設定し、Diarkis サーバを立ち上げてください。

* MainMenu 画面の MatchMaker ボタンをクリックすると、MatchMaker 画面に遷移し、MatchMakerでマッチングした相手とInGame(Room)に参加することができます。&#x20;

  <figure><img src="/files/XTQ0POgqvoy7PbaEfdzN" alt=""><figcaption></figcaption></figure>

* **Matching Type :**
  * **Rank :**
    * 1-5、6-10、11-15、16-20、...のランクのユーザー同士でマッチングされます。

* **Tag :** マッチング用のタグ（文字列）。同じタグ同士がマッチングするようになります。

* **Max Players :** 作成する Room の最大人数。この機能はホストに対してのみ有効です。

* **Room Name :** 作成する Room の名前（文字列）。この機能はホストに対してのみ有効です。

* **Pass :** 作成する Room にロックを掛けたい時に指定するパスワード。この機能はホストに対してのみ有効です。

* **Host ボタン:** マッチング用の Room を作成する場合は、このボタンをクリックします。

* **Search ボタン:** 既に作成されている Room を検索します。検索が成功すると、Search Matching に Room のリストが表示されます。

* **OwnUID :** あなたのUIDが表示されます。

* **Main Menuボタン :** メインメニューに戻ります。

* **Search Matching :**

  * **Room Lists:** 検索して条件にあった Room があった場合、入室できる Room が表示されます。
  * **Join ボタン :** 入室したい Room を選択して、Join ボタンで Room に入室します。Room が既に一杯の場合や、すでにサーバーから Room が消えている場合など入室に失敗する場合があります。
  * **Disband ボタン :** Room を解散します。この機能はホストのみ有効です。

  <figure><img src="/files/EXV4pX5o9flV520bEKMA" alt=""><figcaption></figcaption></figure>

* **Room MemberLists :** Room に入室しているメンバーの UID リストを表示します。

  * **RoomID :** 入室している Room の Room ID が表示されます。
  * **Leave ボタン :** 入室している Room から退出します。
  * **Kick ボタン :** 入室しているメンバーを Room から Kick します。この機能はホストのみ有効です。
  * **In Game ボタン :** Room に居るメンバーと InGame に移動します。この機能はホストのみ有効です。

  <figure><img src="/files/G5aJkoDxO5trQnuWwQzV" alt=""><figcaption></figcaption></figure>

* **Sync**
  * **Sync ボタン :** SendMessage に入力されたメッセージがマッチングしたメンバーに送信されます。
  * **Send Message :** 送信するメッセージを入力します。
  * **Recv Message :** 受信したメッセージが表示されます。&#x20;

    <figure><img src="/files/oIOrm0u6WmGl5nfGdlf2" alt=""><figcaption></figcaption></figure>

### MatchMaker Host/Search InGame 画面

* MatchMaker Host/Search 画面の InGame ボタンをクリックすると、InGame 画面に遷移します。&#x20;

  <figure><img src="/files/CQKrvHja5Aa5Tdm1BJCH" alt=""><figcaption></figcaption></figure>
* **RoomID :** TURN サーバの RoomID が表示されます。 MatchMaker に使用されるRoomとは別のRoomのため、異なるRoomIDが表示されます。
* **Room Member :** Room に参加しているメンバーの一覧が表示されます。自分のUIDは青色で表示されます。
* **Receive Message :** 受信したメッセージが表示されます。
* **Send Message :** 送信するメッセージを入力します。Enter キーを入力するとメッセージが送信されます。
* **Send Message ボタン :** SendMessage に入力されたメッセージが Room 内のすべてのユーザーに送信されます。
* **Back ボタン :** MatchMaker Host/Search 画面に戻ります。

### MatchMaker Ticket 画面

* MainMenu 画面の Ticket ボタンをクリックすると、MatchMaker Ticket 画面に遷移します。

<figure><img src="/files/Pnf4GI2n8glz6CW5MfZK" alt=""><figcaption></figcaption></figure>

* **Ticket Type :** Ticket Type を指定します。
* **Issue Ticket ボタン :** 指定した Ticket Type でマッチングを開始します。
* マッチングが完了すると以下の画面が表示されます。

<figure><img src="/files/UDGggZh4lNsktT77QASW" alt=""><figcaption></figcaption></figure>

* **Cancel ボタン :** マッチング中の場合、マッチングをキャンセルします。
* **Leave ボタン :** マッチングした Ticket から退出します。
* **Send Message :** 送信するメッセージを入力します。Enter キーを入力するとメッセージが送信されます。
* **Send Message ボタン :** SendMessage に入力されたメッセージがマッチングしたすべてのユーザーに送信されます。
* **Matched Member :** マッチングしたユーザーの一覧が表示されます。
* **Main Menu ボタン :** MainMenu 画面に戻ります。

### DirectMessage 画面

* MainMenu 画面の DirectMessage ボタンをクリックすると、DirectMessage 画面に遷移します。&#x20;

  <figure><img src="/files/yS7kwFrOZ81za6LoUjK9" alt=""><figcaption></figcaption></figure>
* **My UID :** 自分のユーザーIDが表示されます。
* **クリップボードボタン :** 右側のクリップボードのアイコンのボタンをクリックすることで、自分のユーザーIDをクリップボードにコピーします。Windows, Mac OS, Linux プラットフォームでのみ動作します。
* **Recipient ID :** 送信したいユーザーIDを入力します。
* **Receive Message :** 受信したメッセージが表示されます。
* **Send Message :** 送信するメッセージを入力します。Enter キーを入力するとメッセージが送信されます。
* **Send Message ボタン :** SendMessage に入力されたメッセージが Recipient ID で指定したユーザーに送信されます。
* **Main Menu ボタン :** MainMenu 画面に戻ります。

### Session 画面

* MainMenu 画面の Session ボタンをクリックすると、Session 画面に遷移します。&#x20;

  <figure><img src="/files/FR39gQm8oJhdyjXRGAWt" alt=""><figcaption></figcaption></figure>
* **Joined Sessions :** 参加中の Session のリストが表示されます。クリックすることで Session を選択できます。選択中の Session が青色で表示されます。
* **Invited Sessions :** 招待された Session のリストが表示されます。クリックすることで招待された Session Type と Session ID が入力されます。
* **Create ボタン :** 入力された Session Type で Session を新規作成します。
* **Join ボタン :** 入力された Session Type と Session ID の Session に参加します。
* **Leave ボタン :** 入力された Session Type の参加中の Session から退出します。
* **Receive Message :** 受信したメッセージが表示されます。
* **Send Message :** 送信するメッセージを入力します。Enter キーを入力するとメッセージが送信されます。
* **Send Message ボタン :** SendMessage に入力されたメッセージが 選択中の Session 内のすべてのユーザーに送信されます。
* **Joined Member :** 選択中の Session に参加しているユーザーの一覧が表示されます。クリックすることで Kick ボタンの入力にユーザーID が入力されます。
* **Kick ボタン :** 入力されたユーザーIDを選択中の Session から Kick します。
* **Invite ボタン :** 入力されたユーザーIDを選択中の Session に Invite します。
* **Main Menu ボタン :** MainMenu 画面に戻ります。

### Group 画面

* ※ Group サンプルは一部の機能が動作していません。
* MainMenu 画面の Group ボタンをクリックすると、Group 画面に遷移します。&#x20;

  <figure><img src="/files/E8wDMkPFRmi5fA8krWNA" alt=""><figcaption></figcaption></figure>
* **Joined Group :** 参加中の Group のリストが表示されます。クリックすることで Group を選択できます。選択中の Group が青色で表示されます。
* **RandomJoin ボタン :** 利用可能な Group がある場合は、参加し、なければ Group を新規作成します。
* **Create ボタン :** Group を新規作成します。
* **Join ボタン :** 入力された Group ID の Group に参加します。
* **Leave ボタン :** 入力された Group ID の参加中の Group から退出します。Group ID を指定せず、ボタンをクリックした場合は、参加中のすべての Group から退出します。
* **Receive Message :** 受信したメッセージが表示されます。
* **Send Message :** 送信するメッセージを入力します。Enter キーを入力するとメッセージが送信されます。
* **Send Message ボタン :** SendMessage に入力されたメッセージが 選択中の Group 内のすべてのユーザーに送信されます。
* **Joined Member :** ※この機能は動作していません。
* **Main Menu ボタン :** MainMenu 画面に戻ります。

### Zombie 画面

* MainMenu 画面の Zombie ボタンをクリックすると、CSAR モジュールの動作を確認できる Zombie 画面に遷移します。

<figure><img src="/files/fmJROOiyhP0peeRUi7Yw" alt=""><figcaption></figcaption></figure>

* **Min Members :** Game Instance に参加できる最少人数を指定します。
* **Max Members :** Game Instance に参加できる最大人数を指定します。
* **Game Instance Name :** Game Instance Name を指定します。
* **Connection Mode :** Game Instance の Connection Mode を指定します。
  * SINGLE\_AUTHORITY : ホストクライアント型や DGS など、1 台のマシンが権限を持つモード
* **Network Type :** Game Instance の Network Type を指定します。
  * ROOM\_AND\_P2P : P2P が利用可能であれば P2P で通信し、P2P が利用可能でない場合は Room 経由で通信するタイプ
  * ROOM : Room 経由で通信するタイプ
  * DGS : DGS と通信するタイプ
* **Create/Join Game Instance ボタン:** 指定した設定で Game Instance を開始し、Zombie InGame 画面に遷移します。
* **Main Menu ボタン :** MainMenu 画面に戻ります。

### Zombie InGame 画面

* Zombie 画面の Create/Join Game Instance ボタンをクリックすると、Zombie InGame 画面に遷移します。
* 指定したConnection Mode, Network Type でキャラクターの位置を同期します。
* キャラクターの位置はホストやDGSなどの Authority が管理しています。
* Zombie は自動でランダムに移動します。
* **Back ボタン:** Zombie 画面に戻ります。

<figure><img src="/files/fHvK5XuqUdRnWuph33F6" alt=""><figcaption></figcaption></figure>

* アプリケーション操作

```
  wキー: 前進
  sキー: 後退
  aキー: 左に移動
  dキー: 右に移動
```

### DGS

* ※ DGS の動作確認を行うためには、diarkis-server-template の examples/csar/dgs の diarkis server を使用する必要があります。
  * diarkis-server-template の examples をインストールするには、下記のドキュメントをご参照ください。 [diarkis-server-template examples のインストール方法](https://github.com/Diarkis/diarkis-server-template/tree/develop/examples/README.md)
  * examples をインストールしたあとは、`csar/dgs`フォルダに移動し、下記のドキュメントの手順に従ってください。 [DGS に対応した diarkis server のビルド方法](https://github.com/Diarkis/diarkis-server-template/tree/develop/examples/csar/dgs/README.md)
  * この diarkis server では DGS の動作のみ対応しております。他の Field サンプルや Session サンプルの実行には対応しておりません。

1. まず、サーバービルドターゲット用のサンプルプロジェクトをパッケージ化します（これにはソースコード版のUEが必要です）。パッケージ化前に、ビルドターゲットでDiarkisPluginSampleServerがチェックされていることを確認してください

<figure><img src="/files/kCgWQsbDO6FXoKGpKnXm" alt=""><figcaption></figcaption></figure>

1. パッケージ化後、パッケージ化されたファイルのBinariesフォルダに移動します。その中にdgsConfigというフォルダがあります。その中にlog.jsonとmesh.jsonファイルがあります。必要に応じて内容を変更してください。

   log.json:

   ```json
   {
       "level": "sys",     // Log level (verbose, network, sys, debug, info, notice, warn, error, fatal)
       "timeZone": "local" // Timezone (utc, local)
   }
   ```

   mesh.json:

   ```json
   {
       "marsAddress": "127.0.0.1", // MARS Server Address
       "marsPort": "6779"          // MARS Server Port
   }
   ```
2. ターミナルで、パッケージ化されたフォルダのルートに移動し、下記コマンドでDGSを起動します。

   Windows:

   ```powershell
   ./DiarkisPluginSampleServer.exe -log -WorkingDir="$(Get-Location)" -LogConfigPath="DiarkisPluginSample\Binaries\Win64\dgsConfig\log.json" -MeshConfigPath="DiarkisPluginSample\Binaries\Win64\dgsConfig\mesh.json" -Host="0.0.0.0" -Port="8888" -DiarkisCloudEnv="127.0.0.1"
   ```

   Linux:

   ```shellscript
   ./DiarkisPluginSampleServer.sh -log -WorkingDir="$(pwd)" -LogConfigPath="DiarkisPluginSample/Binaries/Linux/dgsConfig/log.json" -MeshConfigPath="DiarkisPluginSample/Binaries/Linux/dgsConfig/mesh.json" -Host="0.0.0.0" -Port="8888" -DiarkisCloudEnv="127.0.0.1"
   ```

* **log :** サーバープロセスがUEログを出力するように設定します。これにより、サーバーが正常に動作しているかどうかを簡単に確認できます。
* **WorkingDir :** Windowsで実行する場合は「$(Get-Location)」に、Linuxで実行する場合は「$(pwd)」に設定してください。
* **LogConfigPath :** ログ設定ファイルのパスを指定します。
* **MeshConfigPath :** メッシュ設定ファイルのパスを指定します。
* **Host :** DGS がバインドするホストを指定します。全てのネットワークインターフェースで listen する場合は 0.0.0.0 を指定します。
* **Port :** DGS がバインドするポートを指定します。
* **DiarkisCloudEnv :** Diarkis は、主要なパブリッククラウドサービスに対応しています。DiarkisCloudEnv は、設定された値に基づいて、DGS サーバーがパブリックアドレスを取得する際のクラウド環境を指定します。この値は、Diarkis DGS を実行しているクラウドサービスと一致している必要があります。

  | Cloud Service   | Env Value |
  | --------------- | --------- |
  | Google Cloud    | GCP       |
  | AWS             | AWS       |
  | Microsoft Azure | AZURE     |
  | Tencent         | TENCENT   |
  | Alibaba Cloud   | ALIBABA   |
  | Linode          | LINODE    |

  ローカルで実行する場合はホスト名またはIPアドレスを設定することが可能です。
* (任意) **FPSOverride :** ゲームサーバーのFPS。指定しない場合、この値は60になります

<figure><img src="/files/gRGA2bxwiyJnpF7Nl2jb" alt=""><figcaption></figcaption></figure>

4. クライアント側でゾンビメニューに移動し、ネットワークタイプをDGSに設定した後、Create/Join Game Instanceをクリックしてください。少なくとも2人のクライアントが参加するまでキャラクターは生成されません。

<figure><img src="/files/PFIL7y5Dq3QrNr2yyOB7" alt=""><figcaption></figcaption></figure>

<figure><img src="/files/CR7x7Pi207AdwVXi1Kr1" alt=""><figcaption></figcaption></figure>

### 動作確認（マルチプレーオプション）

1. UEEditorを起動したら、ツールバーの`Play`ボタンを押します。
   * `Standalone Game`を選択します。
   * 「Multiplayer Option」 で `Number of Players: 2 ～ 4`を選択します。
   * ネットモード`Net Mode`で`スタンドアロンプレイ(Play Standalone)`を選択する。

     ![image](/files/SfvvUFGukicmg10U3Fs1)
2. 複数のWindowが表示されるので、ゲームの `Start` ボタンを押す。
   * UIDが同じでないことを確認してください。そうしないと意図しない動作が起こります。
   * 複数人でプレイする場合、PCのスペックによってはキャラクターの同期に時間がかかる場合があります。
3. 以下の手順は、選択したビューポートの場合と同じです。

   ![](/files/whtxrBXtonP1zhEtzVDi)

## コードについて

### C++ サンプルコード

* `Plugins\Diarkis\Source\SDK\samples` フォルダに、Diarkis Plugin の C++ サンプルが含まれています。
* 詳細については、[Plugins\Diarkis\Source\SDK\SAMPLE\_README.md](https://github.com/Diarkis/UE_PluginSample/blob/release/v1.0.3/Plugins/Diarkis/Source/SDK/SAMPLE_README.md) を参照してください。

### DiarkisPluginSample 側の主なコード（Diarkis Pluginを利用したサンプル）

* `DiarkisPluginSample/Source/DiarkisPluginSample`
  * `DiarkisPluginSampleGameMode.h / DiarkisPluginSampleGameMode.cpp` : ゲームを管理するメインクラス ( AGameModeBase )
  * `DiarkisPluginSampleCharacter.h / DiarkisPluginSampleCharacter.cpp` : キャラクターのクラス ( ADiarkisCharacter )
* `DiarkisPluginSample/Source/DiarkisPluginSample/Diarkis`
  * `DiarkisSampleBase.h / DiarkisSampleBase.cpp` : Diarkisプラグインを使用するためのベースクラス
  * `DiarkisSampleInterface.h / DiarkisSampleInterface.cpp` : Diarkis Pluginを使用するためのインターフェースクラス
  * `DiarkisSample.h / DiarkisSample.cpp` : Diarkis Pluginを使用するサンプルクラス

### Diarkis Plugin + Sample の主なコード

| メソッド                     | 範囲             | 役割                                            |
| ------------------------ | -------------- | --------------------------------------------- |
| libDiarkis               | Diarkis Plugin | Diarkis ライブラリ                                 |
| diarkis-module Client    | Diarkis Plugin | Diarkisライブラリを制御するインターフェースの親クラス                |
| diarkis-module Extension | Sample コード     | Diarkisライブラリを制御するインターフェースの子クラス群               |
| DiarkisNetwork           | Sample コード     | Diarkisプラグインのインターフェースクラス                      |
| EventEmitter             | Sample コード     | BluePrint で Diarkis コールバックイベントを受け取るためのクラス群（旧） |
| Delegate                 | Sample コード     | アプリレイヤーで Diarkis コールバックイベントを受け取るためのクラス群（新）    |

### libDiarkis のコードについて

* * 役割の概要
    * Diarkis C++ライブラリ
  * コードの場所
    * DiarkisPluginSample/Plugins/Diarkis/Source/SDK/platforms/
  * 各ライブラリのファイル
    * win-x64 で使用されるライブラリ `(win-vs2019/lib/x86_64-MD/<ビルドの種類>/lib_static)`
    * macos-x64 で使用されるライブラリ `(macos/lib/macos-arm64/<ビルドの種類>/lib_static)`
    * ios で使用されるライブラリ `(ios/lib/iOS/<ビルドの種類>/lib_static)`
    * android で使用されるライブラリ `(android/lib/<ABI>/<ビルドの種類>/lib_static)`
    * ps5 で使用されるライブラリ `(ps5/lib/<ビルドの種類>/lib_static)`
    * xbox series で使用されるライブラリ `(xbox-series/lib/MD/<ビルドの種類>/lib_static)`
    * Nintendo Switch 2 で使用されるライブラリ `(Ounce-ounce-a64/lib/<ビルドの種類>/lib_static)`
  * ビルドの種類
    * debug : `Debug ビルド` x `Diarkis ログ出力 有り`
    * develop : `Release ビルド` x `Diarkis ログ出力 有り`
    * release : `Release ビルド` x `Diarkis ログ出力 無し`

### diarkis-module Client のコードについて

* 役割の概要
  * Diarkisライブラリを制御するインターフェースの親クラス
* コードの場所
  * DiarkisPluginSample/Plugins/Diarkis/Source/SDK/diarkis-module/Client
* 各クラス
  * `DiarkisInterfaceBase.h / DiarkisInterfaceBase.cpp` : Diarkis をコントロールするインターフェースクラス（ libDiarkis をコントロール）
  * `DiarkisUdpBase.h / DiarkisUdpBase.cpp` : UDP 機能の Base クラス
  * `DiarkisTcpBase.h / DiarkisTcpBase.cpp` : TCP 機能の Base クラス
  * `DiarkisP2PBase.h / DiarkisP2PBase.cpp` : P2P 機能の Base クラス
  * `DiarkisRoomBase.h / DiarkisRoomBase.cpp` : Room 機能の Base クラス
  * `DiarkisMatchMakerBase.h / DiarkisMatchMakerBase.cpp` : MatchMaker 機能の Base クラス
  * `DiarkisGroupBase.h / DiarkisGroupBase.cpp` : Group 機能の Base クラス
  * `DiarkisFieldBase.h / DiarkisFieldBase.cpp` : Field 機能の Base クラス
  * `DiarkisSessionBase.h / DiarkisSessionBase.cpp` : Session 機能の Base クラス
  * `DiarkisDirectMessageBase.h / DiarkisDirectMessageBase.cpp` : DirectMessage 機能の Base クラス
  * `DiarkisRPCBase.h / DiarkisRPCBase.cpp` : RPC 機能の Base クラス
  * `LoggerFactory.h / LoggerFactory.cpp` : Logger 機能の Main クラス
  * `ConnectionManager.h / ConnectionManager.cpp` : CSAR 機能の Main クラス
  * `DiarkisServerBase.h / DiarkisServerBase.cpp` : CSAR DGS 機能の Main クラス

### diarkis-module Extension のコードについて

* 役割の概要
  * Diarkisライブラリを制御するインターフェースの子クラス群
* コードの場所
  * DiarkisPluginSample/Source/DiarkisExtension
* 各クラス
  * `Character`（キャラクターデータ同期クラス）
    * `DiarkisCharacter.h / DiarkisCharacter.cpp` : Diarkisのキャラクター同期用のクラス。
  * `Component` (位置同期用の Diarkis コンポーネントクラス)
    * `DiarkisSyncComponent.h / DiarkisSyncComponent.cpp` : Diarkis位置同期コンポーネントクラス
    * `DiarkisCharacterSyncComponent.h / DiarkisCharacterSyncComponent.cpp` : アクタの作成時にカスタムデータを送受信するためのサンプル実装コンポーネントクラス
  * `Movement`（Diarkisの位置同期クラス）
    * `DiarkisMovementController.h` : 位置同期コンポーネントのインターフェースクラス
    * `DiarkisLocalMovementSync.h / DiarkisLocalMovementSync.cpp` : ローカル用の位置同期コンポーネントクラス。
    * `DiarkisRemoteMovementSync.h / DiarkisRemoteMovementSync.cpp` : リモート用のロケーション同期コンポーネントクラス。
  * `Diarkis/Utils` （ユーティリティクラス）
    * `DiarkisUtils.h / DiarkisUtils.cpp` : ライブラリを制御するためのインターフェースクラス
  * ライブラリを制御するためのインターフェースクラス（XXXBaseから派生）
    * `DiarkisInterface.h / DiarkisInterface.cpp` (XXXBase から派生したクラス)
    * `DiarkisRoom.h / DiarkisRoom.cpp` : Room 機能を制御するためのクラス
    * `DiarkisGroup.h / DiarkisGroup.cpp` : Group 機能を制御するクラス
    * `DiarkisField.h / DiarkisField.cpp` : Field 機能を制御するクラス
    * `DiarkisTcp.h / DiarkisTcp.cpp` : TCP 機能を制御するクラス
    * `DiarkisUdp.h / DiarkisUdp.cpp` : UDP 関数を制御するクラス
    * `DiarkisP2P.h / DiarkisP2P.cpp` : P2P 機能を制御するクラス
    * `DiarkisMatchMaker.h / DiarkisMatchMaker.cpp` : MatchMaker機能を制御するクラス
    * `DiarkisRPC.h / DiarkisRPC.cpp` : RPC機能を制御するクラス
    * `DiarkisSyncData.h / DiarkisSyncData.cpp` : Diarkisのロケーション同期を処理するクラス
    * `DiarkisReplication.h / DiarkisReplication.cpp` : 部屋のプロパティを使用した変数のレプリケーションを行うクラス
    * `DiarkisActorManagement.h / DiarkisActorManagement.cpp` : Diarkisが管理するアクターを識別するID

### DiarkisNetwork のコードについて

* 役割の概要
  * Diarkis プラグインのインターフェースクラス群
* コードの場所
  * DiarkisPluginSample/Source/DiarkisExtension/XXXXX/
* 各クラス - `DiarkisNetworkManager.h / DiarkisNetworkManager.cpp` : Diarkis Plugin を管理するメインのクラス - `DiarkisNetworkSubsystem.h / DiarkisNetworkSubsystem.cpp` : UDiarkisNetworkManager インスタンスを保持するクラス - `DiarkisNetworkBlueprintLibrary.h / DiarkisNetworkBlueprintLibrary.cpp` : ブループリント関数として Diarkis プラグインのコールバックイベントを登録するクラス。 - `Modules`ディレクトリ（Diarkis のステータスをチェックし、コールバックイベントをキューに入れるクラス）
  * `DiarkisNetworkModuleBase.h / DiarkisNetworkModuleBase.cpp` : Diarkis のステータスをチェックしてコールバックイベントをキューに溜める基底クラス
  * `DiarkisNetworkRoom.h / DiarkisNetworkRoom.cpp` : Diarkis の Room のステータスをチェックし、コールバックイベントをキューに入れるクラス。
  * `DiarkisNetworkGroup.h / DiarkisNetworkGroup.cpp` : Diarkis の Group のステータスをチェックし、コールバックイベントをキューに入れるクラス。
  * `DiarkisNetworkField.h / DiarkisNetworkField.cpp` : Diarkis の Field のステータスをチェックし、コールバックイベントをキューに入れるクラス。
  * `DiarkisNetworkP2P.h / DiarkisNetworkP2P.cpp` : Diarkisの P2P のステータスをチェックし、コールバックイベントをキューに入れるクラス。
  * `DiarkisNetworkMatchMaker.h / DiarkisNetworkMatchMaker.cpp` : Diarkis の MatchMaker のステータスをチェックし、コールバックイベントをキューに入れるクラス。

### Blueprint用 コールバックイベント キューイング のコードについて

* 役割の概要
  * BluePrint で Diarkis コールバックイベントを受け取るためのクラス群（旧）
* コードの場所
  * DiarkisPluginSample/Source/DiarkisExtension/XXXXX/Events
* 各クラス
  * `Interfaces` ディレクトリ（Diarkis Plugin のコールバックを受け取るインターフェースクラス）
    * `DiarkisNetworkCoreEvent.h` : Diarkis Plugin の Core 機能のコールバックを受け取るインターフェースクラス
    * `DiarkisNetworkRoomEvent.h` : Diarkis Plugin の Room 機能のコールバックを受け取るインターフェースクラス
    * `DiarkisNetworkGroupEvent.h` : Diarkis Plugin の Group 機能のコールバックを受け取るインターフェースクラス
    * `DiarkisNetworkFieldEvent.h` : Diarkis Pluginの Field 機能のコールバックを受け取るインターフェースクラス
    * `DiarkisNetworkP2PEvent.h` : Diarkis Plugin の P2P 機能のコールバックを受け取るインターフェースクラス
    * `DiarkisNetworkMatchMakerEvent.h` : Diarkis Plugin の MatchMaker 機能のコールバックを受け取るインターフェースクラス
  * `Emitters` ディレクトリ（Diarkis イベントをキューイングするクラス）
    * `DiarkisNetworkCoreEventEmitter.h / DiarkisNetworkCoreEventEmitter.cpp` : Diarkis Core イベントをキューイング用クラス
    * `DiarkisNetworkEventEmitterBase.h / DiarkisNetworkEventEmitterBase.cpp` : 様々なイベントを生成するためのベースクラス
    * `DiarkisNetworkRoomEventEmitter.h / DiarkisNetworkRoomEventEmitter.cpp` : Diarkis Room イベントをキューイング用クラス
    * `DiarkisNetworkGroupEventEmitter.h / DiarkisNetworkGroupEventEmitter.cpp` : Diarkis Group イベントのキューイング用クラス
    * `DiarkisNetworkFieldEventEmitter.h / DiarkisNetworkFieldEventEmitter.cpp` : Diarkis Field イベントのキューイング用クラス
    * `DiarkisNetworkP2PEventEmitter.h / DiarkisNetworkP2PEventEmitter.cpp` : Diarkis P2P イベントのキューイング用クラス
    * `DiarkisNetworkMatchMakerEventEmitter.h / DiarkisNetworkMatchMakerEventEmitter.cpp` : Diarkis MatchMaker イベントのキューイング用クラス

### イベントの Delegate のコードについて

* 役割の概要
  * アプリレイヤーで Diarkis コールバックイベントを受け取るためのクラス群（新）
* コードの場所
  * DiarkisPluginSample/Source/DiarkisExtension/XXXXX/Delegate
* 各クラス
  * `DiarkisDispatch.h / DiarkisDispatch.cpp` : Diarkis のコールバックイベントをキューイングや実行するクラス
  * `DiarkisRoomDelegate.h` : Diarkis の Room のコールバックイベントをキューに入れるクラス
  * `DiarkisUDPDelegate.h` : Diarkis の UDP のコールバックイベントをキューに入れるクラス
  * `DiarkisP2PDelegate.h` : Diarkisの P2P のコールバックイベントをキューに入れるクラス
  * `DiarkisMatchMakerDelegate.h` : Diarkis の MatchMaker のコールバックイベントをキューに入れるクラス

## クラス図

* Diarkisプラグインのクラス図

  ![イメージ](/files/9hNhO39XSeSNH4N4l2gs)
* Diarkis Pluginをカスタマイズするには
  * Diarkisライブラリを制御するインターフェースクラス（図の上段赤枠）から派生したクラスを用意し、その処理をカスタマイズする。
  * `ADiarkisPluginSample`を参考にカスタマイズしてください。
* キャラクター同期に関連するクラス図

  ![image](/files/0yfqSt7h1ok4AlqyD3W3)
* 同期方法をカスタマイズする
  * `DiarkisLocalMovementSync`、`DiarkisRemoteMovementSync`から派生したクラスを用意して処理をカスタマイズするか、`ADiarkisCharacter`から派生したクラスを用意して処理をカスタマイズする。

## 同期機能について

### Diarkis Plugin で同期できる機能について

Field Walkerのサンプルには、Diarkis Pluginを使って同期できる以下の機能のサンプルが含まれています。

* アクターインスタンス管理
* アクターロケーション同期
* 変数のレプリケーション
* RPC

これらの機能は、標準的なUEの通信処理とは異なる実装となっているため、通常の通信処理とは別に設定・実装する必要があります。また、Diarkis Room機能を用いて同期を実装するため、Roomを用いた通信が可能な状態である必要があります。

#### アクターのインスタンス管理

* `DiarkisSyncComponent` を持つアクターがローカルで作成または削除されると、アクターインスタンス管理のための情報がリモートに送信され、各ホスト上に同じアクターインスタンスが存在するように同期されます。マップ上に最初に配置されたアクタは、既に作成されたインスタンスから再利用され、動的に作成されたアクタはリモート上で動的に生成されます。
* `DiarkisSyncComponent`は、Diarkisネットワーク上のアクタを識別するために使用される`DiarkisアクタID`を持っています。また、`DiarkisSyncComponent`のオーナーかどうかを判断し、この情報を使ってローカルとリモートの動作を切り替えることができる。例えば、`ThirdPerson_AnimSyncBP` はこのフラグを使用して、ローカルの `CharacterMovement` から情報を取得するか、通信によって取得した情報を使用するかを切り替える。
* `Actor ID`と所有者フラグは、Diarkisネットワークに接続して必要な情報が利用可能になった後に利用可能になる。`DiarkisSyncComponent`には `OnDiarkisActorIDDecided` イベントがあり、このイベントが発生すると知ることができます。例えば、`ThirdPersonCharacter`の`Begin Play`はこのイベントを使用して、オーナーが決定した後にレプリケーションとRPC登録処理を行います。
* リモートアクターの作成時にカスタムデータを追加することも可能です。 `UDiarkisCharacterSyncComponent::SerializeSpawnActorCustomPayload()` でリモートアクター作成データにカスタムデータを追加し、`UDiarkisCharacterSyncComponent::DeserializeSpawnActorCustomPayload()` を呼び出して受信データから必要な情報を取得します。

#### アクターの位置同期

* アクターに `DiarkisSyncComponent` を追加することで、これらの機能が有効になります。同じRoomに接続されている他のホストにも同じActorが自動的に作成されます。リモートの `ThirdPersonCharacter` は位置、姿勢、ジャンプ状態などを自動的に同期します。リモートホストが Room を離れると、ローカルに存在するリモートアクターも自動的に削除されます。

#### 変数のレプリケーション

* アクターが持つ変数をネットワーク経由で同期します。対象となる変数には `UPROPERTY()` を指定する必要があります。`Register Replicated Variable`で対象のActorと変数名を登録し、`Send Replicated Variable`で必要なタイミングでデータを送信します。ただし、送信間隔は `DiarkisReplication::replicationMinimumInterval` が最も短いタイミングとなる。サンプルでは、`ThirdPersonCharacter` ブループリントの `Register Replicated Variables` と `Send Replicated Variable` に実装があります。

#### RPC

* RPCはネットワーク経由でActorの関数を呼び出す関数です。対象の関数には `UFUNCTION()` を指定する必要があります。`RegisterRpcUEFuncName`で対象のActorと変数名を指定して関数を登録し、`SendRpcUEFuncAll`などで送信します。リモート側で RPC を受信すると、同じ Actor ID を持つ Actor の指定した名前のメソッドを呼び出します。サンプルでは `ThirdPersonCharacter` のブループリントの `RPC` を登録し、`ADiarkisPluginSampleCharacter::HandleFire()` で `RPC` を送信しています。

### サンプル上で同期を利用している機能

本サンプルでは、上記の関数を用いて以下の処理を実装しています。

#### プレイヤーキャラクターの生成・位置の同期

* ローカルで`ThirdPersonCharacter`を作成すると、同じRoomに接続している他のホストでも自動的に同じアクターが作成されます。リモートの `ThirdPersonCharacter` は位置、姿勢、ジャンプ状態などを自動的に同期します。リモートホストが Room を離れると、ローカルに存在するリモートアクターも自動的に削除されます。また、リモートのプレイヤーキャラクターを作成する際には、オーナーが決定したアクターの色が初期データとして渡され、すべてのホストで同じ外見を再現します。

#### 弾の発射

* 弾の発射処理はリモートホスト側で `RPC` によって呼び出されます。ローカルで弾を発射する場合、あなたがプレイヤーキャラクターのオーナーであれば、 `RPC` コールがルームに参加している他のホストに送られます。この`RPC`呼び出しによって、リモートホストも同じ弾の発射処理を行います。弾丸の衝突とダメージ処理は、アクタのオーナーであるホストによって決定されます。

  ![image](/files/liMyoN4AHN68GTG9Xvo3) ![image](/files/7XeL2IhGZCWLMnK9Trtp)

#### 体力同期

* `ThirdPersonCharacter`の変数 `Health` はレプリケーションによって同期されます。`ThirdPersonCharacter`の所有者であるホストで被弾時に `Health` が減少すると、自動的にリモート側の `ThirdPersonCharacter` の `Health` 変数に同期される。また、`Recovery`ボタンによって`Health`が回復すると、その変化は自動的にリモート側の`ThirdPersonCharacter`に反映される。

## 動作確認環境

* 対応プラットフォーム
  * Windows 10/11
  * Mac OS X
  * iOS
  * Android
  * PS5
  * Xbox Series X|S
  * Nintendo Switch 2
* UnrealEngine バージョン
  * 5.6.1

### UE の バージョン毎の確認環境

* UE 5.6.1
  * VisualStudio 2022
    * WindowsSDK バージョン 10.0.22621.0
    * MSVC 14.38.33130
  * Mac/iOS 環境
    * macOS 14 Sonoma
    * Xcode 16.2
  * Android 環境
    * Android Studio Koala Feature Drop | 2024.1.2 Patch 1
    * Android NDK 27.2.12479018
    * Android 14.0 (API 34)
  * PS5 環境
    * UE5 ベースコード
      * 5.6.1 リリース タグ
    * PS5 SDK バージョン 11.00.00.46
  * Xbox Series X|S 環境
    * UE5 ベースコード
      * 5.6.1 リリース タグ
    * GDK: 250402
  * Nintendo Switch 2 環境
    * Nintendo SDK 20.5.6
* UE 5.5.4
  * VisualStudio 2022
    * WindowsSDK バージョン 10.0.22621.0
    * MSVC 14.38.33130
  * PS5 環境
    * UE5 ベースコード
      * 5.5.4 リリース タグ
    * PS5 SDK バージョン 10.000
  * Xbox Series X|S 環境
    * UE5 ベースコード
      * 5.5.4 リリース タグ
    * GDK: 240302

## 動作確認手順

### Windows のパッケージ作成手順

1. `Platform` メニュー => `Windows` => `Package Project` を選択する。
2. パッケージの出力先フォルダを指定する。
3. ビルドに成功したら、出力先に指定したフォルダから DiarkisPluginSample.exe を起動する。

### Android 端末で動作確認手順（別途AndroidStudio環境のセットアップが必要）

1. UnrealEditorのタスクバーから、`設定`⇒`プロジェクト設定`をクリックします。
2. Platformの項目で、`Android`をクリックします。

   ![image](/files/NocWl5mQ6ERF7JXpBurQ)

* APKパッケージ
  * Androidパッケージ
  * 最小SDKバージョン
  * ターゲットSDKバージョン
* ビルド
  * armv7サポートのチェックを外す（armv7は順次サポートされます）
  * arm64のサポートをチェックする

3. Platformの項目で `Android SDK` をクリックします。

   ![image](/files/5wkHwR3OZKwFmMNSSMfs)

* 以上の各項目を環境に合わせて設定してください。

4. Android プラットフォーム用にプロジェクトをパッケージングします。

   ![image](/files/AKMnNS8nRlXBtsK4Hnaz)
5. USBデバッグを有効にした Android デバイスを PC に接続します。
6. Android プロジェクトの出力ディレクトリにあるインストールスクリプト(Install\_\*\*\*.bat)を実行し、アプリをインストールします。
7. アプリを起動すると、ログイン画面が表示されます。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://help.diarkis.io/diarkis-client/samples/unreal-engine/diarkis-plugin-sample.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
