お茶漬けびより

学んだことを整理する場所です。主に、C++, Unreal Engine 4 (UE4) を扱います。

操作キャラクターの目の前にあるオブジェクトのイベントを呼ぶ

初記事です。UE4の話です。

 今回作った機能は、アクションボタンを押したときにオブジェクトによって異なるアクションを起こす機能です。例えば、ゼルダの伝説というゲームがありますが、Aボタンを押すだけでも状況によってアクションが変化します。宝箱が近くにあれば宝箱を開け、登れる壁があれば登り、押せるオブジェクトがあれば押したりなど。そんな機能を作ります。

 手順としては、アクション用のBPクラスを作り、イベントディスパッチャーを使って、プレイヤーからオブジェクトのイベントを起こします。

まず簡単に流れを考えます。

アクションボタンを押す

目の前にオブジェクトがある?―(ない)→終了

↓ある

アクションイベントを持っている?ー(ない)→終了

↓ある

アクションイベントを呼び出す

終了

この流れを、操作キャラクターのBPに追加します。

 

アクションボタンを押す

これは、プロジェクトの設定からインプットにあるAction Mappingsで追加します。

今回、名前は「Action」にしました。

 

目の前にオブジェクトがある?

これは、LineTraceByChannel を使います。

LineTraceByChannelについては、以下を参照ください。

docs.unrealengine.com

以下のように組みました。

f:id:pickles-ochazuke:20161123100311p:plain

 

アクションイベントを持っている?

今回の本題です。

まず、アクターにアクションイベントを持たせます。そのために新しいコンポーネント(アクションコンポーネント)を作成し、そのコンポーネントにイベントディスパッチャー(アクションイベント)を作ります。そして、アクション用のアクター(アクションアクター)を作り、アクションコンポーネントを追加し、アクションを持っていることが分かるようにタグを追加します。アクションイベントを持たせたいアクターを作るときは、このアクションアクターを継承するようにします。

図にすると以下のような感じです。

f:id:pickles-ochazuke:20161123111027j:plain

では、まずコンポーネントを作っていきます。

コンテンツブラウザの新規作成からブループリントクラスを選び、親クラスとしてActorComponentを選びます。作ったコンポーネントの名前は、ActionComponentとしました。

f:id:pickles-ochazuke:20161123111506p:plain

次にBPを開いて、イベントディスパッチャーを追加します。

名前はActionDispatchにしました。

f:id:pickles-ochazuke:20161123112055p:plain

次にアクション用のアクターを作ります。

コンテンツブラウザから新規作成でブループリントクラスを選びます。親クラスはActorを選びます。作成したBPの名前は、ActionActorBPにしました。ActionActorBPを開いて、コンポーネントを追加からActionComponentを追加します。クラスのデフォルトを選んだ状態で、詳細のActorのTagsのタグを追加します。タグの名前は、Actionにしました。

f:id:pickles-ochazuke:20161123113211p:plain

これでアクション用のアクターは完成です。あとはアクションを付けるアクターを作るときにActionActorBPを親クラスに選び、ActionComponentのActionDispatchをイベントに追加すれば、OKです。

では、操作キャラクターのBPに戻ります。

まず、ヒットしたActorがActionタグを持っているか見ます。Actionタグがあるということは、アクションイベントを持っていると判断し、ActionDispatchを呼び出します。これで、ヒットしたActorのアクションイベントを呼びます。

BPは以下のようになります。

f:id:pickles-ochazuke:20161123114238p:plain

 

アクションイベントを呼び出す

一応流れとしては完成していますが、試しにイベントを呼び出してみます。

ActionActorBPを親クラスに選び、ActionChild1とActionChild2を作ります。

そして、ActionDispatchをイベントに追加し、分かりやすいようにPrint String でてきとうな文字を入力します。もちろんActionChild1とActionChild2は別々の文字を出力するようにします。

細かい説明は面倒なので、以下の動画をご覧ください。

youtu.be

これで、操作キャラクター側のBPをいじることなく、オブジェクト内をいじるだけで新しいアクションが追加できるようになりました。

もっと簡単な方法や、何か問題があるかもしれませんが、分かり次第追記しようと思います。