Unreal Engine 4.24 で近づくと動く物体を作る（外部のアクターを参照する）

# 趣旨

Blueprint を編集中のアクターとは別の、外部のアクターのイベント (ターゲットが self ではないイベント）を参照する方法について、公式のドキュメントがいくつか存在していて、うまくいくものとそうでないものがあったのでメモしておく。

- [アクタ リファレンスの設定と取得](https://docs.unrealengine.com/ja/Engine/Blueprints/BP_HowTo/ActorReference/index.html)

結論から書くと、上の公式ドキュメントの方法で、UE 4.24 ではうまくいった。

# 前提

- Windwos 10 Home
- Unreal Engine 4.24
- Third Person サンプルを使ってプロジェクトを作成

# やること

1. 近づくと上方向に開く物体を作る。
2. 近づいたという判定は、動く物体と別の「ボックストリガー」を使う。
3. 「ボックストリガー」の Overlap イベントを拾って、トリガーの範囲に入ると物体が上に動き、範囲外に出ると元に戻るようにする。
4. 物体の動きは Timeline で作る。

この過程の 3. のところで、外部のアクターを参照する必要がでてくる。

# 手順

## サードパーソンサンプルでプロジェクトを初期化する

- https://qiita.com/mml/items/be3f0b6c29b477bcc93a
上の記事に書いたので、ここでは省略。

サンプルの中にある CubeMesh を動く物体にすることにする。

## CubeMesh を囲むように BoxTriger を置く

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/2ea57c3e-63eb-cfc1-44fb-ab138f680d69.png)

左のパネルの「基本」からボックストリガーを選んで、メイン画面内にドラッグろろっぷする。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/5ebf256b-472c-2df7-8c7e-bdd66eeb06ac.png)


サイズと位置を調整して、CubeMesh が中に入るようにする。自キャラが一部でも橙色の枠に入れば反応する(Overlapイベントが発生する)。高さはそんなになくてもいい。

これでアクターの配置は終わり。

## CubeMEsh のブループリントを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/0f798dbe-b96a-8c51-b597-bfd2594b7cd7.png)

CumeMesh を選択した状態で、右側にある「ブループリント/スクリプトを追加」を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/ee64fe68-23ae-e28f-3792-b33ca6543a8c.png)

このパネルが出たらこのままで「ブループリントを作成」を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/092b484d-018c-6be6-3f10-5434e104e911.png)

ブループリントを編集するウィンドウが出たら、「イベントグラフ」のタブを押してこの画面にする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/b6eb5aeb-065e-44b7-99cb-f9bff07e3ab7.png)


左側の「変数」の横にある「＋」を押して、変数を作成する。名前を BoxTrigger としておく。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/b7b89f08-c84f-e715-c029-5d093a5ae7e2.png)


作った BoxTrigger という項目を選択すると、右側に変数の「詳細」が表示されるので「変数の型」と書かれたプルダウンメニューを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/8e407f18-3a97-dd43-5da4-03c7d53e8f9b.png)

メニューの中から「オブジェクト」「Actor」「Object Reference」を選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/0a24946f-ef7d-c136-a1ae-a5eb8f15ba95.png)


すると、こんな感じで右側の「詳細」の下のほうに緑色の矩形の中に＋が白く書かれたボタンがたくさん出現する（はず）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/2009780b-89dd-8f09-95be-14a52d5bc274.png)


こうなったら、詳細の中にある「インスタンス編集可能」にチェックを入れる。**これをしないとコンパイル後にする操作ができない**。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/f1488de1-f295-361a-8035-5384708fdf11.png)

チェックを入れたら、上のメニューの一番左にある「コンパイル」を押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/96c7e62a-9d39-2e26-9513-347eb89e745e.png)

これでメインのウィンドウに戻って、CubeMesh_Blueprint を選んで、下の「詳細」のパネルの中を探すと、「デフォルト」というパネルの中に Box Trigger という項目が増えているはず。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/5fb6e532-b996-3fc2-e1b4-8ba71f8479be.png)

この **Box Trigger のプルダウンメニューから TriggerBox （最初にレベルに追加したボックストリガー）を選ぶ**。このデフォルト値の設定がとても重要。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/c0c98f33-4d1f-5682-1d6e-cdc693afb9a0.png)

これで、CubeMesh_Blueprint の中で TriggerBox のイベントを拾うことができるようになる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/bc68eebb-e2bc-49c4-4d5e-c6c6dde75f6e.png)

ついでに **CubeMesh_Blueprint のトランスフォームの「可動性」を「ムーバブル」にしておく**。これもとても重要。これをしないと、いくらプログラムを書いてもアクターは動いてくれない。

## BoxTrigger の範囲に入ったら発火するイベントを設置する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/4a147c59-5a5e-1963-8937-e9892ec3afd9.png)

 CubeMesh_Blueprint のブループリントエディタを出す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/1ca4f78b-816e-2e51-dd33-1ef67c2c28f4.png)

変数の BoxTrigger を選ぶと、右側の詳細の中に「イベント」が表示されるので、その中にある On Actor Begin Overlap という項目を探して、その右側の緑色のボタンを押す。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/5b73e908-dd5c-3ea4-af14-5c14086678c8.png)

