第002回 アクタのトランスフォームの実態
皆さんストラーズドヴィーチェ(ロシアのあいさつ)!
今回の担当は、新人プログラマの親泊です。
UE4の内部処理を探求していこうと思います。
よろしくお願いします。
アクタのトランスフォームの実態
アクタのトランスフォームについて、私がUE4のプロジェクトに配属された当初、勘違いしていた点についてお話をします。恐らくUE4を初めて触った方や、ブループリントのみで作成している方は、同じような勘違いされやすいのではないかと思います。
さて、UE4には2つのトランスフォームを設定するブループリントノードがあります。
SetActorTransform
SetRelativeTransform

それぞれ、アクタとシーンコンポーネントに対して、トランスフォームを設定するノードです。同じ機能のC++の関数もあり、それぞれ AActor::SetActorTransform()、USceneComponent::SetRelativeTransform() になります。
機能を見る限りは、SetActorTransform() は アクタのトランスフォームを、SetRelativeTransform() は シーンコンポーネントのトランスフォームを変更する、という動作イメージになるかと思います。
SetActorTransform()という関数名だったら「あーActorのTransformをSetするんだー。(素直な心)」って思いますよね? SetRelativeTransform()も何かしらのコンポーネントを設定しなければならないので「あーコンポーネントの相対位置をSetするんだー。(素直な心)」と思いました。
実際はどうかというと、それは間違いでした。
間違いに気づいたきっかけは、同じ SetActorTransform でも、アクタによって動作が違うことがあったからです。
C++のソースコード見るとわかるのですが、アクタはトランスフォームをそもそも持っていません。では SetActorTransform は何をしているかというアクタが持つルートコンポーネントに対して SetWorldTransform() を呼び出しているだけです。(他のSetActor~()関数も同じ)。
つまり、アクタに対しての操作しているように見えて、実はそのアクタのルートコンポーネントに対して操作をしているという事になります。
では、それを分かりやすく試してみましょう。
まず、階層が違う2つのアクターを用意します。
左が自作クラス(ルートコンポーネントにシーンコンポーネントを追加)。
右がUnreal Engineの既存クラス(AStaticMeshアクタ)です。
この2つのアクタに全く同じ内容のファンクションを作ります。
1.SetRelativeRotationでアクタの持つスタティックメッシュコンポーネントの角度を変更する関数です。
2.SetActorRotationでアクタの角度を変更する関数です。
これらを1,2の順で呼び出します。どうなるか予想してみてください。
まず2つのブループリントを同じ向きに配置します。
左がAStaticMeshActor、右が自作のクラスです。
まず椅子のStaticMeshComponentを回転させます。
角度はPitch方向に45度です。
椅子が45度傾きました。
ここまでは同じ動きをしています。
次にSetActorRotationでYaw方向に90度回転させましょう。
結果:全く同じ処理が走ったはずなのに違う結果が出てきました。
左(AStaticMeshAcor)は最初に傾けた45度が0度になっていますね。
右(自作クラスのアクタ)は椅子が45度傾いたままになっています。
どうでしょうか?予想通りの結果でしたか?
この結果からSetActorRotationがルートコンポーネントを書き換えていることが分かったと思います。
この様にアクタが持つコンポーネントの構成によって、トランスフォームの操作結果が思わぬ結果になる場合があるので皆さん気をつけてください。アクタを作る際にはルートコンポーネントには何を割り当てるのか、ルールを決めて作らないと後々困ることになるかもしれません。
まとめ
- アクタはトランスフォームを持っていない。
- アクタに対する、SetActorTransform は、アクタのルートコンポーネントに対して行っている。
おわりに
今回のTechBlog、いかがだったでしょうか?
ゲームプログラマーは内部処理を追い、エンジンを正しく理解することがトレンドになりつつあります。
UE4はエンジンソースが公開されているので、学生の方も是非コードを追ってみてください。
皆さんのご意見、ご要望をお待ちしています。下記 CC2技術ブログのメッセージフォームにて、お気軽にお問い合わせください。
関連記事
-
-
第006回 コマンドラインからConfig設定を上書きする時の注意点
皆さん、こんにちは。サイバーコネクトツーでテクニカルサポートのマネージャーをして …
-
-
第001回 UE4のコンテンツブラウザフィルターを自作する
はじめまして サイバーコネクトツーでツール系テクニカルアーティストをしております …
-
-
第005回 Tick関数がどう処理されているかUnrealC++を追ってみよう!
皆さんグーテンターク(ドイツのあいさつ)! CC2TechBlog今回の担当は新 …
-
-
第003回 UE4のショートカットキーの仕組み
今回は ツール系テクニカルアーティスト しばはらがお送りします。 突然ですが、P …
-
-
第008回:ゲームクリエイターは破壊表現が好き。
皆さんボンジョルノ(イタリアのあいさつ)! 乱読派プログラマ親泊です。 現代ゲー …
-
-
第007回UE4のアセットの参照方法について、そのロードの違い
皆さんボンジュール(フランスのあいさつ)! ランダムのスペルが覚えられないプログ …
-
-
第004回 UE4のアセットを一括修正する
ツール系テクニカルアーティストのしばはらです。 プロジェクトが進んで、ある程度ア …
- PREV
- 東京スタジオより、今週のオススメ
- NEXT
- 東京スタジオ『CEDEC 2018』