# DGS のローカル開発手順 (Windows)

## はじめに

CSAR を使うとローカル環境上で簡単に DGS の開発を行うことができます。

Diarkis サーバークラスターは Windows 上で動かすこともできるので、別途サーバー環境を用意せずにローカル環境のみで DGS を動かす事が可能です。

本ページでは Windows 上のローカル環境で開発フローを回すために以下について解説します。

* CSAR の開発フローの確認
* Diarkis サーバーのビルド、実行方法
* Unity での DGS サーバーのビルド方法

## 動作環境

2025-07-07 現在のバージョン v1.1.0 について、以下の環境で動作を確認しております。

* Windows 11
* Go 1.24

## CSAR DGS のローカル上での動作イメージ

ローカル環境においては、開発効率を重視するために、Diarkis クラスターで管理されている DGS プロセスを allocate するように構築します。それにより、開発者が任意のタイミングで DGS をビルドして動作確認することができます。

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

以下はローカル環境での開発フローの例です。

Diarkis はローカル環境では各プロセスを実行するだけで、Diarkis クラスターとして管理されます。CSAR は DGS の実装・修正をしてビルドおよび実行（Editor においては Play）するだけでクラスターに参加でき、動作確認ができます。

{% @mermaid/diagram content="graph LR
startServerProcesses\["mars,HTTP,UDP<br>サーバープロセスを起動"]
implement\["クライアント、<br>DGSの実装、修正"]
DGSBuild\["DGSビルド"]
startDGSProcess\["DGSプロセスの起動<br>（再起動）"]
check\["動作確認"]
unityEditor\["Play on Unity Editor"]
checkOnUnityEditor\["動作確認"]
implementOnUnityEditor\["クライアント、<br>DGSの実装、修正"]

startServerProcesses --> startDGSProcess
implement --> DGSBuild
DGSBuild --> startDGSProcess
startDGSProcess --> check
check --> implement

startServerProcesses --> unityEditor
unityEditor --> checkOnUnityEditor
checkOnUnityEditor --> implementOnUnityEditor
implementOnUnityEditor --> unityEditor
" %}

## mars, HTTP, UDP サーバーのビルド、起動手順

### Diarkis  Server Template のインストール

以下リポジトリより、Diarkis Server Template のソースコードを取得します。

<https://github.com/Diarkis/diarkis-server-template>

`git clone` して利用中のバージョンをチェックアウト、または releases&#x20;

### プロジェクトの生成

PowerShell から以下のコマンドを実行して、プロジェクトを生成します。

{% code overflow="wrap" %}

```powershell
# parameters: {project_id} {builder_token} {output\}
> .\run-mage.bat examples:install 12345678901 11111111-1111-1111-1111-111111111111 ../server_bin
```

{% endcode %}

* `project_id`: 弊社が発行したプロジェクトID
* `builder_token`: 弊社が発行したBuilder Token
* `output`: 生成したプロジェクトの出力先。ここでは `../server_bin` として説明します

上記のコマンドを実行することで、 `../server_bin` に Diarkis のサンプルプロジェクトが出力されます。

### ビルド

出力されたサンプルプロジェクトの `../server_bin/csar/dgs` が DGS のサンプルプロジェクトとなります。ディレクトリを移動し、以下のコマンドを実行して、Diarkis のサーバーバイナリをビルドします。

```powershell
> cd ..\server_bin\csar\dgs
> .\run-mage.bat build:local
```

ビルドが終了すると、 `remote_bin` ディレクトリにバイナリが出力されます。

### 実行

mars, http, udp をそれぞれ起動します。それぞれ別の PowerShell のウィンドウで起動します。

```powershell
> .\run-mage.bat server mars
> .\run-mage.bat server http
> .\run-mage.bat server udp
```

必要に応じて、Go のテストクライアントで動作確認を実施してください。

👉 [2. テストクライアントで疎通確認する](/getting-started/tutorial/test-client.md)

## DGS サーバーのビルド、起動手順

### Unity で DGS サーバーを実行する

1. Diarkis Plugin Sample/Sample/Scenes から DiarkisSampleScene を選択してください。
2. DiarkisSampleScene の DiarkisNetworkManager から、`Pre Stored Http Host` に Diarkis サーバーの `アドレス:ポート` を指定してください。
3. DiarkisSampleScene の SceneManager から、`Editor DGS Clound Env` に DGS サーバーを起動する PC の `アドレス` (ポート番号は不要) を指定してください。
   1. Diarkis サーバーと DGS サーバー を同じ PC で起動する場合は、同じ アドレスを指定してください。
   2. DGS サーバーを複数起動される場合は、`Editor DGS Port`  を `7400` 以外をご利用ください。
4. `BuildSettings` の `Scenes In Build` で、DGSSSampleScene と DiarkisSample\_HostClientGameDemo\_2\_InGame を選択します。

<mark style="color:red;">※以下の参考画像では、 Diarkis サーバーを ローカルホスト (127.0.0.1)で起動している場合の設定になります。</mark>

<figure><img src="/files/QiQZRmwGjtZXmBKnOtWz" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="/files/JGxPaQK1Aedqlkials0O" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="/files/4VaOfclIUfEeMLbmCfUW" alt="" width="375"><figcaption></figcaption></figure>

<figure><img src="/files/1BIzLzpLB4ugH5euWKrg" alt="" width="375"><figcaption></figcaption></figure>

### DSGサーバー プロセス実行

1. Unity Editor で DGSSampleScene  を起動して、`Play` ボタンで実行します。
2. 実行すると、DGS サーバーのプロセス （relay.exe) が起動され、コンソールウィンドウが起動されます。
3. relay.exe は、UnityEditor で DGSサーバーを起動した時のみ、起動されるプロセスになります。

