妹、相対的に考える
妹「Vectorの中身を部分的に残したい時はGETしてSETするのはわかったけど、じゃあRelativeとか言うのはなんなのだ? 相対的に設定するんじゃないの?」
「相対的ではあるんだけど、妹が思ってるやつはたぶんOffsetの方が近いと思う。Actorには座標を操作する関数が4つあって、それぞれ性質が違う。とりあえず説明しやすい座標(Location)の話するけど、ScaleとかRotationも似たような感じのがある」
- SetActorLocation(ワールド座標)
- SetActorRelativeLocation(親との相対座標)
- AddActorWorldOffset(ActorLocationを指定した数だけ増やす)
- AddActorLocalOffset(RelativeLocationを指定した数だけ増やす)
妹「親というのは?」
「右上にあるアウトライナで設定した、アクタ同士の関係。ドラッグしてくっつけると、ツリー状にぶらさがる感じになって、折りたためるようになるというか」
妹「うーん、チュートリアルの時にそんなことをしたような、しなかったような」
「で、下にぶらさがってる方を子と言うんだけど、親が動くと子もそれに連動して動く性質がある。移動の時は一緒に移動するし、回転の時も親の中心点を基準に回る。テープとかでくっつけてあるのと同じ状態だけど、見た目くっついてるとは限らないから、透明の針金でくくりつけてあるようなイメージ。子の子、つまり孫は両方の影響を受ける」
妹「それと相対的なのとはどういう関係が?」
「SetActor"Relative"Locationっていうのはこの親との相対的な位置関係なんだよ。親から10cmとか設定する。同じ数字をSetActorLocationで設定するだとレベル全体の中心点から10cmの地点になる」
妹「子じゃなくて親の方にRelativeで設定するとどうなるの?」
「他に親がないアクターの親はレベル全体ということになるから、つまりSetActorLocationと同じになる。レベル自体が基準の座標のことをワールド座標とか、絶対座標とか言う。逆に親子関係が全体の座標をローカル座標という。親が動くとワールド座標では子も動いてるけど、ローカル座標で見ると全然動いてない」
妹「結局親と子になってなければ、どっちでも結果は同じなのか」
「そういうこと。Relativeは親子のアクターの相対的関係を表してる」
妹「じゃあOffsetは?」
「今のアクターの位置からの相対的位置。その時どこに居るとしても、0だとその場を動かない。10cmなら10cm動く」
妹「んん? そうするとOffsetはなんで2種類あるの? 今の場所から10cm動くって、別に親があったもなくても関係なくない?」
「移動しかしてなければそうなる。ただ親アクターが回転してると違ってくる。同じX軸を10cm移動するという設定でも、もし親が回転90度回転してた場合、RelativeだとZ軸が増えるという結果になることもある」
妹「どっちを使ったらいいの?」
「基本的には子のアクターの場合RelativeやLocalOffsetを使うのが望ましいと思う。親子にしてるってことは基本的に連動させたいはず。そうでない場合は、そもそも親子にしなくていいし。ワールド座標の方が書きやすいと思った時だけ使えばいい」
妹「親子って言えば、コンポーネントにも親子無い?」
「あるよ。コンポーネントの場合は、レベルの子のアクターの子になる。さらに子のコンポーネントも追加出来る」
- SetWorldLocation ワールド座標
- SetLocalLocation 親との相対座標
- AddLocalOffset LocalLocationを指定した数だけ増やす
- AddWorldOffset WorldLocationを指定した数だけ増やす
「名前が微妙に違っててややこしいけど、アクターの場合と同じように関数が4種類ある。使い方も同じ」
妹「そうすると? 子は親のコンポーネントの影響も受けるの?」
「いやそうはならない。あくまでアクターの子だから。親から見ると、子アクターもコンポーネントも同じ子で、2つは兄弟の関係になる。だからアクターの大きさを変えると子にも影響するけど、コンポーネントの大きさを変えればそうはならない」
妹「コンポーネントの子も親コンポーネントの影響を受けるんだよね?」
「受ける」
妹「わかったような、わからないような……」
「全部覚えなくても、色んな方法があるってのだけ覚えておいて、見た目が変な時にそのへんを調べれみればいいと思うよ」
妹「あ、そういえば、これScaleでも使えるんだよね? AddActorLocalScale……みたいなのをすれば、昨日のやつも簡単に書けるんじゃないの?」
「そういう名前の関数はないんだけど、Transformを加算出来る命令はある。ただタイムラインから出てくる数字も相対値にしないといけないから、前回のZを記録して、それとの差をZに設定しないといけないから、ノードの数は変わらない気がする」