DemoNetDriver を使用して、
リプレイシステムを作成します。
C++コードのゲームインスタンス作成( MyGameInstanceCPP )
レベルエディターのメニューバーから Tool -> New C++ Class を選択します。
親クラスは GameInstance を選択します。
MyGameInstanceCPP と名付けてクラスを作成します。
リプレイメソッド追加
ソースコードを追加する前にまず最初にビルドしてエラーが出ない事を確認して下さい。
IDEの不具合なのか分かりませんが、UnrealEditorから新しいCPPモジュールを追加した直後は何をしてもビルドエラーになる事があります。
その場合は一度IDEのソリューションを閉じて、ソリューションを開き直して下さい。
MyGameInstanceCPP.h を開き、 クラス内にコンストラクタとレコード用変数とメソッドを追加します。
MyGameInstanceCPP.h
public:
UMyGameInstanceCPP();
UPROPERTY(EditDefaultsOnly, Category = "Replays")
FString RecordingName;
UPROPERTY(EditDefaultsOnly, Category = "Replays")
FString FriendlyRecordingName;
UFUNCTION(BlueprintCallable, Category = "Replays")
void StartRecroding();
UFUNCTION(BlueprintCallable, Category = "Replays")
void StopRecroding();
UFUNCTION(BlueprintCallable, Category = "Replays")
void StartReplay();
ソースコード上の UMyGameInstanceCPP() を右クリックし、 「Quick Actions and Refactorings」 を選択します。
「Create definition of 'UMyGameInstanceCPP' in MyGameInstanceCPP.cpp」 を選択します。
MyGameInstanceCPP.cpp に UMyGameInstanceCPP()メソッドが追加されます。
同様の手順で、 StartRecroding() と StopRecroding() と StartReplay() に対しても行いメソッドを作成します。
各メソッドにリプレイ処理を追加します。
MyGameInstanceCPP.h
UMyGameInstanceCPP::UMyGameInstanceCPP()
{
RecordingName = "MyReplay";
FriendlyRecordingName = "MyRep";
}
void UMyGameInstanceCPP::StartRecroding()
{
TArray<FString> URLOptions;
URLOptions.Add("ReplayStreamerOverride=LocalFileNetworkReplayStreaming");
StartRecordingReplay(RecordingName, FriendlyRecordingName, URLOptions);
}
void UMyGameInstanceCPP::StopRecroding()
{
StopRecordingReplay();
}
void UMyGameInstanceCPP::StartReplay()
{
PlayReplay(RecordingName, nullptr);
}
メソッドに処理を追加したらビルドします。
ブループリントへ組み込む
UnrealEditorを起動しProjectSettingsを開き、 Project -> Maps&Modes -> GameInstanceClass に MyGameInstanceCPP を設定します。
BP_FirstPersonCharacter を開き、 Event BeginPlayで ゲームインスタンスを取得する処理を追加します。
キーボードイベントを追加し、 各レコード処理を追加します。
BP_FirstPersonProjectile を開き、
ReplicateMovemnetにチェックを入れます。
Replicateにチェックを入れます。
動的にスポーンするオブジェクトは、レプリケートされたオブジェクトだけがリプレイされます(マルチプレイでクライアント側から見えなくなるようなオブジェクトはレプリケートする必要があります)。
動作確認し、リプレイ動作を確認します。
尚、リプレイデータファイルは [ProjectFile]/Saved/Demos フォルダに保存されます。
リプレイ中に自分の腕が見えない問題
BP_FirstPersonCharacter の FirstPersonMeshコンポーネントは OnlyOwnerSee が有効になっている為、リプレイ中にオーナーじゃなくなった時に見えなくなります。
BP_FirstPersonCharacter の FirstPersonMeshコンポーネントは OnlyOwnerSee を無効にする事でリプレイ中にも腕が見えるようになります。
ただしこの対応では、実際のゲーム中に第三者視点になった時にも自分の腕が見えてしまいます。