# HowToReplicatePosition.md

ここでは、Diarkis プラグインを使って GameObject の位置を同期させる方法を説明します。

## プロジェクトのセットアップ

まず、新しい Unity プロジェクトを作成します。\
次に、Unity Package Manager 経由で Diarkis Sample Package をインポートします（詳細は [Readme](/diarkis-client/samples/unity/field-walker.md) を参照してください）。\
最後に、シーンに `DiarkisNetworkManager` オブジェクトを追加し、 Diarkis Server への接続情報を設定します。\
これでセットアップは完了です。

## アセットを追加する

キャラクタを同期させる方法を確認するために、標準的な Unity アセットを使用した同期プロセスを説明します。\
まず、新しい空のシーンを作成し、マップ、ネットワークロジック、制御可能なキャラクターを作成するために、以下の手順に従ってください。\
それでは、いくつかの要素を追加しましょう：

* キーボード入力を処理するために InputSystem プレハブを追加します（`Packages>Diarkis Plugin Sample>Prefabs>Common>InputSystem` から）。
* MainCamera オブジェクトを `Packages>Diarkis Plugin Sample>Prefabs>CommonMainCamera` の MainCamera で置き換えます。
* `SpawnPosition` という空のオブジェクトを作成し、プレイヤーをスポーンさせたい場所を設定します。
* `DiarkisNetworkManager`オブジェクトを追加し（`Packages>Diarkis Plugin Sample>Prefabs>Common>NetworkManager` から）、Diarkisサーバーの設定に合わせて設定します（例：Http Host: 192.168.100.12:7000、Auto Start Connect: true）。
* `RoomManager`プレハブを追加します（`Packages>Diarkis Plugin Sample>Prefabs>SceneManagers>RoomManager` から）。\
  すべての手順が正しく行われていれば、シーンの構造は次のようになります。

![Sceneコピー](/files/FnsFu4tGLeDb69ur68WH)

ここで、RoomManager オブジェクトに、どのプレイヤープレファブをどこにスポーンするかを設定する必要があります。\
まず、`Packages>Diarkis Plugin Sample>Prefabs>MainGame>Player` からプレハブをコピーし、アセットフォルダ内の `Assets>Prefabs` のようにコピーします。例えば、メッシュ、スケルトン、アニメーション、コード（クラスが `DiarkisSynchronizedCharacter` を継承している限り）は開発者が作り直すことができます。\
リジッドボディ・アニメーター・カメラとユーザー入力ハンドラを含む完全なサンプルスクリプトは `Packages>Diarkis Plugin Sample>Scripts>Sample>MainGame>DiarkiSampleSynchronizedCharacter` にあります。Diarkis Playerプレハブはデフォルトでこのスクリプトを使用していますが、スクリプトが継承する関数 `GetLocalFrameDataPayload` と `EnqueueRemoteFrameData` を実装していれば、開発者が独自の実装を作成することも可能です。

![Sceneコピー](/files/4o4iAkhMZNG8PVNWlef0)

`DiarkisSynchronizedPlayer` クラスと同様に、 Diarkis Room モジュールの同期オブジェクトを簡単に作成するために継承できる`DiarkisRoomObject`クラスがあります。基本的なルームオブジェクトの実装例が `Packages>Diarkis Plugin Sample>Scripts>Sample>MainGame>DiarkiSampleRoomObject` にあります。このクラスは、2つの形（球体か立方体）とランダムな色を持つ単純なオブジェクトの作り方を示しています。開発者は、`UpdateProperties`関数と`GetObjectProperties`関数をオーバーライドすることで、同じようなクラスを再作成し、独自のオブジェクトプロパティを実装することができます。オブジェクトのプロパティ `Object Properties` は `Dictionary<string, double>` 型であります。`SetWaitForSyncPush(true)`を呼び出すと、次に `RoomObjectSync Push` を呼び出したときにプロパティが送信されます。

![Sceneコピー](/files/Qz5yTDeIa8qew4Rq3sdm)

あとは `RoomManager Inspector` の `Instance Handler` Parameter に `Player` プレハブ、`RoomObject` プレハブ、`SpawnPosition` を追加するだけです。

![Sceneコピー](/files/erZr8ZuCdUwxM1R7PmbV)

いくつかの設定はインスペクタで変更でき、キャラクターの動きをどのように同期させるかを決めることができます。\
以下はそれぞれの説明です：

* MaxRemoteQueueLength：リモートでキューに入れることができるペイロードの数（この数を50以上に保つことを推奨。）
* MaxFramePerPayload: 1つのペイロードが含むことができるフレーム数（最大時）、キャラクターが動いている場合、次に送信されるペイロードはこのフレーム数に達するまで待ってから送信される（または`Minimum Local Payload Send Frequency`の遅延の後に送信されます）
* MiniumLocalPayload Send Frequency : ペイロードを送信するための最小遅延（ペイロードの最後の送信からこの遅延に達した場合、最大フレーム値でペイロードが満たされるのを待たずに送信します）
* LocalFrameEnqueue Frequency（ローカル・フレーム・エンキュー頻度）：0に設定するとすべてのフレームが同期され、そうでなければこの値に基づいて遅延ごとに1フレームが同期されます。
* MaxRemoteInterpolation Duration In seconds: プレイヤーの動きを受け取ったときに許容される最大補間時間。
* MaxAllowedDelayInSeconds: 何らかの理由で古いリモートペイロードを受信した場合、自動的にスキップされます。

DeepL.com（無料版）で翻訳しました。

注：例えば、補間するローカルフレーム数が4で、ペイロードあたりの最大フレーム数が5である場合、各ペイロードは5\*5=25フレーム送信されることを意味するので、FPSが60であれば、60/25=\~0.42秒ごとに送信されます。

![Sceneコピー](/files/hyoVzcgJbj2OQvbqDaMn)

これでシーンはキャラクタを複製し、リモート接続されたプレイヤーを表示する準備ができました。

![Sceneコピー](/files/bNKMNV1EcQybbl5bKw0n)


---

# 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/unity/field-walker/howtoreplicateposition.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.
