見出し画像

UE5で会話システムを実装する方法③

こんにちは! かにまろです。
前回の続きで、今回はプレイヤーのブループリントを設定していきます!
これまでの記事は、下のリンクからご覧ください。



BP_ThirdPersonCharacterを調整する

必要なものは全て揃ったので後はどこから作っても良いのですが、わかりやすく処理の流れに沿って進めていきます。

コンテンツブラウザから、「ThirdPerson>Blueprints>BP_ThirdPersonCharacter」を開いてください。

BP_ThirdPersonCharacterの全体像

BP_ThirdPersonCharacterは、最終的に下の画像のようになります。

BPI_Interactにつなげる

まず、BPI_Interactにアクセスできるようにしましょう。
画面上のクラス設定を押した後、画面右の実装インターフェースの追加を押し、BPI_Interactを選択してください。

選択したら、左上からコンパイルしましょう。
画面左下の「マイブループリント>インターフェース」に、「BPI Talk End」と「BPI Talk Start」が追加されているはずです。

会話中は動けないようにする

会話中は、プレイヤーが動かないようにします。
「マイブループリント>インターフェース」の「BPI Talk Start」をダブルクリックすると、「イベント BPI Talk Start」が作られます。

EndTalkから線を伸ばして「変数に昇格」します。「イベント BPI Talk Start」の右側の△と、赤い「セット」の左側の△を白い線でつなげてください。
これで、BPI_TalkStartから受け取った情報(EndTalk)をいつでもBP_ThirdPersonCharacter内で使えるようになりました。

次に、キーボードのbを押しながらセットの右側をクリックしてみてください。「ブランチ」が作られるので、左側のピンを赤い「セット」左側の同じ色のピンにつなげてください。これで、EndTalkがTRUEの場合とFALSEの場合で処理をわけることができます。

「ブランチ」のTrueから線を伸ばして、「Set Movement Mode(CharacterMovement)」を追加してください。「Set Movement Mode(CharacterMovement)」のNew Movement Modeは「Walking」に変えましょう。

自動的に追加された「CharacterMovement」から線を伸ばして、「Disable Movement」を追加しましょう。「Disable Movement」は、「ブランチ」のFalseとつなげてください。

EndTalkがTrueの場合は会話中"ではない"ので動けるようになり、EndTalkがFalseの場合は会話中なので動かないようになりました。

次に、「マイブループリント>インターフェース」の「BPI Talk End」をダブルクリックして「イベント BPI Talk End」を追加したら、残りの処理をコピペして同じようにつないでください。
❓ここの処理を1つにまとめられないだろうか……。

これで、動きに関する処理は完了です。

Eボタンを押したら会話開始

次は、いよいよボタンを押して話しかける処理を入れていきましょう!
ここでは、キーボードのEをインタラクトに使うボタンとして進めていきます。

何もない場所で右クリックして、検索キーワードに「キーボードイベント」と入れてEキーを選択しましょう。

通常時にEを押したときは会話を開始したいのですが、会話中にEを押したときは次の会話を再生するように場合分けをします。そのために、「EndTalk」が今どういう状態かを取得する必要があります。
「マイブループリント>変数」の「EndTalk」を右側にドラッグ&ドロップして、「Get End Talk」を選んでください。

「ブランチ」を追加して、「ブランチ」の△とEのPressedの△を、「ブランチ」のConditionと「EndTalk」をつなげます。

次に、「Get Overlapping Actors」を追加します。これは、今プレイヤーが重なっているオブジェクトが何かを教えてくれるものです。

Characterの中から一致するものを探したいので、Class Filterを「Character」にします。

次に、「For Each Loop with Break」を入れます。
この後に入れる「Get Overlapping Actorsと一致するものを、実装されているものの中から調べる」という処理を1つ1つ繰り返し行い、一致したらやめるという処理を入れるのに使います。「For Each Loop with Break」と「ブランチ」のTrueをつなげておきます。
「ブランチ」のFalseは、後から設定するのでそのままで大丈夫です。

「For Each Loop with Break」のArray Elementから「Does Imprement Interface」を伸ばします。Interfaceには「BPI_Interact」を入れておきましょう。

後ろに「ブランチ」を追加して、下の画像のようにつなげます。重なっているキャラクターが何かを調査し、特定できたときに「Does Inprement Interface」からTrueが返され、Breakにつながって調査をやめる、という流れになります。

一連の調査が終わったら、特定したNPCに会話をするよう命令します。その前に話しかけたときのSEを流したいと思います。(不要な方は飛ばしてください)
会話ウィンドウ等のリソース追加と同じように、音源をコンテンツブラウザ上にドラッグ&ドロップして追加した後、「ブランチ」のCompletedから「Play Sound 2D」をつなげて追加した音源を指定してください。

会話ウィンドウを作成し、BPI_Interactを通してNPCに渡します。
「ウィジェットを作成」でWBP_Talkを読み込んだ後、「BPI Talk Start(メッセージ)」を追加してください。

左側のピンは、実際のデータは入っていなくても良いので何かしらつなげる必要があります。
ターゲットは、どのNPCに情報を送るかを指定するものなので、「For Each Loop with Break」のArray Elementで返されているNPCの情報を入れます。少し遠いですが、Array Elementとターゲットをつなげてください。WBP_Talkには、今作った「ウィジェットを作成」のReturn Valueをつなげましょう。
EndTalkは会話中なので空欄のまま、その他は全て左にピンを伸ばして変数に昇格しましょう。

全体で画像のようになっていれば大丈夫です。コンパイルして保存しておきましょう。

今日はここまで!

長くなってすみません💧 今日はここまでで区切ります。
また次回、ご覧いただけると嬉しいです!

使わせていただいたリソース

いいなと思ったら応援しよう!

かにまろ|ゲーム開発 よろしければサポートお願いします!

この記事が参加している募集