オンライン ビーコン は、通常の Unreal Engine (UE) ネットワーク ゲーム接続にコミットせずに、クライアントとサーバーとの通信を実現する軽量メカニズムを提供します。オンライン ビーコンはアクタ クラスから派生し、ベースとなるフレームワークを提供します。派生クラスでフレームワークを拡張し、プロジェクト固有のインタラクションや情報リクエストを実行できるようにすることができます。オンライン ビーコンの一般的な使用例には、以下のようなものがあります。
-
接続 ping の計算。
-
ゲーム セッションのスポット予約。
-
ゲームに参加する前におけるゲーム セッションやロビーに関する情報のクエリ実行。
通常、アクタのレプリケーションとスポーンは、権限のあるサーバーが開始します。通常、サーバーが権限を持つため、クライアントはまずサーバーに接続して、サーバーが権限を持っているアクタのコピーを取得しなければなりません。オンライン ビーコンは、サーバーとの接触を開始するアクタを作成するシステムをクライアントに提供することで、クライアントが接続した直後にサーバー ビーコンが リモート プロシージャ コール (RPC) を呼び出すことができるように、デリゲートを発行することで異なる動作をします。
クラス構造
オンライン ビーコンのフレームワークは次のような構造になっています。
オンライン ビーコン
オンライン ビーコンは、AOnlineBeaconClient
と AOnlineBeaconHost
の両方の基本クラスです。オンライン ビーコン クライアントとオンライン ビーコン ホストは個別にオーバーライドできるため、通常はオンライン ビーコン自体をオーバーライドする必要はありません。
オンライン ビーコン クライアント
オンライン ビーコン クライアントは、クライアントの実装が派生する基本クラスです。これはオンライン ビーコン システムの主要な作業クラスです。
このクラスは、サーバーとの接続を開始する独自の UNetDriver
を持っています。オンライン ビーコン クライアント オブジェクトのクライアント コピーとサーバー コピー間の接続が確立されると、オブジェクトのレプリケーションは通常の UE レプリケーションのように動作します。サーバーとクライアントの両方が RPC を呼び出すことができ、サーバー バージョンのオンライン ビーコン クライアント オブジェクトが、プロパティのレプリケーションに対して権限を持ちます。
通常、クライアント ゲームプレイ コードでオンライン ビーコン クライアントを生成し、AOnlineBeaconClient::InitClient
関数を使ってサーバー上のオンライン ビーコン ホストに接続します。サーバーに、どのクライアント クラスを生成してクライアント マシンと通信すべきかを伝えるために、オンライン ビーコン ホスト オブジェクトのコンストラクタで、使用するオンライン ビーコン クライアント クラスを指定する必要があります。サーバーとクライアントの間で接続が確立されるとすぐに RPC を呼び出すように、AOnlineBeaconClient::OnConnected
関数をオーバーライドすることができます。また、AOnlineBeaconClient::OnFailure
関数をオーバーライドして個々に不具合の処理を行うこともできます。
オンライン ビーコン ホスト
オンライン ビーコン ホストは、クライアントからのすべてのビーコン接続を管理するためにホストが使用する基本クラスです。オンライン ビーコン ホストは、現在接続を要求しオンライン ビーコン ホストと通信しているオンライン ビーコン クライアントのタイプに基づいてトラフィックをルーティングするために、オンライン ビーコン ホスト オブジェクトのレジストリを管理します。
このクラスは、クライアントからの接続をリッスンする独自の UNetDriver を持っています。オンライン ビーコン ホストがリモート マシンのオンライン ビーコン クライアントから接続を受け取ると、ホストはオンライン ビーコン ホスト オブジェクト インスタンスのレジストリをスキャンし、どれが着信クライアントと一致するかを判定し、接続の管理をそのオンライン ビーコン ホスト オブジェクトに転送します。
通常、オンライン ビーコン ホストは、サーバーのゲームプレイ コード、たとえばゲーム モード クラスでスポーンします。
オンライン ビーコン ホスト オブジェクト
オンライン ビーコン ホスト オブジェクトは、オンライン ビーコン クライアントからのトラフィックを処理するホスト クラスの基本クラスです。
このクラスは、接続を開始したクライアント マシン上のオンライン ビーコン クライアントと一致するように、サーバー上で適切なオンライン ビーコン クライアントを生成します。オンライン ビーコン ホスト オブジェクトは、ClientBeaconActorClass
メンバー変数を使用して、スポーンするオンライン ビーコン クライアント クラスのアクタを決定します。
通常、オンライン ビーコン ホストをスポーンした後、サーバーのゲームプレイ コードでオンライン ビーコン ホスト オブジェクトをスポーンし、オンライン ビーコン ホスト オブジェクトをオンライン ビーコン ホストに登録します。オンライン ビーコン クライアントは、デリゲートが実行したオンライン ビーコン ホスト オブジェクトに接続し、AOnlineBeaconHostObject::OnClientConnected
関数を呼び出します。この関数の中で、クライアントとホスト間の通信を開始する RPC を呼び出すことができます。
エンジンの例
Unreal Engine では、ディレクトリ内のヘッダ ファイル TestBeaconClient.h
と TestBeaconHost.h
に小さなオンライン ビーコンの実装が用意されています:
..\Engine\Plugins\Online\OnlineSubsystemUtils\Source\OnlineSubsystemUtils\Classes\
実装は、ディレクトリ内の関連 .cpp
ファイルに格納されています。
..\Engine\Plugins\Online\OnlineSubsystemUtils\Source\OnlineSubsystemUtils\Private\
テスト ビーコンの実装は、サーバーとクライアントの間で RPC を繰り返し呼び出し、毎回短いログ メッセージを表示します。次のセクションでは、ゲームプレイ コードの中でテスト ビーコンをスポーンするために必要なことを説明します。
スポーン テスト ビーコン
プロジェクトで TestBeaconClient
クラスと TestBeaconHost
クラスを使用するには、以下の手順に従います。
-
サーバーのゲームプレイ コード内で、
ATestBeaconHost
をスポーンします。 -
クライアントのゲームプレイ コード内で、
ATestBeaconClient
をスポーンします。 -
クライアントゲームプレイコードで
ATestBeaconClient::InitClient(url)
を呼び出し、クライアントをサーバーに接続します。url
はサーバーのアドレスとポートを持つFURL
オブジェクトです。
[Begin Play (プレイ開始)] をクリックすると、ゲームプレイ コードがサーバー上にテスト ビーコン ホストを、各クライアント上にテスト ビーコン クライアントをスポーンします。次のセクションでは、テスト ビーコン間で自動的に発生するプロセス フローについて説明します。
テスト ビーコンの処理フロー
このセクションでは、ゲーム開始時にテスト ビーコンをスポーンした後の処理フローについて説明します。
-
まず、
ATestBeaconHost
コンストラクタがメンバー変数ClientBeaconActorClass
をクラスATestBeaconClient
に設定し、メンバー変数BeaconTypeName
をClientBeaconActorClass->GetName()
に設定します。これにより、オンライン ビーコン システムは、テスト ビーコン ホストとテスト ビーコン クライアント クラスをペアにして、サーバーが接続を開始するクライアント クラスにマッチする正しいクライアント クラスをスポーンします。 -
クライアントマシンの
ATestBeaconClient
オブジェクトがサーバーにコンタクトすると、サーバーのAOnlineBeaconHost
インスタンスは、登録されたATestBeaconHost
に自身のATestBeaconClient
を生成し、それをクライアント マシンのATestBeaconClient
に関連付けるよう指示します。これで、クライアント マシンにはテスト ビーコン クライアントが、サーバー マシンにはテスト ビーコン クライアントが存在することになります。さらに、ネットワーク接続により、クライアントとサーバーの RPC が 2 つのATestBeaconClient
インスタンス間で容易に情報を受け渡すことができます。 -
次に、サーバーの
ATestBeaconHost
がATestBeaconHost::OnClientConnected
を呼び出します。関数ATestBeaconHost::OnClientConnected
の中で、サーバーのテスト ビーコン クライアント インスタンス は、クライアント RPCClientPing
を呼び出して ping を開始します。 -
クライアント マシンの
ATestBeaconClient
インスタンスが RPC を受信し、ATestBeaconClient::ClientPing_Implementation
を実行すると、クライアントのテスト ビーコン クライアントはまずLogBeacon: Ping
をクライアント ログに出力し、次にサーバー RPC のServerPong
を呼び出します。 -
最後に、サーバーマシンの
ATestBeaconClient
インスタンスが RPC を受信し、ATestBeaconClient::ServerPong_Validate
関数を実行すると、サーバーはプログラムがシッピング構成で実行されていないことを検証します。検証が成功した後にATestBeaconClient::ServerPong_Implementation
が実行されます。関数ATestBeaconClient::ServerPong_Implementation
の中で、サーバーのビーコン クライアントはまずLogBeacon: Pong
をサーバー ログに出力し、次にクライアント RPC のClientPing
を呼び出します。このClientPing
の呼び出しによって、前の箇条書きとこの箇条書きが繰り返されます。
このプロセスは無限に続きます。プロジェクトのニーズに合わせてどのようにでも拡張できるオンライン ビーコンの実装の例です。
一往復で処理を止めたい場合は、ATestBeaconClient::ServerPong_Implementation
の中の ClientPing
を削除します。
このエンジンの例に加え、このドキュメントのページにはオンライン ビーコンの実装手順ガイドが記載されています。以下の「オンライン ビーコンの実装」セクションを参照してください。
エンジンの構成
プロジェクトでオンライン ビーコンを使用するには、まずビーコンを構成する必要があります。エンジンの構成にはいくつかのオプションがあります。
オンライン ビーコンの設定を開始するには、プロジェクトの「DefaultEngine.ini」ファイルに以下を追加します。
[/Script/Engine.Engine]
+NetDriverDefinitions=(DefName="BeaconNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
[/Script/OnlineSubsystemUtils.OnlineBeacon]
BeaconConnectionInitialTimeout=30.0
BeaconConnectionTimeout=45.0
;[/Script/OnlineSubsystemUtils.OnlineBeaconClient]
;BeaconConnectionInitialTimeout=
;BeaconConnectionTimeout=
[/Script/OnlineSubsystemUtils.OnlineBeaconHost]
ListenPort=8888
bReuseAddressAndPort=false
bAuthRequired=false
MaxAuthTokenSize=1024
構成リファレンス
このセクションでは、上記の各構成オプションの用途、プロジェクトでの構成方法を説明します。
エンジン
以下は、オンライン ビーコンのネットワーク トラフィックを駆動するビーコン ネットワーク ドライバの設定です。
[/Script/Engine.Engine]
+NetDriverDefinitions=(DefName="BeaconNetDriver",DriverClassName="/Script/OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="/Script/OnlineSubsystemUtils.IpNetDriver")
この例では、IpNetDriver
をネットワーク ドライバ クラスとして使用しています。別のネットワーク ドライバ クラスを使用する場合は、DriverClassName
フィールドに使用するクラスを指定します。
オンライン ビーコン
フィールド | 説明 |
---|---|
ビーコン接続の初期タイムアウト | ビーコンがビーコン ホストとの接続確立を待つ時間。 |
ビーコン接続のタイムアウト | ビーコンが接続を確立してからパケットを待つ時間。 |
オンライン ビーコン クライアント
フィールド | 説明 |
---|---|
ビーコン接続の初期タイムアウト | ビーコンがビーコン ホストとの接続確立を待つ時間。 |
ビーコン接続のタイムアウト | ビーコンが接続を確立してからパケットを待つ時間。 |
オンライン ビーコン ホスト
フィールド | 説明 | デフォルト値 |
---|---|---|
リッスン ポート | このビーコン ホスト用に構成したリッスン ポート | |
アドレスとポートを再利用 | アドレスとポートの再利用を許可するようにリッスン ソケットを構成するかどうか。 True の場合、他のサーバーが同じポートで実行できないことを確認します。それ以外の場合、パケットが 2 つのサーバーに送られるため、未定義の動作をする可能性があります。 |
偽 |
認証が必要 | クライアントが、ビーコンに参加する前に認証を交渉する必要がある場合、これを True に設定します。 | 偽 |
最大認証トークン サイズ | 認証トークンの最大サイズ。Auth Required が True に設定されている場合のみ使用されます。 | 1024 |
オンライン ビーコン ホストに構成したリッスン ポートが、FURL
オブジェクトでオンライン ビーコン クライアントの InitClient
関数に渡すポートと同じであることを確認します。
オンライン ビーコンの実装
このセクションでは、サーバーとクライアントの ping 往復時間 (RTT) を計算するためのオンライン ビーコンの実装サンプルを紹介します。往復時間とは、パケットがクライアントからサーバーに送信され、再びクライアントに戻るまでにかかる時間のことです。これは小規模な実装であり、オンライン ビーコンができることを簡単に紹介しているに過ぎません。目的はテスト ビーコンを超える実装を始めるための実用的な例を提供することであり、ゲームプレイのコードにオンライン ビーコンを設定する方法が補足説明されています。
このオンライン ビーコンのサンプルは、C++ とブループリントを組み合わせて実装されており、UE の反射システムの 関数メタデータ指定子 と クラス メタデータ指定子 を RPC と特定関数の ブループリント ビジュアル スクリプティング への公開の両方に使用します。
Unreal Engine のオンライン ビーコンを使用して Ping プログラムを実装するには、以下の手順に従ってください。
-
Unreal Engine C++ プロジェクトを作成するか、これを開きます。
-
C++ クラス ウィザードを使用して、以下の 3 つの新しい C++ クラスを作成します。
-
OnlineBeaconClient
から派生したPingClient
というタイトルのクラス。 -
OnlineBeaconHost
から派生したPingHost
というタイトルのクラス。 -
OnlineBeaconHostObject
から派生したPingHostObject
というタイトルのクラス。
-
-
「ビーコンを Ping するコード」セクションのコードをそれぞれのヘッダ ファイルとソース ファイルに追加します。
-
プロジェクトのゲーム モード ファイルに以下の関数を追加します。
ヘッダ
public:
bool InitPingBeacon();
ソース
bool ABeaconsGameMode::InitPingBeacon()
{
ENetMode Mode = GetNetMode();
if (Mode == NM_DedicatedServer || Mode == NM_ListenServer)
{
APingHost* Host = GetWorld()->SpawnActor<APingHost>(APingHost::StaticClass());
if (Host && Host->InitializeHost())
{
APingHostObject* HostObject = GetWorld()->SpawnActor<APingHostObject>(APingHostObject::StaticClass());
if (HostObject)
{
Host->RegisterHostObject(HostObject);
return true;
}
}
}
return false;
}
-
ゲーム モードの
BeginPlay
機能で、InitPingBeacon
を呼び出します。 -
プロジェクトの「
DefaultEngine.ini
」ファイルに エンジン構成 セクションの設定を追加して、オンライン ビーコンを使用するようにプロジェクトが設定されていることを確認します。 -
クライアント ゲーム インスタンスでのみ実行されるブループリントに以下を追加します。このサンプルは サードパーソン テンプレート を使用したため、このコードは BP_ThirdPersonCharacter に追加されます。
Begin Object Class=/Script/BlueprintGraph.K2Node_Event Name="K2Node_Event_0" ExportPath="/Script/BlueprintGraph.K2Node_Event'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_Event_0'" EventReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.Actor'",MemberName="ReceiveBeginPlay") bOverrideFunction=True NodePosY=400 bCommentBubblePinned=True NodeGuid=641371E6411FC9D89F0E5D8323049C98 CustomProperties Pin (PinId=EAE8F3034FC01AF83136C48DCE1F4D73,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.Actor'",MemberName="ReceiveBeginPlay"),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=9CB66600479CAAE192CD17823296C033,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_6 2C9B940A4D10AADA10399B9F60FF49B2,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CustomEvent Name="K2Node_CustomEvent_0" ExportPath="/Script/BlueprintGraph.K2Node_CustomEvent'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_CustomEvent_0'" CustomFunctionName="PingEvent" NodePosY=640 NodeGuid=5BD80F5F4A8B9348E5367C9EE7DC3751 CustomProperties Pin (PinId=824C3E73438BE917D9901C8BA2796843,PinName="OutputDelegate",Direction="EGPD_Output",PinType.PinCategory="delegate",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(MemberParent="/Script/Engine.BlueprintGeneratedClass'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter_C'",MemberName="PingEvent",MemberGuid=5BD80F5F4A8B9348E5367C9EE7DC3751),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=46F29CF244DDEB00F0E5CC8CEBBAA58A,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SpawnActorFromClass_1 6921F0194B69A0C1E9CBD281626EDCAB,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_SpawnActorFromClass Name="K2Node_SpawnActorFromClass_1" ExportPath="/Script/BlueprintGraph.K2Node_SpawnActorFromClass'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_SpawnActorFromClass_1'" NodePosX=400 NodePosY=656 AdvancedPinDisplay=Shown NodeGuid=622DC95C46F608CD70500B85132FE4AB CustomProperties Pin (PinId=6921F0194B69A0C1E9CBD281626EDCAB,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CustomEvent_0 46F29CF244DDEB00F0E5CC8CEBBAA58A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=1B3133C841C35D6F68FBAA951831056B,PinName="then",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_2 7BF417FF432C7400B87C71942FF836E1,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=CB9D54F4483152E7E290B19FE3D48E8A,PinName="Class",PinToolTip="Actor Class Reference Class\nThe object class you want to construct",PinType.PinCategory="class",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.Actor'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Beacons.PingClient",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=15498E3B40C28CDE28E01FAE73E81DA6,PinName="ReturnValue",PinToolTip="Ping Client Object Reference Return Value\nThe constructed object",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Beacons.PingClient'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_2 912DBB9D44B68DDD0328E7A816CF7516,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=85DB02094AD8D6D9C91E7690AC574D53,PinName="SpawnTransform",PinToolTip="Spawn Transform\nTransform\n\nThe transform to spawn the Actor with",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/CoreUObject.Transform'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_0 ADDA843B4E2A91753356DC91FE3B9F9A,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=C1443292474BFB8DF2E9F79921A536C4,PinName="CollisionHandlingOverride",PinToolTip="Collision Handling Override\nESpawnActorCollisionHandlingMethod Enum\n\nSpecifies how to handle collisions at the spawn point. If undefined, uses actor class settings.",PinType.PinCategory="byte",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Enum'/Script/Engine.ESpawnActorCollisionHandlingMethod'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="AlwaysSpawn",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=9F905FBB499C1BF279F85FAF726E858A,PinName="TransformScaleMethod",PinType.PinCategory="byte",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Enum'/Script/Engine.ESpawnActorScaleMethod'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="MultiplyWithRoot",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=1858F883407DA2A78DAD709E45BB7237,PinName="Owner",PinToolTip="Owner\nActor Object Reference\n\nCan be left empty; primarily used for replication (bNetUseOwnerRelevancy and bOnlyRelevantToOwner), or visibility (PrimitiveComponent's bOwnerNoSee/bOnlyOwnerSee)",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.Actor'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_1 EEF081514454872D386B6BAC6475269B,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=8E61DCAF48C40C5B72D5BDB2790625F9,PinName="Instigator",PinToolTip="Instigator\nPawn Object Reference\n\nPawn responsible for damage and other gameplay events caused by this actor.",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.Pawn'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=True,PinType.bSerializeAsSinglePrecisionFloat=False,AutogeneratedDefaultValue="None",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_0" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_CallFunction_0'" bIsPureFunc=True FunctionReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.KismetMathLibrary'",MemberName="MakeTransform") NodePosX=-16 NodePosY=784 NodeGuid=7DE9226B45AE997BBFFC8F9EBC136078 CustomProperties Pin (PinId=073C80F04E9A08AC3FB622A1F2EE93FD,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nKismet Math Library Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.KismetMathLibrary'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Engine.Default__KismetMathLibrary",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=29FC17024B8B7D876C41F4BC093C6C3A,PinName="Location",PinToolTip="Location\nVector",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/CoreUObject.Vector'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0, 0, 0",AutogeneratedDefaultValue="0, 0, 0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=9D78DF6440AE198D4CBDE8984F8C1354,PinName="Rotation",PinToolTip="Rotation\nRotator",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/CoreUObject.Rotator'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0, 0, 0",AutogeneratedDefaultValue="0, 0, 0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=EE9D68A648FC7948FC0F8B961CB343F8,PinName="Scale",PinToolTip="Scale\nVector",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/CoreUObject.Vector'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="1.000000,1.000000,1.000000",AutogeneratedDefaultValue="1.000000,1.000000,1.000000",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=ADDA843B4E2A91753356DC91FE3B9F9A,PinName="ReturnValue",PinToolTip="Return Value\nTransform\n\nMake a transform from location, rotation and scale",Direction="EGPD_Output",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/CoreUObject.Transform'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SpawnActorFromClass_1 85DB02094AD8D6D9C91E7690AC574D53,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_1" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_CallFunction_1'" bIsPureFunc=True FunctionReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.GameplayStatics'",MemberName="GetPlayerController") NodePosX=32 NodePosY=1024 NodeGuid=E3356F124ADCE9C464182D8154699FF3 CustomProperties Pin (PinId=4865E66F4AEE74634193CDAD2E2AA1D3,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nGameplay Statics Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.GameplayStatics'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Engine.Default__GameplayStatics",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=975B63044778CD73752315A2E8C21922,PinName="WorldContextObject",PinToolTip="World Context Object\nObject Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/CoreUObject.Object'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=38468A6B43840A13F2F5A8982372AC2A,PinName="PlayerIndex",PinToolTip="Player Index\nInteger\n\nIndex in the player controller list, starting first with local players and then available remote ones",PinType.PinCategory="int",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="0",AutogeneratedDefaultValue="0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=EEF081514454872D386B6BAC6475269B,PinName="ReturnValue",PinToolTip="Return Value\nPlayer Controller Object Reference",Direction="EGPD_Output",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.PlayerController'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SpawnActorFromClass_1 1858F883407DA2A78DAD709E45BB7237,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_2" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_CallFunction_2'" FunctionReference=(MemberParent="/Script/CoreUObject.Class'/Script/Beacons.PingClient'",MemberName="ConnectToHost") NodePosX=896 NodePosY=640 NodeGuid=B53D30824E8D128AAD972D84938717C4 CustomProperties Pin (PinId=7BF417FF432C7400B87C71942FF836E1,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SpawnActorFromClass_1 1B3133C841C35D6F68FBAA951831056B,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=EB2F70EC4C0559D2F2FDA6A9D3675560,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_IfThenElse_0 AF9A40FC4AEFE89DC7CD8CB714050FA9,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=912DBB9D44B68DDD0328E7A816CF7516,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nPing Client Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Beacons.PingClient'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_SpawnActorFromClass_1 15498E3B40C28CDE28E01FAE73E81DA6,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=143602B4486FF90CD92A7BB633B53355,PinName="Address",PinToolTip="Address\nString",PinType.PinCategory="string",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="127.0.0.1",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=10CC29914E051D2BD6B4BB891C2632DC,PinName="Port",PinToolTip="Port\nInteger",PinType.PinCategory="int",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="8888",AutogeneratedDefaultValue="0",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=A5CF1278499613AB178B859DAD4F2992,PinName="bPortOverride",PinToolTip="Port Override\nBoolean",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="false",AutogeneratedDefaultValue="false",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=F90880E847BCED344DC098969DB9B54D,PinName="ReturnValue",PinToolTip="Return Value\nBoolean\n\nConnect to Host",Direction="EGPD_Output",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="false",AutogeneratedDefaultValue="false",LinkedTo=(K2Node_IfThenElse_0 3B5D7EE74E3F3C2075C3C3AEEC871F4F,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_IfThenElse Name="K2Node_IfThenElse_0" ExportPath="/Script/BlueprintGraph.K2Node_IfThenElse'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_IfThenElse_0'" NodePosX=1280 NodePosY=656 NodeGuid=C6BF80FE4F382A2E83AC98975F7D87ED CustomProperties Pin (PinId=AF9A40FC4AEFE89DC7CD8CB714050FA9,PinName="execute",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_2 EB2F70EC4C0559D2F2FDA6A9D3675560,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=3B5D7EE74E3F3C2075C3C3AEEC871F4F,PinName="Condition",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="true",AutogeneratedDefaultValue="true",LinkedTo=(K2Node_CallFunction_2 F90880E847BCED344DC098969DB9B54D,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=FE97970843E6292D14CFFE8E7068EFCE,PinName="then",PinFriendlyName=NSLOCTEXT("K2Node", "true", "true"),Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_3 E56D58EC46817A042829E998B205166D,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=14F8E61C4470196AB44FE18C78F330F0,PinName="else",PinFriendlyName=NSLOCTEXT("K2Node", "false", "false"),Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_CallFunction_4 4B794A1547001A751BB1E3A5D3FCB42F,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_3" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_CallFunction_3'" FunctionReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.KismetSystemLibrary'",MemberName="PrintString") NodePosX=1536 NodePosY=576 AdvancedPinDisplay=Hidden EnabledState=DevelopmentOnly NodeGuid=206D8F0743AE9399F810DE9D7DBF0AE6 CustomProperties Pin (PinId=E56D58EC46817A042829E998B205166D,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_IfThenElse_0 FE97970843E6292D14CFFE8E7068EFCE,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=607ECD45490CBD9CD664ECA9C39C17A6,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=0D455D4043C4BE74B10178942F346710,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nKismet System Library Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.KismetSystemLibrary'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Engine.Default__KismetSystemLibrary",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=58B310A540E92F72FF7551A3F3BD9562,PinName="WorldContextObject",PinToolTip="World Context Object\nObject Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/CoreUObject.Object'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=C22FBEB34F7353659494C2ACB91CFAE2,PinName="InString",PinToolTip="In String\nString\n\nThe string to log out",PinType.PinCategory="string",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="Success to Connect to Host",AutogeneratedDefaultValue="Hello",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=3F42942C44C5E4CBDD01BA864C025CCB,PinName="bPrintToScreen",PinToolTip="Print to Screen\nBoolean\n\nWhether or not to print the output to the screen",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="true",AutogeneratedDefaultValue="true",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=95BE02A243BAFF7E750EA78B0369C60E,PinName="bPrintToLog",PinToolTip="Print to Log\nBoolean\n\nWhether or not to print the output to the log",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="true",AutogeneratedDefaultValue="true",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=48620995452AADD79E31708B07358AD0,PinName="TextColor",PinToolTip="Text Color\nLinear Color Structure\n\nThe color of the text to display",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/CoreUObject.LinearColor'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="(R=0.000000,G=0.660000,B=1.000000,A=1.000000)",AutogeneratedDefaultValue="(R=0.000000,G=0.660000,B=1.000000,A=1.000000)",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=36CC9845469AFAC0024C4BA0A7778FFC,PinName="Duration",PinToolTip="Duration\nFloat (single-precision)\n\nThe display duration (if Print to Screen is True). Using negative number will result in loading the duration time from the config.",PinType.PinCategory="real",PinType.PinSubCategory="float",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="5.000000",AutogeneratedDefaultValue="2.000000",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=68DB72FB4E7C3A946F7FDAB9A2463273,PinName="Key",PinToolTip="Key\nName\n\nIf a non-empty key is provided, the message will replace any existing on-screen messages with the same key.",PinType.PinCategory="name",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="None",AutogeneratedDefaultValue="None",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_4" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_CallFunction_4'" FunctionReference=(MemberParent="/Script/CoreUObject.Class'/Script/Engine.KismetSystemLibrary'",MemberName="PrintString") NodePosX=1536 NodePosY=768 AdvancedPinDisplay=Hidden EnabledState=DevelopmentOnly NodeGuid=10B2C28148F30742A72220AFBC4189F4 CustomProperties Pin (PinId=4B794A1547001A751BB1E3A5D3FCB42F,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_IfThenElse_0 14F8E61C4470196AB44FE18C78F330F0,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=7ACEFAF1451255C9198B5795DBAB32A7,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=838863114339A301A55E2CAD059B8004,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nKismet System Library Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/Engine.KismetSystemLibrary'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultObject="/Script/Engine.Default__KismetSystemLibrary",PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=9452B9694B15C99EB963A7884AB1A100,PinName="WorldContextObject",PinToolTip="World Context Object\nObject Reference",PinType.PinCategory="object",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.Class'/Script/CoreUObject.Object'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=True,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=B38E9FE14BEC997956E2DEB4FE0B04CD,PinName="InString",PinToolTip="In String\nString\n\nThe string to log out",PinType.PinCategory="string",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="Failure Connected to Host",AutogeneratedDefaultValue="Hello",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=FBF62C2E4C3F92866C1F0984702C11A0,PinName="bPrintToScreen",PinToolTip="Print to Screen\nBoolean\n\nWhether or not to print the output to the screen",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="true",AutogeneratedDefaultValue="true",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=3D54EE2F4AD386C6D7E5A0BEF67C118D,PinName="bPrintToLog",PinToolTip="Print to Log\nBoolean\n\nWhether or not to print the output to the log",PinType.PinCategory="bool",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="true",AutogeneratedDefaultValue="true",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=742684EC4F183E06F47C78ACC4BF5CA4,PinName="TextColor",PinToolTip="Text Color\nLinear Color Structure\n\nThe color of the text to display",PinType.PinCategory="struct",PinType.PinSubCategory="",PinType.PinSubCategoryObject="/Script/CoreUObject.ScriptStruct'/Script/CoreUObject.LinearColor'",PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="(R=0.000000,G=0.660000,B=1.000000,A=1.000000)",AutogeneratedDefaultValue="(R=0.000000,G=0.660000,B=1.000000,A=1.000000)",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=780C2B564E0FCF7B81CADBBCBDF19B0C,PinName="Duration",PinToolTip="Duration\nFloat (single-precision)\n\nThe display duration (if Print to Screen is True). Using negative number will result in loading the duration time from the config.",PinType.PinCategory="real",PinType.PinSubCategory="float",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="5.000000",AutogeneratedDefaultValue="2.000000",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) CustomProperties Pin (PinId=E1E4607E47ADEADC05A535A4A502C74E,PinName="Key",PinToolTip="Key\nName\n\nIf a non-empty key is provided, the message will replace any existing on-screen messages with the same key.",PinType.PinCategory="name",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=True,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,DefaultValue="None",AutogeneratedDefaultValue="None",PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=True,bOrphanedPin=False,) End Object Begin Object Class=/Script/BlueprintGraph.K2Node_CallFunction Name="K2Node_CallFunction_6" ExportPath="/Script/BlueprintGraph.K2Node_CallFunction'/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter:EventGraph.K2Node_CallFunction_6'" FunctionReference=(MemberName="PingEvent",MemberGuid=5BD80F5F4A8B9348E5367C9EE7DC3751,bSelfContext=True) NodePosX=352 NodePosY=384 NodeGuid=CEF65F4F4645FD40845184A972E34DC2 CustomProperties Pin (PinId=2C9B940A4D10AADA10399B9F60FF49B2,PinName="execute",PinToolTip="\nExec",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,LinkedTo=(K2Node_Event_0 9CB66600479CAAE192CD17823296C033,),PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=D94EEE4346024C0C1917AFBE825B7D3A,PinName="then",PinToolTip="\nExec",Direction="EGPD_Output",PinType.PinCategory="exec",PinType.PinSubCategory="",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) CustomProperties Pin (PinId=F463D0E341E915C09861B8A86B1F0686,PinName="self",PinFriendlyName=NSLOCTEXT("K2Node", "Target", "Target"),PinToolTip="Target\nSelf Object Reference",PinType.PinCategory="object",PinType.PinSubCategory="self",PinType.PinSubCategoryObject=None,PinType.PinSubCategoryMemberReference=(),PinType.PinValueType=(),PinType.ContainerType=None,PinType.bIsReference=False,PinType.bIsConst=False,PinType.bIsWeakPointer=False,PinType.bIsUObjectWrapper=False,PinType.bSerializeAsSinglePrecisionFloat=False,PersistentGuid=00000000000000000000000000000000,bHidden=False,bNotConnectable=False,bDefaultValueIsReadOnly=False,bDefaultValueIsIgnored=False,bAdvancedView=False,bOrphanedPin=False,) End Object
オンライン ビーコン実装のテスト
オンライン ビーコンの実装をテストするには、専用サーバーまたはリッスン サーバーと、少なくとも 1 つのスタンドアローン クライアントを使用してプロジェクトを実行する必要があります。open
コンソール コマンドでクライアントをサーバーに接続する必要はありません。これはオンライン ビーコンの重要な特徴であり、クライアントはサーバーとのコンタクトを開始した後、迅速なトランザクションで切断することができます。
オンライン ビーコンの実装をテストする手順:
-
プロジェクトが正常にコンパイルされていることを確認してください。
-
Unreal Editor でプロジェクトを開きます。
-
[Editor Preferences (エディタの環境設定)] で、[Level Editor (レベル エディタ) > Play (プレイ)] 設定を以下のように変更します。
-
[Play in Standalone Game (スタンドアローン ゲームでプレイ)]:
- Additional Launch Parameters (追加起動パラメータ) を「
-WINDOWED -ResX=800 -ResY=640 -log
」に設定します。
- Additional Launch Parameters (追加起動パラメータ) を「
-
[Multiplayer Options (マルチプレイヤー オプション)]:
-
[Launch Separate Server (別のサーバーを起動)] を有効化します。
-
[Play Net Mode (プレイ ネット モード)] を [Play Standalone (プレイ スタンドアローン)] に設定します。
-
[Run Under One Process (1 つのプロセス下で実行)] を無効化します。
-
[Additional Server Launch Parameters (追加のサーバー起動パラメータ)] を
-log
に設定します。
-
画像をクリックすると拡大表示されます。
-
-
[Play (プレイ)] をクリックします。[Server Log (サーバー ログ)] ウィンドウ、[Client Log (クライアント ログ)] ウィンドウ、[Client Game Instance (クライアント ゲーム インスタンス)] ウィンドウの 3 つが新しく表示されます。
-
クライアントのログ ウィンドウに次の行が表示されていれば、ping ビーコンは成功しています。
LogPingClient: Ping Complete: 29 ms
実際のミリ秒数は異なる可能性があります。
デバッグ
クライアントのログ ウィンドウに上記の行が表示されない場合は、ping ビーコンが失敗した可能性があります。ping ビーコンが失敗した場合は、以下を確認してください。
ポート
エンジン構成で、クライアント オンライン ビーコンがサーバー オンライン ビーコンと同じポートを指定していることを確認してください。
[/Script/OnlineSubsystemUtils.OnlineBeaconHost]
ListenPort=8888
ネットワーク ドライバ
サーバーがこの指定されたポートをリッスンするネットワーク ドライバを作成していることを確認してください。
LogNet: IpNetDriver_1 IpNetDriver_1 IpNetDriver listening on port 8888
ログに上記と同じポートを指定するこのような行がない場合は、上記の エンジン構成 セクションを見直してください。
ロギング
オンライン ビーコンは、LogBeacon
ログ カテゴリを使用して、すべてのオンライン ビーコン ネットワーク トラフィックを記録します。LogNet
および LogHandshake
は、オンライン ビーコンのデバッグに役立つ追加のログ カテゴリです。
素材
ビーコンを Ping するコード
クライアントの Ping
PingClient.h
#pragma once
#include "CoreMinimal.h"
#include "OnlineBeaconClient.h"
#include "PingClient.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogPingClient, Log, All);
/**
*
*/
UCLASS(Blueprintable, BlueprintType, Transient, NotPlaceable, Config = Engine)
class BEACONS_API APingClient : public AOnlineBeaconClient
{
GENERATED_BODY()
public:
APingClient(const FObjectInitializer& ObjectInitializer);
virtual void OnFailure() override;
UFUNCTION(Client, Reliable)
void ClientPingBegin();
UFUNCTION(Server, Reliable, WithValidation)
void ServerPong();
UFUNCTION(Client, Reliable)
void ClientPingEnd();
UFUNCTION(BlueprintCallable, Category=Ping)
bool ConnectToHost(FString Address, int32 Port, const bool bPortOverride);
UFUNCTION(BlueprintCallable, Category=Ping)
void Disconnect();
protected:
int64 PingBeginTime;
int32 PingMS;
};
PingClient.cpp
// プロジェクト設定の説明ページの著作権表示を入力します。
#include "PingClient.h"
DEFINE_LOG_CATEGORY(LogPingClient)
APingClient::APingClient(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
}
void APingClient::OnFailure()
{
Super::OnFailure();
UE_LOG(LogPingClient, Log, TEXT("APingClient connection failed"))
}
void APingClient::ClientPingBegin_Implementation()
{
UE_LOG(LogPingClient, Log, TEXT("APingClient::ClientPingBegin_Implementation"));
PingBeginTime = FDateTime::Now().GetTicks();
ServerPong();
}
bool APingClient::ServerPong_Validate()
{
return true;
}
void APingClient::ServerPong_Implementation()
{
UE_LOG(LogPingClient, Log, TEXT("APingClient::ServerPong_Implementation"));
ClientPingEnd();
}
void APingClient::ClientPingEnd_Implementation()
{
UE_LOG(LogPingClient, Log, TEXT("APingClient::ClientPingEnd_Implementation"));
int64 PingTime = FDateTime::Now().GetTicks() - PingBeginTime;
PingMS = (int32)(PingTime / 10000);
UE_LOG(LogPingClient, Log, TEXT("Ping Complete: %d ms"), PingMS);
}
bool APingClient::ConnectToHost(FString Address, int32 Port, const bool bPortOverride)
{
FURL url(nullptr, *Address, ETravelType::TRAVEL_Absolute);
if (bPortOverride)
{
url.Port = Port;
}
else
{
int32 ListenPort;
if (GConfig->GetInt(TEXT("/Script/OnlineSubsystemUtils.OnlineBeaconHost"), TEXT("ListenPort"), ListenPort, GEngineIni))
{
url.Port = ListenPort;
}
else
{
url.Port = 8888;
}
}
return InitClient(url);
}
void APingClient::Disconnect()
{
DestroyBeacon();
}
ホストの Ping
PingHost.h
#pragma once
#include "CoreMinimal.h"
#include "OnlineBeaconHost.h"
#include "PingHost.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogPingHost, Log, All);
/**
*
*/
UCLASS(Blueprintable, BlueprintType, Transient, NotPlaceable, Config=Engine)
class BEACONS_API APingHost : public AOnlineBeaconHost
{
GENERATED_BODY()
public:
APingHost(const FObjectInitializer& ObjectInitializer);
UFUNCTION(BlueprintCallable, Category=Ping)
bool InitializeHost();
UFUNCTION(BlueprintCallable, Category=Ping)
void RegisterHostObject(AOnlineBeaconHostObject* HostObject);
protected:
bool bInitSuccess;
};
PingHost.cpp
#include "PingHost.h"
DEFINE_LOG_CATEGORY(LogPingHost)
APingHost::APingHost(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
BeaconState = EBeaconState::AllowRequests;
}
bool APingHost::InitializeHost()
{
bInitSuccess = InitHost();
return bInitSuccess;
}
void APingHost::RegisterHostObject(AOnlineBeaconHostObject* HostObject)
{
if (bInitSuccess)
{
RegisterHost(HostObject);
}
}
ホスト オブジェクトの Ping
PingHostObject.h
#pragma once
#include "CoreMinimal.h"
#include "OnlineBeaconHostObject.h"
#include "PingHostObject.generated.h"
DECLARE_LOG_CATEGORY_EXTERN(LogPingHostObject, Log, All);
/**
*
*/
UCLASS(Blueprintable, BlueprintType, Transient, NotPlaceable, Config = Engine)
class BEACONS_API APingHostObject : public AOnlineBeaconHostObject
{
GENERATED_BODY()
public:
APingHostObject(const FObjectInitializer& ObjectInitializer);
virtual AOnlineBeaconClient* SpawnBeaconActor(class UNetConnection* ClientConnection) override;
virtual void OnClientConnected(class AOnlineBeaconClient* ClientActor, class UNetConnection* ClientConnection) override;
virtual bool Init();
};
PingHostObject.cpp
#include "PingHostObject.h"
#include "PingClient.h"
DEFINE_LOG_CATEGORY(LogPingHostObject)
APingHostObject::APingHostObject(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{
ClientBeaconActorClass = APingClient::StaticClass();
BeaconTypeName = ClientBeaconActorClass->GetName();
PrimaryActorTick.bCanEverTick = true;
PrimaryActorTick.bAllowTickOnDedicatedServer = true;
PrimaryActorTick.bStartWithTickEnabled = true;
}
AOnlineBeaconClient* APingHostObject::SpawnBeaconActor(UNetConnection* ClientConnection)
{
return Super::SpawnBeaconActor(ClientConnection);
}
void APingHostObject::OnClientConnected(AOnlineBeaconClient* ClientActor, UNetConnection* ClientConnection)
{
Super::OnClientConnected(ClientActor, ClientConnection);
APingClient* BeaconClient = Cast<APingClient>(ClientActor);
if (BeaconClient != nullptr)
{
BeaconClient->ClientPingBegin();
}
}
bool APingHostObject::Init()
{
return true;
}
ゲーム モードのコード
BeaconsGameMode.h
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "BeaconsGameMode.generated.h"
UCLASS(minimalapi)
class ABeaconsGameMode : public AGameModeBase
{
GENERATED_BODY()
public:
ABeaconsGameMode();
bool InitPingBeacon();
protected:
virtual void BeginPlay();
};
BeaconsGameMode.cpp
// Copyright Epic Games, Inc. All Rights Reserved.
#include "BeaconsGameMode.h"
#include "BeaconsCharacter.h"
#include "UObject/ConstructorHelpers.h"
#include "PingBeacon/PingHost.h"
#include "PingBeacon/PingHostObject.h"
ABeaconsGameMode::ABeaconsGameMode()
{
// デフォルトのポーン クラスをブループリント化したキャラクターに設定します
static ConstructorHelpers::FClassFinder<APawn> PlayerPawnBPClass(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter"));
if (PlayerPawnBPClass.Class != NULL)
{
DefaultPawnClass = PlayerPawnBPClass.Class;
}
}
bool ABeaconsGameMode::InitPingBeacon()
{
ENetMode Mode = GetNetMode();
if (Mode == NM_DedicatedServer || Mode == NM_ListenServer)
{
APingHost* Host = GetWorld()->SpawnActor<APingHost>(APingHost::StaticClass());
if (Host && Host->InitializeHost())
{
APingHostObject* HostObject = GetWorld()->SpawnActor<APingHostObject>(APingHostObject::StaticClass());
if (HostObject)
{
Host->RegisterHostObject(HostObject);
return true;
}
}
}
return false;
}
void ABeaconsGameMode::BeginPlay()
{
bool bSuccess = InitPingBeacon();
if (bSuccess)
{
UE_LOG(LogTemp, Log, TEXT("PingBeacon Init Success"))
}
else
{
UE_LOG(LogTemp, Log, TEXT("PingBeacon Init Failure"))
}
}