ブループリントコミュニケーションII



Blueprint Communication Ii



独立したブループリントクラスを作成して、ブループリント間の相互通信を実現します

CSDNブログに写真を追加するのは面倒で、ウェブページの写真のリンクでエラーが発生します。詳細な記事を読む必要がある場合は、私のWeChatパブリックアカウント「HuntingDream UnrealResearchSociety」にアクセスしてください。

最初の記事では、ブループリント間のデータの相互作用とイベント通知を実現するためのレベルのブループリントを紹介しました。



しかし、レベルの青写真を導入して以来、このアプローチはお勧めしません。シーンで制御するにはドアやライトが多すぎる場合、またはより多くのシーン要素を制御する必要がある場合、レベルブループリントを使用することは明らかに非常に悪い決定であり、レベルブループリントが非常に複雑で肥大化します。 、そしてそれを維持するためにあなたが興味を上げるのを難しくします。

したがって、今後、ブループリント通信に関連するものは、独立したブループリントクラス間で実装されます(独立したブループリントクラスは、コンテンツブラウザでマウスの右ボタンをクリックしてアクターブループリントを作成するなど、個別に作成されたブループリントを指します)。



この記事では、ブループリントの変数を使用してシーン内のオブジェクトを指定し、最初の記事のレベルブループリントで実現された「ドアを開ける」とまったく同じ機能を実現します。

したがって、最初に行う必要があるのは、新しいアクターブループリントを作成し、それをトリガーとして使用することです。
画像
アクターブループリントを作成する方法は、今後繰り返されません。右クリックしてコンテンツブラウザでブループリントを作成し、親クラスとしてActorを選択します。ここではBP_OpenDoorという名前を付けました。

このブループリントを開き、コンポーネントセクションにStaticMeshコンポーネントを追加してモデルを保存し(モデルを使用する必要がある場合)、衝突ボディとしてBoxCollisionコンポーネントを作成します。



このボックスの衝突は、以前に使用したボックストリガーと同じです。プレイヤーの動きを妨げたり、見たり、イベントを引き起こしたりすることはありません。

この手順までエラーがない場合、コンポーネントパネルには次のように2つのオブジェクトがあります。
画像

StaticMeshに準備したモデルを渡し、モデルに合うようにボックスのサイズを調整します。単純な立方体を使用してスイッチを表します。調整後の状態は次のとおりです。
画像

モデル作業が完了し、イベントチャートが表示されます。

最初に変数を追加し、タイプをActorに変更して、publicに設定します。
画像
これで、この変数はActorクラスを基本クラスとしてオブジェクトを格納し、Actorから継承されたすべてのクラスをこの変数に格納できます。これはプログラマー以外の人には理解できないかもしれません。しばらくの間作成するActorブループリント、またはドラッグアンドドロップするStaticMeshがドアとして使用されていることを知っている限り、この変数を使用してそれを格納できます。

レベルの青写真のロジックと同様に、ドアの元の位置を格納するためのベクトルも必要です。
画像

コンポーネントパネルで、作成したBoxCollisionを選択します。詳細パネルの下部にBeginOverlapイベントがあります。
画像
レベルブループリントの操作と同じです。プラス記号をクリックしてこのイベントを追加します(私のレイアウトはスクリーンショット用に一時的に調整されており、ページレイアウトと同じではない場合があります)。達成する必要のある機能は、範囲に入り、ドアを開いてからエリアを離れることであるため、ここでは、EndOverlapイベントではなく、BeginOverlapイベントのみを追加します。

特定の青写真ロジックは次のように記述されています。

まず、BeginPlay中にドアの初期座標を記録します。
画像
次に、以下に示すようにブループリントを接続します。
画像

次に、上記の手順のロジックを整理しましょう。

新しいActorクラス(BP_OpenDoor)を作成し、重複するイベントのトリガーとしてその中にBoxCollisionを作成しました。このクラスをシーンに配置すると、モデルとトリガーのボックス衝突がシーンの対応する位置に表示されます。プレイヤーがトリガーに入ると、「ドア」を開く方法を見つける必要があります。

ブループリントで、操作する「ドア」を表す変数(AimActor)を作成します。ゲームの開始時(BeginPlay)に、対応する「ドア」(AimActor)の座標を取得し、変数(Location)を使用して記録します。プレイヤーが範囲に入るとき重なりイベント(BeginOverlap)をトリガーした後、最初の記事のタイムラインを使用するのと同じ方法で「ドア」の動きを設定します。

このようにして、BP_OpenDoorのロジックが完成します。ここで行う必要があるのは、シーンで「ドア」を指定し、それをAimActor変数に記録する方法を見つけることです。このように、このAimActorを操作するとき、実際には指定した「ドア」を操作しています。

「ドア」を指定する方法は、実際には非常に簡単です。シーンにBP_OpenDoorブループリントを配置しました。これを選択すると、詳細パネルにプロパティAimActorが表示されます。この属性の隣には小さなストロー(またはカラーピッカーと呼ばれます)があります
画像
それをクリックしてから、シーンに配置した「ドア」をクリックします。これにより、モデルが正常に指定され、その参照がBP_OpenDoorの変数に関連付けられます。
画像
これにより、以前と同じ機能が実現します。
画像

これで、レベルブループリントの簡略化が完了し、レベルブループリントのスペースが解放され、論理結合が削減されました。レベルブループリントには、実際に必要なロジックを記述するためのスペースを増やすことができます。この種の相互作用は独立してカプセル化され、BP_OpenDoorと「ドア」の間でのみ相互作用し、他の部分に干渉しなくなります。

これは良い考えであり、公式のケースのコンテンツ例には同様のアプリケーションが多数あります
画像
カプセル化するのはそれほど簡単ではない、いくつかのより深いメソッド(ブループリントインターフェイスとイベントスケジューラ)を使用しているだけです。

この記事の主な目的は、関数のカプセル化に向けた最初のステップを踏み出し、関数をレベルブループリントから独立したブループリントクラスに転送することです。後で、カプセル化を改善し、さまざまなブループリントクラス間の結合をさらに減らすために、他の方法が導入されます。

画像