Diarkis Plugin Sample
DiarkisPluginSample の確認手順
目次
サンプル概要
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, PS4, PS5, Xbox Series X|S です。
UE 5.6.1 で確認。
確認手順
Windowsの確認手順
DiarkisPluginSample.uproject の右クリックコンテキストメニューから「Visual Studio プロジェクトファイルの生成」を選択する。
Visual Studio で DiarkisPluginSample.sln を開く。
ビルド&実行
Windowsで実行する: VisualStudio で
DebugGame_Editor
とWin64
を選択し、ビルドと実行を行う。
選択ビューポート
UE5Editorを起動し、ツールバーの
Play
ボタンをクリックします。Selected Viewport
とMultiplayer Option
でNumber of Players: 1
を選択します。image
各画面の説明
ログイン 画面
起動後、以下のログインメニューが最初に表示されます。
image 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 画面
ログイン後、以下のメインメニューが表示されます。
image サンプルタイプを選びます。
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 画面に遷移します。
Disconnect : Diarkis から切断してログインメニューに戻ります。
Room 画面
MainMenu 画面の Room ボタンをクリックすると、Room の作成や参加が行える Room 画面に遷移します。
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 を新規作成します。
Room InGame 画面
Room 画面でボタンをクリックすると、Room InGame 画面に遷移し、キャラクターの位置が同期されます。
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通信が開始されます。
Field 画面
MainMenu 画面の Field ボタンをクリックすると、Field 画面に遷移します。
Field は Join や Create のような事前コマンドを必要しません。
Field は1つのサーバタイプに1つしか存在せず、ユーザーは一度に1つの位置にしか存在できません。
Grid Size
Field のサイズ。全体の Field のサイズとそれを分割する Grid のサイズが変更されます。
10000
Server Count
メッシュネットワーク内の Diarkis サーバーの数は、Field を分割する Grid の数に影響します。
4
FOV Halfwidth
視界の範囲。視界の範囲に入るリモートキャラクターが同期されます。
1800
Main Menu
MainMenu 画面に戻ります。

