RPC詳説
Preview
Fusion Unreal SDK 3.0.0は開発版として提供されており、リリース済みで運用中のゲームでの使用は想定していません。プレビュー段階では、重大なバグやAPIに破壊的変更が加わる可能性があります。
カスタムRPCノード
クイックスタートガイドでも述べた通り、プロジェクトにRPCを追加するには、Fusionノードを使用するのが推奨の方法です。
イベントグラフを右クリックして、Custom Fusion RPCを作成しましょう。
送信オプション
Send To All Clients
- 最も一般的なオプションです。ルームに接続しているすべてのクライアント上でイベントの実行を試みます。
Send To Owner
- アクタの現在の所有者に対してイベントの実行を試みます。コンポーネントは、アクタは誰が所有権を持っているのかを確認します。
Send To Master Client
- マスタークライアント上でイベントの実行を試みます。マップ変更のリクエストなどに便利で、アクティブなマップ変更の権限をマスタークライアントのみに持たせることができます。
マスタークライアントはルーム内で変更される可能性があるため、特定のクライアントを確実に対象にする方法としては使用できません。
Send To Everyone Else
- "自身"を除くすべてのクライアント上でイベントの実行を試みます。
Default Unreal Function Node
Fusionは既存プロジェクトの互換性を維持するため、通常のビルトインのレプリケーションイベントの実行もサポートします。
- カスタムイベントを作成し、
ReplicatesをMulticastに設定します。 - カスタムイベントを作成し、
Replicatesをrun on Serverに設定します。 - 何らかの方法で
Run on Server関数を呼び出します。Fusionにはサーバーの定義はありませんが、Unreal Engineではサーバー権限を持つ関数スコープからマルチキャストRPCを実行する必要があります。
C++
FusionはCustom Fusion RPCノードを使用して、C++ とブループリントで同じ機能をサポートします。
以下は、最小限の例です。
c++
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "Macros.h"
#include "DemoCharacter.fusion.h"
#include "DemoCharacter.generated.h"
UCLASS()
class PHOTONFUSIONUNREAL_API ADemoCharacter : public ACharacter
{
GENERATED_BODY()
FUSION_BODY();
public:
// このキャラクターのプロパティにデフォルト値を設定する
ADemoCharacter(const FObjectInitializer& ObjectInitializer);
protected:
// ゲーム開始時またはスポーン時に呼び出される
virtual void BeginPlay() override;
public:
// 毎フレーム呼び出される
virtual void Tick(float DeltaTime) override;
SEND_FUSIONRPC(TargetObjectOwner)
void MyRPCTest(int& first, float second, FString& third, struct FMyCustomStruct& fourth);
void MyRPCTest_Receive(int& first, float second, FString& third, struct FMyCustomStruct& fourth);
};
- 生成されるコードが置かれるヘッダー
(headername).fusion.hを定義します。 GENERATED_BODY()以下に、FUSION_BODY()Fusionマクロを定義します。SEND_FUSIONRPC("target")Fusion RPCマクロを定義します。- 呼び出し可能な実際の関数を定義します。この関数はヘッダーツールが自動生成するので実装はしないでください。
- 同名の受信関数を定義します。名前が
_Receive接尾辞で終わり、引数が呼び出し関数と一致することが重要です。 - 受信関数を実装します。
c++
#include "DemoCharacter.h"
#include "FusionOnlineSubsystem.h"
#include "MyCustomStruct.h"
ADemoCharacter::ADemoCharacter(const FObjectInitializer& ObjectInitializer)
{
PrimaryActorTick.bCanEverTick = true;
}
// ゲーム開始時またはスポーン時に呼び出される
void ADemoCharacter::BeginPlay()
{
Super::BeginPlay();
}
// 毎フレーム呼び出される
void ADemoCharacter::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
void ADemoCharacter::MyRPCTest_Receive(int& first, float second, FString& third, FMyCustomStruct& fourth)
{
UE_LOG(LogTemp, Warning, TEXT("First: %d Second: %f third: %s fourth.bool: %d fourth.inner.int: %d"), first, second, *third, fourth.SomeBool, fourth.SomeStruct.SomeInt);
}
送信オプション
ブループリントノードと同様に、C++ 関数でも以下のオプションを定義できます。これらは、前述した同じ機能に対応します。
- TargetAllClients
- TargetObjectOwner
- TargetMasterClient
- TargetEveryoneElse
グローバルRPCの送信
ローカルステートや現在ロードされているマップに関係なく、接続中のすべてのクライアントに対してイベントを送信したい場合があります。
これを行うには、ブループリントイベントを定義するか、前述のようにGameInstance上にC++ で実装します。
FusionではGameInstanceはグローバルオブジェクトとして同期していて、Room内に存在する限りは常に有効です。