読者です 読者をやめる 読者になる 読者になる

妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

ActorComponentのシンプルな活用法

UE4.13 ブループリント

妹「ActorComponentってのがよくわからないんだよ。2回ぐらい挑戦したみたんだけど、やっぱりよくわからん」

「どういうことをやろうとしてるの?」

妹「クラスの継承を使わずに同じことをする……みたいな? 多分コンポーネントを作れば出来ると思うんだけど」

「ActorComponentはコンポーネントの基底クラス、一番の先祖だから、コンポーネントは全部これを継承して作ってるらしい」

f:id:una_unagi:20161018221536p:plain

妹「他のコンポーネントとは別の、アクターにくっつけて使う役割のコンポーネント、って意味じゃなかったのか……」

「そういう風にも使えるけど、どっちかというとこれは、単品では何もしないっていうコンポーネントだね」

妹「SceneComponentはなんかしてるの?」

「Sceneも何もしてはいないんだけど、XやYを設定したり、倍率設定は出来るから、それによって子のコンポーネントの表示が変わる。ActorComponentにはそういうのもない」

f:id:una_unagi:20161018222007p:plain
f:id:una_unagi:20161018222038p:plain

「これがさっき作ってみた簡単なコンポーネントの制作例なんだけど、まずコンポーネントにあるイベントTickに、やりたいことを書く。今回の場合はちょっとずつ下に移動させる処理を書いている。GetOwnerを使うことでその時にくっついてるアクターの情報が取れるからそこで座標とか操作する」

妹「くっつき方が普通のコンポーネントと違うような。親子になってないというか」

「SceneComponentを継承してる場合は、SceneComponent同士の親子関係のどこかにくっつくけど、そうでないやつは親子じゃなくて兄弟扱いになる。MovementComponent系もそう」

妹「そういえば下に移動させるっていうのは、これMoveComponentになるのでは?」

「MovementComponentを継承してるわけではないから一応別物。普通にActorのイベントTickで動かすのと同じ。多分MovementComponentを継承して作るのが正しいんだけど、今のところブループリントからではそれが出来ない」

妹「どう違うの?」

「他にアクターを動かす要素がなければどっちでも一緒だと思うけど、例えば物理とか併用すると動作が違ってくるかも。C++ソースコードをチラッと見た感じだと、フィジックスがどうのこうのって書いてあったから」

妹「うーん、わたしとしてはTickじゃなくて、必要な時に呼び出すやつがいいんだけどな。例えばコンポーネントに関数を作っておいて、それを色んなクラスから呼び出すってのは?」

「それはあんまり考えたことなかった。アクターにくっつけて、数値を設定するっていうのがコンポーネントがよくある使い方だけど、出来なくはないと思う。でもマクロとかでもいいのでは? 例えばActorクラス用のマクロライブラリを作れば、どのActorからでも呼び出せる。マクロと関数は同じではないけど」

妹「うーん、なんかこう、わたしの思った使い方が上手く伝わってない気が」

C++やブループリントではむずかしい考え方なのかも。他のプログラミングでいうコレのことって言われればわかるんだけど」

妹「それだとわたしの方がわかりませんぞ」

「空想上のブループリント図みたいなのがないと駄目かなあ」