MatchMaker Host/Search 画面
※ この一連のサンプルを実行するには、マッチメイキング用の Diarkis サーバとは別に、TURN というサーバタイプ名で起動している Diarkis サーバが必要です。 環境変数
DIARKIS_SERVER_TYPE
に TURN を設定し、Diarkis サーバを立ち上げてください。MainMenu 画面の MatchMaker ボタンをクリックすると、MatchMaker 画面に遷移し、MatchMakerでマッチングした相手とInGame(Room)に参加することができます。
Matching Type :
Rank :
1-5、6-10、11-15、16-20、...のランクのユーザー同士でマッチングされます。
Tag : マッチング用のタグ(文字列)。同じタグ同士がマッチングするようになります。
Max Players : 作成する 部屋 の最大人数。この機能はホストに対してのみ有効です。
Room Name : 作成する 部屋 の名前(文字列)。この機能はホストに対してのみ有効です。
Pass : 作成する 部屋 にロックを掛けたい時に指定するパスワード。この機能はホストに対してのみ有効です。
Host ボタン: マッチング用の 部屋 を作成する場合は、このボタンをクリックします。
Search ボタン: 既に作成されている 部屋 を検索します。検索が成功すると、Search Matching に部屋のリストが表示されます。
OwnUID : あなたのUIDが表示されます。
Main Menuボタン : メインメニューに戻ります。
Search Matching :
Room Lists: 検索して条件にあった部屋があった場合、入室できる 部屋 が表示されます。
Join ボタン : 入室したい部屋を選択して、Join ボタンで 部屋 に入室します。部屋が既に一杯の場合や、すでにサーバーから部屋が消えている場合など入室に失敗する場合があります。
Disband ボタン : 部屋を解散します。この機能はホストのみ有効です。
Room MemberLists : 部屋に入室しているメンバーの UID リストを表示します。
RoomID : 入室している部屋の Room ID が表示されます。
Leave ボタン : 入室している部屋から退出します。
Kick ボタン : 入室しているメンバーを部屋から Kick します。この機能はホストのみ有効です。
In Game ボタン : 部屋に居るメンバーと InGame に移動します。この機能はホストのみ有効です。
Sync
Sync ボタン : SendMessage に入力されたメッセージがマッチングしたメンバーに送信されます。
Send Message : 送信するメッセージを入力します。
Recv Message : 受信したメッセージが表示されます。
MatchMaker Host/Search InGame 画面
MatchMaker Host/Search 画面の InGame ボタンをクリックすると、InGame 画面に遷移します。
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 ボタンをクリックすると、Lobby 画面に遷移します。
RoomID (Tag) : マッチメイキングのための Room ID が表示されます。
Lobby Member UID : ロビーにいるユーザーのユーザーIDが表示されます。
Start ボタン : Ticket によるマッチメイキングを開始します。
Main Menu ボタン : MainMenu 画面に戻ります。
マッチメイキングが完了すると以下の画面が表示されます。
マッチメイキングした2人のユーザーIDが表示されます。
Lobby ボタン : Lobby 画面に戻ります。
DirectMessage 画面
MainMenu 画面の DirectMessage ボタンをクリックすると、DirectMessage 画面に遷移します。
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 画面に遷移します。
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 画面に遷移します。
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 画面に戻ります。
動作確認(マルチプレーオプション)
UEEditorを起動したら、ツールバーの
Play
ボタンを押します。Standalone Game
を選択します。「Multiplayer Option」 で
Number of Players: 2 ~ 4
を選択します。ネットモード
Net Mode
でスタンドアロンプレイ(Play Standalone)
を選択する。image
複数のWindowが表示されるので、ゲームの
Start
ボタンを押す。UIDが同じでないことを確認してください。そうしないと意図しない動作が起こります。
複数人でプレイする場合、PCのスペックによってはキャラクターの同期に時間がかかる場合があります。
以下の手順は、選択したビューポートの場合と同じです。
image
コードについて
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/ThirdParty/libDiarkis/prebuilt
各ライブラリのファイル
win-x64 で使用されるライブラリ
(win-x64\lib_static)
macos-x64 で使用されるライブラリ
(macos-x64\lib_static)
android で使用されるライブラリ
(android\lib_static)
ios で使用されるライブラリ
(iOS\lib_static)
switch で使用されるライブラリ
(nx64\lib_static)
ps4 で使用されるライブラリ
(ps4\lib_staic)
ps5 で使用されるライブラリ
(ps5\lib_staic)
ビルドの種類
Debug :
Debug ビルド
xDiarkis ログ出力 有り
Develop :
Release ビルド
xDiarkis ログ出力 有り
Release :
Release ビルド
xDiarkis ログ出力 無し
diarkis-module Client のコードについて
役割の概要
Diarkisライブラリを制御するインターフェースの親クラス
コードの場所
DiarkisPluginSample/Plugins/Diarkis/Source/Diarkis/Client
各クラス
DiarkisInterfaceBase.h / DiarkisInterfaceBase.cpp
: UEからDiarkisを制御するためのインターフェースクラス(libDiarkis を制御)DiarkisRoomBase.h / DiarkisRoomBase.cpp
: ルーム機能の親クラス(libDiarkis を制御)DiarkisGroupBase.h / DiarkisGroupBase.cpp
: グループ機能の親クラス (libDiarkis を制御)DiarkisFieldBase.h / DiarkisFieldBase.cpp
: フィールド機能の親クラス(libDiarkis を制御)DiarkisTcpBase.h / DiarkisTcpBase.cpp
: TCP 機能の親クラス (libDiarkis を制御)DiarkisUdpBase.h / DiarkisUdpBase.cpp
: UDP 機能の親クラス(libDiarkis を制御)DiarkisP2PBase.h / DiarkisP2PBase.cpp
: P2P 機能の親クラス(libDiarkis を制御)DiarkisMatchMakerBase.h / DiarkisMatchMakerBase.cpp
: MatchMaker 機能の親クラス(libDiarkis を制御)DiarkisRPCBase.h / DiarkisRPCBase.cpp
: RPC 機能の親クラス(libDiarkis を制御)
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 の Group のコールバックイベントをキューに入れるクラスDiarkisP2PDelegate.h
: Diarkisの P2P のコールバックイベントをキューに入れるクラスDiarkisMatchMakerDelegate.h
: Diarkis の MatchMaker のコールバックイベントをキューに入れるクラス
クラス図
Diarkisプラグインのクラス図
イメージ Diarkis Pluginをカスタマイズするには
Diarkisライブラリを制御するインターフェースクラス(図の上段赤枠)から派生したクラスを用意し、その処理をカスタマイズする。
ADiarkisPluginSample
を参考にカスタマイズしてください。
キャラクター同期に関連するクラス図
image 同期方法をカスタマイズする
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 image
体力同期
ThirdPersonCharacter
の変数Health
はレプリケーションによって同期されます。ThirdPersonCharacter
の所有者であるホストで被弾時にHealth
が減少すると、自動的にリモート側のThirdPersonCharacter
のHealth
変数に同期される。また、Recovery
ボタンによってHealth
が回復すると、その変化は自動的にリモート側のThirdPersonCharacter
に反映される。
動作確認環境
対応プラットフォーム
Windows 10/11
Mac OS X
Android
iOS
Switch
PS4 / PS5
Xbox Series X|S
UnrealEngine バージョン
5.6.1
UE の バージョン毎の確認環境
UE 5.6.1
VisualStudio 2022
WindowsSDK バージョン 10.0.22621.0
MSVC 14.38.33130
PS5 環境
UE5 ベースコード
5.6.1 リリース タグ
PS5 SDK バージョン 11.00.00.46
Xbox Series X|S 環境
UE5 ベースコード
5.6.1 リリース タグ
GDK: 250402
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
UE 5.3.2
VisualStudio 2022
WindowsSDK バージョン 10.0.19041.0
Android 環境
android-studio-2020.3.1.22-windows.exe
Android NDK 22.1.7171670
Android 6.0 (APIレベル23)
Mac/iOS 環境
XCode 13.3
UE 5.0.2
PS4 環境
UE5 ベースコード
5.0.2 リリース タグ
PS4 SDK バージョン 9.508.001
PS4システムソフトウェア 9.600.011
PS5 環境
UE5ベースコード
5.0.2 リリース タグ
PS5 SDK バージョン 5.000.00.41
PS5システムソフトウェア 5.50.00.08
Xbox Series X|S 環境
UE5ベースコード
5.0.2 リリース タグ
GDK: 211001 2021年10月アップデート 1
動作確認手順
Windows のパッケージ作成手順
Platform
メニュー =>Windows
=>Package Project
を選択する。パッケージの出力先フォルダを指定する。
ビルドに成功したら、出力先に指定したフォルダから DiarkisPluginSample.exe を起動する。
Android 端末で動作確認手順(別途AndroidStudio環境のセットアップが必要)
UnrealEditorのタスクバーから、
設定
⇒プロジェクト設定
をクリックします。Platformの項目で、
Android
をクリックします。image
APKパッケージ
Androidパッケージ
最小SDKバージョン
ターゲットSDKバージョン
ビルド
armv7サポートのチェックを外す(armv7は順次サポートされます)
arm64のサポートをチェックする
Platformの項目で 「Android SDK 」にチェックを入れる
image
以上の各項目を環境に合わせて設定してください。
Android dev kitデバイスを接続し、Androidプラットフォーム用にプロジェクトをパッケージ化する。
image コマンドプロンプトで 「adb start-server 」コマンドを使ってadbサーバーを実行する。
image Androidプロジェクトの出力ディレクトリにあるインストールファイルをダブルクリックします。
インストールが完了すると、開発キットのアプリ一覧の最後のページにアプリが表示されます。
アプリを起動すると、最終的にメインメニューが表示されます。
最終更新
役に立ちましたか?