# Diarkis プラグインの基本的な使い方

## 概要

本ページでは UE プラグインを利用して Diarkis のクライアント機能を利用する際の基本を説明します。

## Diarkis クライアント SDK の基本的な使用方法

UE プラグインは [Diarkis クライアント SDK](/getting-started/diarkis-client-sdk.md) 相当の機能を有したプラグインとなります。 クライアント SDK では Diarkis-Module を利用してランタイムの初期化、終了処理、機能の利用等を行います。\
UE から Diarkis プラグインを利用する際においても基本的には同様の実装が必要となりますので、基本的な使用方法として [Diarkis-Module のドキュメント](/diarkis-client/diarkis-module.md) を先にご一読いただけるとこの先の説明をスムーズにご理解いただけます。

## サンプルでの実装例紹介

[Diarkis-Module のドキュメント](/diarkis-client/diarkis-module.md) で説明した点を中心にシンプルなサンプルでどのように実装されるかソースコードを交えて説明します。

### 初期化処理と終了処理

[Diarkis Module の初期化処理と終了処理](/diarkis-client/diarkis-module/how-to-init-deinit.md) 相当の処理はおおむね以下のクラスに実装されています。

* `Source\DiarkisExtension\Public\DiarkisNetworkManager.h`
* `Source\DiarkisExtension\Private\DiarkisNetworkManager.cpp`

以下が実装内容の詳細となります。

* 初期化処理
  * `UDiarkisNetworkManager::Connect`/`UDiarkisNetworkManager::ConnectAsync` の実行時にまだ未初期化であれば初期化処理を実行します
  * [Diarkis Module の初期化と終了](https://help.diarkis.io/diarkis-client/game-engine-integration/ue/pages/S9LGXROVUDXYkgmWfZH1#diarkis-module-の初期化と終了) に記載されていますように、この処理はアプリ起動後一度だけ実行する必要があります
  * UE では Editor 上での実行も考慮すると呼び出しタイミングには注意が必要となります
* Diarkis サーバへの接続情報取得
  * [Diarkis サーバへの接続情報の取得](https://help.diarkis.io/diarkis-client/game-engine-integration/ue/pages/S9LGXROVUDXYkgmWfZH1#diarkis-サーバーへの接続情報取得) と同様の実装となっています
* Diarkis サーバへの接続
  * [Diarkis サーバへの接続](https://help.diarkis.io/diarkis-client/game-engine-integration/ue/pages/S9LGXROVUDXYkgmWfZH1#diarkis-サーバーへ接続) と同様の実装となっています
* 終了処理
  * `UDiarkisNetworkManager::Disconnect` の実行時に接続先サーバがなくなったときに自動的に実行します
  * [Diarkis Module の初期化と終了](https://help.diarkis.io/diarkis-client/game-engine-integration/ue/pages/S9LGXROVUDXYkgmWfZH1#diarkis-module-の初期化と終了) に記載されていますように `DiarkisDestroy` の呼び出しは `DiarkisInit` の呼び出しに１対１で対応している必要があります

### ロガー関連の実装

#### ログレベルの変更

* UE プラグインでは LoggerFactory.cpp は以下の場所に存在します
  * `Plugins\Diarkis\Source\Diarkis\Client\Private\logging\LoggerFactory.cpp`

#### UE プラグインのロガー関連設定

* ログファイルは以下のフォルダに出力されます。
  * DiarkisPluginSample/logs/○○○/および以下のフォルダ（OOOOはユーザID）。
* Developmentビルドでもログを出力したい場合は、DiarkisInterfaceBaseのコンストラクタで`bOutputLog = true`を調整してください。
* DiarkisInterfaceBase コンストラクタでは、LogOutType でファイル出力とデバッグ出力を切り替えることができます。

### Diarkis Module のカスタマイズ

Diarkis はサーバとクライアントが連携して動作する仕組みとなっており、サーバへリクエストを送信して結果をコールバックで受け取るという形が基本となっています。\
この動作を実現するために [Diarkis Module のカスタマイズ](/diarkis-client/diarkis-module/how-to-customize-module.md) を行いアプリに合わせて Diarkis Module のコールバック処理等をカスタマイズする必要があります。\
Diarkis プラグインサンプルではサンプルの都合に合わせてこの実装を行っており、これらのファイルが以下のフォルダに格納されています。

* `Source\DiarkisExtension\Private`

Room 用のカスタマイズ実装であれば `DiarkisRoom`といった名前で `DiarkisRoomBase` を継承してサンプルの動作を実装しています。

### 基本となる処理や呼び出しタイミング

サーバへのコマンドの送信は各モジュールのインスタンスを使用して行います。\
ここでは Room モジュールでサーバ上に部屋を作成する処理を例に使用方法を紹介します。\
Room モジュールのインスタンスは `DiarkisRoomBase` を継承した `DiarkisRoom` クラスが実装されています。<br>

* `Source\DiarkisExtension\Public\DiarkisRoom.h`
* `Source\DiarkisExtension\Private\DiarkisRoom.cpp`

#### コマンドの送信

`DiarkisRoomBase` には部屋を作成するコマンドを送信する `DiarkisRoomBase::SendCreateRoom` が用意されており、このメソッドを実行することでサーバへ部屋作成のリクエストコマンドを送信することができます。<br>

サンプルコードでは以下のコードでこの機能を利用して部屋作成コマンドを送信しています。

`Source\FieldWalker\Diarkis\UI\Room\RoomMenu.cpp` の `URoomMenu::OnCreateButtonClicked`

#### サーバでの処理結果などの受け取り

サーバでの処理結果は Room モジュールのコールバックで受け取ることができます。\
例えば、`SendCreateRoom` コマンドの実行結果は `DiarkisRoom::OnRoomCreation` で受け取ることができます。 コマンドの処理結果がどのコールバックで取得できるかは `DiarkisRoomBase` のような Base クラスのヘッダファイルを参照してください。\
イベントコールバックは Diarkis が管理するイベントスレッドで発火するためこのコールバック内で UE 関連の機能を使用することができません。 また、コールバックが発生してからアプリに通知される際のレスポンス向上のためにもイベントスレッドで負荷の高い処理を行うことは避けることが望ましいです。 これらの課題に対応するためにサンプルでは様々なイベント処理が実装されています。\
詳細については [イベント処理について](/diarkis-client/game-engine-integration/ue/tips-for-event-processing.md) を参照してください。


---

# 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/game-engine-integration/ue/ue-plugin-basics.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.