<figure><img src="/files/RIuGaAadjq0138AyhhY5" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/bfxj2oqrRnSiFaowreyA" alt="" width="375"><figcaption></figcaption></figure>

### DGS サーバープロセスを起動する

DGS サーバーのプロセスのビルド手順

1. Diarkis Plugin Sample/Sample/Scenes から DiarkisSampleScene を選択してください。
2. DiarkisSampleScene の DiarkisNetworkManager から、`Pre Stored Http Host` に  Diarkis Http サーバーの `アドレス:ポート` を指定してください。
3. DiarkisSampleScene の SceneManager から、Editor `DGS Clound Env` に DGS サーバーを起動する PC の `アドレス` (ポート番号は不要) を指定してください。Diarkis サーバーと DGS サーバー を同じ PC で起動する場合は、同じ アドレスを指定してください。
4. `BuildSettings` の `Scenes In Build` で、DGSSSampleScene と DiarkisSample\_HostClientGameDemo\_2\_InGame を選択します。
5. Platform リストから Dedicated Server を 選択して、Switch Platform ボタンを押下します。
6. `Build` ボタンを押下して、Dedicated Server の ヘッドレスの Standalone バイナリーをビルドします。

<mark style="color:red;">※以下の参考画像では、 Diarkis サーバーを ローカルホスト (127.0.0.1)で起動している場合の設定になります。</mark>

#### DGS  サーバープロセスの実行手順

&#x20;以下のように、引数を指定して起動してください。

```powershell
{app} {logFile} {meshFile} {DGS Endpoint} {DGS Port} {DGS Cloud Env}

例
> .\UnityDiarkis_Sample.exe .\log.json .\mesh.json 0.0.0.0 7400 127.0.0.1
```

* logFile : log の config ファイルの log.json パスを指定します。
* meshFile : mesh サーバーの config ファイルの mesh.json パスを指定します。
* DGS Endpoint : DGS サーバーの IP を指定します。
* DGS port : DGS サーバーの Port を指定します。 DGS サーバーを複数起動する場合は、7401, 7402 など 7400 番台以降を指定します。複数起動する際に、同じ Port 番号を指定すると正しく動作しないため予めご留意ください。
* DGS Cloud Env :  起動する DGS サーバーの ローカルアドレスを指定してください。

mesh.json の例

<pre class="language-json"><code class="lang-json"><strong>{
</strong><strong> "marsAddress": "127.0.0.1",
</strong><strong> "marsPort": "6779"
</strong><strong>}
</strong></code></pre>

* address, marsAddress には、Diarkis サーバーの ローカルIP を指定します。

log.json の例

```json
{

  "level": "sys",
   "levels": {
    "ROOM": "verbose",
    "_FIELD": "verbose",
    "_UDP": "network"
  },
  "timeZone": "local",
  "color": true,
  "flat": false,
  "filePath": "./diarkis.test.log",
  "unsafeLogging": true
}
```

* DSGサーバー プロセス実行時の Diarkis サーバー側のログを設定するためのファイルになります。

実行すると以下のようなコンソールが起動します。DGS サーバープロセスのログをご確認頂けます。

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

DGS サーバープロセスを終了する時は、コンソールで Ctrl + c で終了し、コンソールウィンドウを閉じてください。