すると、Target が BoxTrigger になった OnActorBeginOverlap イベントが追加される（はず）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/2c495383-bce6-cd4e-4b36-7c67e2e4dbcd.png)

同様にして、OnActorEndOverlap イベントを設置する。これで、BoxTrigger の範囲にプレイヤーが入ったり出たりしたときに、これらのイベントが発火するようになる。

ここまでで、この記事の主目的は達成されているのだけど、以下物体が動くところまで一応説明しておく。下記でやっていることを、位置の表現を float じゃなくて Vector でやってるところが違うだけ。

- [Unreal Engine 4 で正確に往復移動するオブジェクト（アクター）を作る](https://qiita.com/mml/items/be3f0b6c29b477bcc93a)

## ゲーム開始時に CubeMesh の初期位置を変数を保存する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/34eb1265-35f4-4c26-e7c4-48ab31c63d8e.png)


こんな感じでグラフを作る。

- 「変数」で DefaultValue という名前の変数を作り、変数の型を Vector にする。
- DefaultValue をイベントグラフの中にドラッグドロップして `SetDefaultValue" を選ぶ。
- イベントグラフの中で右クリックして GetActor と検索で打ち込むと、GetActorLocation という関数が出てくるので、それを選んで配置する。

あとは図のようにつなぐ。

## Timeline で CubeMesh の動きを作る。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/fa6fc021-4993-9503-d00d-13a4e07b9f39.png)

イベントグラフで右クリックしてメニューを出して、Timeline と入力すると、一番下に「タイムラインを追加する」というメニューが出るのでそれを選ぶ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/cb87401c-91e5-69e8-65f8-1a7f1b38010b.png)

タイムラインが追加されたら、ダブルクリックしてグラフを変数する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/66b87dc1-3519-6952-a71d-0bca81a0679c.png)

タイムラインを開いたら、ベクタートラックを追加する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/8b6d6fcb-0f28-168c-4c69-c229631d92de.png)

今回はZ軸（縦方向）にだけ動かしたいので、Z軸以外は非表示かつロックしておく。こうしておかないと、X軸が優先的に編集されるモードになってしまって、Z軸にポイントを追加することができない（他の方法あるのかな？）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/4ba03dce-1701-d0fe-8f0f-e3d88f5b97fb.png)

Shift+クリックでポイント追加できる。追加したポイントはドラッグして動かせる。ポイントを選択すれば、時間と値を直接入力することもできる。

時間が長すぎる場合は、「長さ」のところに数字を入れて、アニメーションの長さを変更する。ここでは2（秒）に変更してある。

ここまで、動かすだけなら問題ないのだけど、動きが直線的になってちょっといやなので、曲線かしてみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/3aa6743b-b242-8fc4-47df-6c902687c5aa.png)

ポイントの上で右クリックすると、グラフを直線化したり曲線化できるメニューが出る。ここでは Auto を選んでみる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/0009c9dc-87fa-fa66-d24d-5dbb08d1c98d.png)

水色の線を動かすと、曲線の曲がり方を調整できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/c863d441-4121-7672-99e6-3cbadb6a77c4.png)

曲がり方がいまいちなので、キーフレームを増やして曲線を調整してみた。このあたりは好みで…

## Timeline の値を使って CubeMesh の位置を変更する

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/de0643ae-54f8-d1b0-bf38-382c15fecb13.png)

あとはこんな感じで動く（雑）。Speed 変数には、デフォルトで 100 の値を入れておく。[Unreal Engine 4 で正確に往復移動するオブジェクト（アクター）を作る](https://qiita.com/mml/items/be3f0b6c29b477bcc93a) でやってることとだいだい同じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/c893aedc-e0ee-4305-5e58-b9b5e123e250.png)

これで、箱に近づくと箱が上に移動して、離れると箱が下がるはず。

# 余談

TriggerBox を Blueprint クラス化して、TriggerBox_Blueprint としておいてから CumeMesh_Blueprint の変数として、直接 TriggerBox_Blueprint を選んでもいけそうな気がするのだけど、どうしてもうまくいかなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/b513b181-d93d-0faa-820a-40dabf3fffb7.png)

こうして TriggerBox で「プループリント/スクリプトを作成」してから、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266247/e34390f2-2155-f878-bb67-81827c9954d5.png)

このように Triggerr Box Blueprint をダイレクトに参照すしようとすると、イベントが発火してくれない。Trigger Box Blueprint のほうを直接編集して OnActorBeginOverlap イベントの先に PrintText とかつなげると、ちゃんと Hello と表示されるので、イベント自体が拾えてないわけではなさそう（GenerateOverlapもチェック入れてるし）。

デフォルト値に TriggerBoxBlueprint を指定してもイベントは発火しない。何かちょっとした設定の問題なのか、根本的に誤っているのかよくわからない。

# 余談２

上記問題は、変数を「インスタンス編集可能」にして、メインウィンドウ側でデフォルト値を設定するとうまくいくようだ。