HowToReplicatePosition.md
最終更新
役に立ちましたか?
最終更新
役に立ちましたか?
ここでは、Diarkis プラグインを使って GameObject の位置を同期させる方法を説明します。
まず、新しい Unity プロジェクトを作成します。 次に、Unity Package Manager 経由で Diarkis Sample Package をインポートします(詳細は Readme を参照してください)。 最後に、シーンに 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
から)。 すべての手順が正しく行われていれば、シーンの構造は次のようになります。
ここで、RoomManager オブジェクトに、どのプレイヤープレファブをどこにスポーンするかを設定する必要があります。 まず、Packages>Diarkis Plugin Sample>Prefabs>MainGame>Player
からプレハブをコピーし、アセットフォルダ内の Assets>Prefabs
のようにコピーします。例えば、メッシュ、スケルトン、アニメーション、コード(クラスが DiarkisSynchronizedCharacter
を継承している限り)は開発者が作り直すことができます。 リジッドボディ・アニメーター・カメラとユーザー入力ハンドラを含む完全なサンプルスクリプトは Packages>Diarkis Plugin Sample>Scripts>Sample>MainGame>DiarkiSampleSynchronizedCharacter
にあります。Diarkis Playerプレハブはデフォルトでこのスクリプトを使用していますが、スクリプトが継承する関数 GetLocalFrameDataPayload
と EnqueueRemoteFrameData
を実装していれば、開発者が独自の実装を作成することも可能です。
DiarkisSynchronizedPlayer
クラスと同様に、 Diarkis Room モジュールの同期オブジェクトを簡単に作成するために継承できるDiarkisRoomObject
クラスがあります。基本的なルームオブジェクトの実装例が Packages>Diarkis Plugin Sample>Scripts>Sample>MainGame>DiarkiSampleRoomObject
にあります。このクラスは、2つの形(球体か立方体)とランダムな色を持つ単純なオブジェクトの作り方を示しています。開発者は、UpdateProperties
関数とGetObjectProperties
関数をオーバーライドすることで、同じようなクラスを再作成し、独自のオブジェクトプロパティを実装することができます。オブジェクトのプロパティ Object Properties
は Dictionary<string, double>
型であります。 SetWaitForSyncPush(true)
を呼び出すと、次に RoomObjectSync Push
を呼び出したときにプロパティが送信されます。
あとは RoomManager Inspector
の Instance Handler
Parameter に Player
プレハブ、RoomObject
プレハブ、SpawnPosition
を追加するだけです。
いくつかの設定はインスペクタで変更でき、キャラクターの動きをどのように同期させるかを決めることができます。 以下はそれぞれの説明です:
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秒ごとに送信されます。
これでシーンはキャラクタを複製し、リモート接続されたプレイヤーを表示する準備ができました。