Let's Enjoy Unreal Engine

Unreal Engineを使って遊んでみましょう

UE4 スポーン時のアクター(SpawnActor)が動かない理由と対処方法

最近色々なところで『スポーンさせたアクター(SpawnActor)が動きません』という話を聞きます。これ、知っている人は知っていると思いますが、ほとんどの人はその理由すら知らないと思うので解説しておきたいと思います。

まず普通にアクターをスポーンさせる時にはTargetPointアクターなどで場所を指定し、その位置からスポーンさせたりといった事をやると思います。

f:id:alwei:20150622143503j:plain

実際のブループリントは以下のような感じです。

f:id:alwei:20150622145705j:plain

なぜかSpawnActorを使用してスポーンさせた場合にはキャラクターが落ちてこなかったり、全く移動しなかったりします。SpawnActorではなく、レベル上に直接配置すれば正常に動きます。これは一体なぜでしょう?

 AIControllerの有無

実行した時にレベル上に存在するアクターをみていると、スポーンさせた時とレベルに配置させた時で状況が違っています。

f:id:alwei:20150622144232j:plain

AIControllerというものが存在しています。これは直接スポーンさせた時には発生していません。ではAIControllerとはなんなのでしょう?

docs.unrealengine.com

ということで、AIControllerとはワールドの入力を監視し、Pawnアクターに伝えるものです。この中には重力の情報やその他様々な情報があるはずです。

更にPawnとはなんでしょう。

docs.unrealengine.com

Pawn クラスはプレイヤーまたは AI によって制御可能な、すべてのアクタのベースクラスです。ポーンは、ワールド内のプレイヤーまたは AI エンティティの物理的表現です。

そしてサラっと重要な事が書かれています。

デフォルトで、コントローラー とポーンは 1 対 1 の関係です。つまり、各コントローラーは常にポーンを 1 つだけ管理します。また、ゲームプレイ中にスポーンされたポーンは コントローラーに自動的に所有されません。

つまりスポーンされたポーンはコントローラーが所有されないらしいです。これが動かない原因でしょう。

AIControllerを所持しないポーンというのは、ワールド内の情報を自動的に取得する事ができず、ワールドの重力や摩擦を計算できないので、結果的に動く事ができません。ただし、Set Actor Locationなどのワールドの情報に依存しないものであればこの限りではありません。

なぜスポーンされたアクターにはAIControllerがないの?

理由は単純。ほとんどのアクターにはAIControllerなどのコントローラーの情報が不要だからです。

全てのスポーンされたアクターにAIControllerをもたせる事は非常に無駄であるからという事は考えてみればすぐにわかると思います。

ほとんどのアクターは動く必要のない単なるスタティックメッシュの可能性が高いので。

じゃあスポーン時にどうやって対処すればいいの?

実は簡単な対処方法があります。AIControllerつきのポーンをスポーンさせる専用のノードが存在しています。

f:id:alwei:20150622145928j:plain

"SpawnActor"から"Spawn AIFrom Class"というノードを使用します。これだけでAIControllerつきのポーンが生成されるようになります。ただし、全ての機能がSpawnActorと同等ではないという事にご注意ください。

こういった事は基本的な事ではあるのですが、なぜそうなっているのか理由を知らないという人も多いと思うので簡単に解説してみました。

追記

おかずさんがSpawnActorでの解決方法をツイートされていたので引用しておきます。