UObjectクラスのレプリケーションについて

現在、C++でマルチプレイヤーゲームを作成しています。
Actorが持つUObjectをレプリケーションの対象にする際ReplicateSubobjectsを使うことでサーバーの情報と同期させることはできたのですが、UObjectにはReplicateSubobjects関数が用意されていないためUObjectにUObjectを持たせた際にうまく情報を同期させることができませんでした。

具体的には、ボードゲームのようにダイスを複数個振って行動していくゲームを制作しています。
ダイスの面には移動や攻撃などの種類があり、アイテムなどによって面に書かれた数字が成長していきます。
これを実現するためのクラス設計は大まかに以下のようになっています。

・DiceFace(UObject)…ダイスの面に書かれた情報(移動や攻撃)を管理するクラス
・Dice(UObject)…DiceFaceを複数個持ち、1つのダイスとしての処理を行うクラス
・DiceManager(UObject)…Diceクラスを複数個管理するクラス

Diceクラスには乱数によって選ばれた面の情報を返却するなどの処理を持たせ、見た目などの処理を持たせていません。これは内部的に結果を決めた後、ダイスを振ったように見せる演出を別クラスで作るためこのように設計しました。(その方が融通が利くと判断したため)

UObjectが持つUObjectのレプリケーションはどのような処理で行うのか、
それができない場合はどのような設計が望ましいのか、
ご教示いただけますと幸いです。

使用されているエンジンバージョンが UE5.1 以降でしたら、
AActor::AddReplicatedSubObject を利用する事で可能です。

管理オブジェクトである DiceManager は Actor を Outer として生成、
以降のオブジェクトは DiceManager の Outer(Actor)を取得し、
AddReplicatedSubObject で登録する流れです。

ATest::ATest()
{
	bReplicateUsingRegisteredSubObjectList = true;
}

void ATest::BeginPlay()
{
	if (HasAuthority())
	{
		DiceManager = NewObject<UDiceManager>(this);
		AddReplicatedSubObject(DiceManager);
		DiceManager->Init();
	}
}

void UDiceManager::Init()
{
	AActor* Outer = Cast<AActor>(GetOuter());
	if (IsValid(Outer) && Outer->HasAuthority())
	{
		Dice = NewObject<UDice>(Outer);
		Outer->AddReplicatedSubObject(Dice);
	}
}

https://docs.unrealengine.com/5.1/ja/replicated-subobjects-in-unreal-engine/#登録済みサブオブジェクトリストの概要
詳しくはこちらをご参照ください。

また、利用できない場合ですが、
ゲーム進行に関わる管理は AGameState で管理するのが一般的かと思います。
別案として DiceManager をアクター化するのも一つの手かと思います。

確認したところ問題なく動作しました!

マルチプレイヤーの資料が少なくて苦戦していたのですが、
この関数があれば設計の自由度がかなり上がりそうです!
ご教示いただきありがとうございました!

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.