### DGS クライアントプロセスを起動する

DGS クライアントプロセスのビルド手順

1. Diarkis Plugin Sample/Sample/Scenes から DiarkisSample\_HostClientGameDemo\_1\_Menu を選択してください。
2. DiarkisSampleScene の DiarkisNetworkManager から、`Pre Stored Http Host` に  Diarkis Http サーバーの `アドレス:ポート` を指定してください
3. `BuildSettings` の `Scenes In Build` で、DiarkisSample\_HostClientGameDemo\_1\_Menu と DiarkisSample\_HostClientGameDemo\_2\_InGame を選択します。
4. Platform リストから Windows を 選択して、Windows が有効になっていなかったら`Switch Platform` ボタンを押下します。
5. `Build` ボタンを押下して、Windows の Standalone バイナリーをビルドします。

<mark style="color:red;">※以下の参考画像では、 Diarkis サーバーを ローカルホスト (127.0.0.1)で起動している場合の設定になります。</mark>

<figure><img src="/files/oTcsjR2o6triGZmfbeW4" alt="" width="563"><figcaption></figcaption></figure>

<figure><img src="/files/k5OhVaf6HOxijM7WvZxm" alt="" width="563"><figcaption></figcaption></figure>

DGS クライアントプロセスの実行手順

1. ビルドした DGS クライアントプロセスを 2つ 起動します。
   1. MinMembers : `2` &#x20;
   2. MaxMembers : `4`
   3. Connection Mode: `SingleAuthority`
   4. Network Type: `DGS`&#x20;
2. パラメータの意味
   1. MinMembers は、設定した人数が集まったら DGS サーバーに接続
   2. MaxMembers は、Room に入れる最大数

<div align="center" data-full-width="true"><figure><img src="/files/4F8OZ4WAho5EHLTWdext" alt="" width="563"><figcaption></figcaption></figure></div>

1. Create / Join Game Instance ボタンを押下して、DGSサーバーと接続が成功すると、以下のような画面になります。

<figure><img src="/files/LHedpKnc6YsTls6fto9u" alt="" width="563"><figcaption></figcaption></figure>

HostClientGameApp.cs の StartGameInstanceProcessCoroutine()

DiarkisSample\_HostClientGameDemo のサンプルを DGS モードで動かした場合、

1. クライアントA が、 MaxMembers=4 を指定して StartGameInstance を呼び出します。
2. MaxMembers 分 他のクライアントB,C,D が、StartGameInstance が呼び出した後に、
3. クライアントA,B,C,D の IsGameInstanceStarted() = true になります。

現状 HostClientGameApp.cs のコードで、各クライアント が StartGameInstance を呼び出してから 20秒間に MaxMembers 分 他のクライアントが StartGameInstance を呼ばないとタイムアウトになってしまいますのでご注意ください。タイムアウトになったクライアントは DGS サーバーとの接続に失敗します。必要に応じて こちらのタイムアウト時間を変更してください。

```csharp

  // ConnectionManager を作成しゲームインスタンスの開始リクエストを送信します。
  // Authoritative Network の機能は ConnectionManager を使用してアクセスするため、ここ以降 DiarkisInterface の機能は基本的には使用しません。
  var connection = DiarkisNetworkManager.GetConnectionManager(gameModeName_);
  if (!connection.IsGameInstanceStarted())
  {
     uid_ = DiarkisNetworkManager.GetDiarkisInterface(gameModeName_).UID;
     connection.StartGameInstance(gameConfig_);
     // クライアント間の直接通信(メッシュ接続)を許可します
     // この設定を有効にすることで Host-Client 型の API だけでなく SendUnicast/Multicast/Broadcast を使用する事が出来るようになります。
     DiarkisAsyncResult res = new DiarkisAsyncResult();
​
     // タイムアウトを20秒で設定。DGS モードの時は 20秒以内に 他のクライアントも GameInstanceStart する必要があるので注意してください。
     // 必要に応じて調整する必要があります。
     yield return DiarkisAsync.WaitFor(() =>
     {
        return connection.IsGameInstanceStarted();
     }, res, 20000);
     gameInstanceStarted_ = connection.IsGameInstanceStarted();
     if (res.completed == false)
     {
        Debug.Log("Game instance start sequence: Time Out");
        yield break;
     }
  }
  Debug.Log("Game instance start sequence: Success");
  connection.AllowSendDataBetweenClients(true);
```


---

# 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-modules/csar/how-to-develop-dgs.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.
