ゲーム開発を試してみようと思い立ち、Unreal Engine 5をインストールして開発する過程で調べてみた部分を備忘録的に投稿します。今回はゲーム画面にスポーンしたアクターにGetActorLocationで正常に位置が取得できない時の対処法です。
GetActorLocationで正常に位置が取得できない
2Dの落ち物ゲームを作っていた時に遭遇した現象です。
落下するアクターをブループリントクラスの[BP_Block]として[PaperSprite]コンポーネントに適当なスプライト画像を設定して作成。
キャラクタークラスのイベントグラフで、適当な場所に[SpawnActor]でスポーンします。
その後に[Set Simulate Physics]関数で[Simulate]を有効にしてアクターに重力を設定して落とします。
この状態で[GetActorLocation]関数でアクターの位置を取得してみます。
[SpawnActor]関数でスポーンした直後で取得した位置がこんな感じ。
その後に[Simulate Physics]で落とした後で取得した結果がこれです。2Dのレベルを使用しているので、Xが横軸でZが縦軸です。
つまりスポーンした位置が取得されているようです。
Unreal Engineのドキュメントで[GetActorLocation]を調べてみると、。
Returns the location of the RootComponent of this Actor
GetActorLocation より
GetActorLocationで戻される値は[RootComponent]のようです。
取得先のアクターのクラスを確認すると[RootComponent]は[DefaultSceneRoot]になっています。
深く検証してませんが、レベルにスポーンした時には[DefaultSceneRoot]コンポーネントと[PaperSprite]コンポーネントが指定した位置に配置。
その後に[Simulate Physics]を有効にすると[PaperSprite]コンポーネントのみが落ちているようです。
そう考えると、GetActorLocationでスポーンした位置が取得されるのも腑に落ちます。
[RootComponent]を変更
ブループリントを作成した際にデフォルトで設定される[DefaultSceneRoot]などを利用している場合は使えませんが[RootComponent]を[PaperSprite]コンポーネントに変更することでGetActorLocationで現在の位置情報が取得できるようになります。
具体的には次の手順で行います。
1. アクターのブループリントクラスを開いて[コンポーネント]画面の[PaperSprite]をマウスで[DefaultSceneRoot]にドラッグします。
2.[DefaultSceneRoot]が削除され[PaperSprite]がコンポーネントのルートに変更されます。
この状態で、GetActorLocationで位置を取得すると、こんな感じで正しく取得できています。
まとめ
今回は、Unreal Engineのゲーム実行画面で、GetActorLocation関数でスポーンしたアクターの位置情報が正しく取得できない際の原因と対処法について書きました。
GetActorLocation関数で取得される位置は、ブループリントクラスで設定されている[RootComponent]が戻されます。
そのためレベルにアクターをスポーンした後に物理シミュレーションなどで移動があった場合には意図しない位置が戻される場合があるようです。
取得したいコンポーネントを[RootComponent]に設定することで、GetActorLocation関数で正しい位置情報が取得できます。
Unreal Engineのゲーム開発でGetActorLocation関数でアクターの位置情報が正しく取得できない人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。
全く同じ悩みを持っておりネットで情報あさっていたらたどり着きました。この記事のおかげで無事に解決いたしました。本当にありがとうございます!!!
コメントありがとうございます。
記事がお役に立てて嬉しいです!