CC2の楽屋裏

ゲーム制作会社サイバーコネクトツー公式ブログ

*

第002回 アクタのトランスフォームの実態

   

皆さんストラーズドヴィーチェ(ロシアのあいさつ)!
今回の担当は、新人プログラマの親泊です。
UE4の内部処理を探求していこうと思います。
よろしくお願いします。

アクタのトランスフォームの実態

アクタのトランスフォームについて、私がUE4のプロジェクトに配属された当初、勘違いしていた点についてお話をします。恐らくUE4を初めて触った方や、ブループリントのみで作成している方は、同じような勘違いされやすいのではないかと思います。

さて、UE4には2つのトランスフォームを設定するブループリントノードがあります。

SetActorTransform
tb002_00SetRelativeTransform
tb002_01

それぞれ、アクタとシーンコンポーネントに対して、トランスフォームを設定するノードです。同じ機能のC++の関数もあり、それぞれ AActor::SetActorTransform()、USceneComponent::SetRelativeTransform() になります。

機能を見る限りは、SetActorTransform() は アクタのトランスフォームを、SetRelativeTransform() は シーンコンポーネントのトランスフォームを変更する、という動作イメージになるかと思います。
SetActorTransform()という関数名だったら「あーActorのTransformをSetするんだー。(素直な心)」って思いますよね? SetRelativeTransform()も何かしらのコンポーネントを設定しなければならないので「あーコンポーネントの相対位置をSetするんだー。(素直な心)」と思いました。

tb002_02

実際はどうかというと、それは間違いでした。

間違いに気づいたきっかけは、同じ SetActorTransform でも、アクタによって動作が違うことがあったからです。

C++のソースコード見るとわかるのですが、アクタはトランスフォームをそもそも持っていません。では SetActorTransform は何をしているかというアクタが持つルートコンポーネントに対して SetWorldTransform() を呼び出しているだけです。(他のSetActor~()関数も同じ)。
tb002_14

つまり、アクタに対しての操作しているように見えて、実はそのアクタのルートコンポーネントに対して操作をしているという事になります。
tb002_03

では、それを分かりやすく試してみましょう。

まず、階層が違う2つのアクターを用意します。
左が自作クラス(ルートコンポーネントにシーンコンポーネントを追加)。
右がUnreal Engineの既存クラス(AStaticMeshアクタ)です。
tb002_04

この2つのアクタに全く同じ内容のファンクションを作ります。

1.SetRelativeRotationでアクタの持つスタティックメッシュコンポーネントの角度を変更する関数です。
tb002_08

2.SetActorRotationでアクタの角度を変更する関数です。
tb002_07

これらを1,2の順で呼び出します。どうなるか予想してみてください。

まず2つのブループリントを同じ向きに配置します。
左がAStaticMeshActor、右が自作のクラスです。

tb002_09

まず椅子のStaticMeshComponentを回転させます。
角度はPitch方向に45度です。

tb002_10

椅子が45度傾きました。

tb002_11

ここまでは同じ動きをしています。
次にSetActorRotationでYaw方向に90度回転させましょう。

tb002_12

結果:全く同じ処理が走ったはずなのに違う結果が出てきました。

左(AStaticMeshAcor)は最初に傾けた45度が0度になっていますね。
右(自作クラスのアクタ)は椅子が45度傾いたままになっています。

tb002_13

どうでしょうか?予想通りの結果でしたか?
この結果からSetActorRotationがルートコンポーネントを書き換えていることが分かったと思います。

この様にアクタが持つコンポーネントの構成によって、トランスフォームの操作結果が思わぬ結果になる場合があるので皆さん気をつけてください。アクタを作る際にはルートコンポーネントには何を割り当てるのか、ルールを決めて作らないと後々困ることになるかもしれません。

まとめ

  1. アクタはトランスフォームを持っていない。
  2. アクタに対する、SetActorTransform は、アクタのルートコンポーネントに対して行っている。

おわりに

今回のTechBlog、いかがだったでしょうか?
ゲームプログラマーは内部処理を追い、エンジンを正しく理解することがトレンドになりつつあります。
UE4はエンジンソースが公開されているので、学生の方も是非コードを追ってみてください。

皆さんのご意見、ご要望をお待ちしています。下記 CC2技術ブログのメッセージフォームにて、お気軽にお問い合わせください。

「CC2技術ブログ」へのご意見・ご要望はこちらから

 - CC2技術ブログ , ,

  関連記事

tb004_15
第005回 Tick関数がどう処理されているかUnrealC++を追ってみよう!

皆さんグーテンターク(ドイツのあいさつ)! CC2TechBlog今回の担当は新 …

tb004_09
第004回 UE4のアセットを一括修正する

ツール系テクニカルアーティストのしばはらです。 プロジェクトが進んで、ある程度ア …

第001回 UE4のコンテンツブラウザフィルターを自作する

はじめまして サイバーコネクトツーでツール系テクニカルアーティストをしております …

第003回 UE4のショートカットキーの仕組み

今回は ツール系テクニカルアーティスト しばはらがお送りします。 突然ですが、P …

CC2技術ブログ
第006回 コマンドラインからConfig設定を上書きする時の注意点

皆さん、こんにちは。サイバーコネクトツーでテクニカルサポートのマネージャーをして …