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

妹でもわかるUnrealEngine4

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

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

アクタをちょっとずつ目的地に近づける方法

デバッグ ブループリント コンピューター全般 アルゴリズム 2Dゲーム

妹「ヒット問題が解決したのはいいんだけど、ルートにSceneがないとMoveComponentToが動かないなあ」

「そもそもなんでコンポーネント動かしてたの? この場合アクタごと動かしてもいいのでは」

妹「コンポーネントを動かしたかったわけじゃなくて、MoveComponentToを使いたかったんだよ。なんか色々パラメータ付いてて動かしやすそうだったから。SetActorLocationだとワープしちゃうし。MoveActorToがあればそれを使っている」

「じゃあアクタを動かすようにシンプルにブループリントを書いてみる」

f:id:una_unagi:20150811002034p:plain

「まず最初に2つのアクタのLocationを引き算して、どれぐらい離れてるかという相対位置を調べる」

妹「相対位置を調べるのにはConvert Transform to Relativeってノード見つけたんだけど、これは使わなくていいの?」

「別に使ってもいいとは思うけど、このノードは親側の回転とか拡大縮小とかが結果に影響するような場合に便利な物で、普通に位置関係を見るだけなら引き算で十分だと思う」

妹「引き算の順番は?」

「目的地から現在地を引く。逆にしてた場合は反対方向に動くようになるからわかる」

妹「その次のNormalize(ノーマライズ)って書いてあるノードは?」

「正規化という意味なんだけど……Vectorの場合だと、XYZが0の位置から、向きはそのままで長さを1にしたVectorを返すノード。UE4の場合1の長さを1cmとしてるから、1cmのVectorになる」

妹「言ってる意味がよくわからないんですが……」

「例えばX:100,Y:0,Z:0というVectorは、X軸プラス方向にまっすぐ100cm伸びてる矢印だと考えられる。それを正規化するとX:1,Y:0,Z:0になる。方向は同じで長さだけ1cmの矢印に変わる。斜めとかに傾いてる場合も同じように長さだけ1cmになる。短い場合は逆に伸ばして1cmにする。全方向0の時だけは、向きが無いから正規化しても0cmになる」

妹「なんか難しいなあ。そしてそれに5を掛ける?」

「1cmの長さのVector……単位ベクトルと言うんだけど、これを5倍してるから、つまり5cmになる。ちなみにVectorとFloatの掛け算は、VectorのX,Y,ZのそれぞれにFloatの数字を掛けたのと同じ意味になる。Vector同士の掛け算ノードにして、X:5,Y:5,Z:5のVectorを掛けてもいい」

妹「AddActorWorldOffsetはこないだなんか言ってた気がする。今居る場所から相対的に動くやつだったような」

「そう。なのでこのブループリントは全体として、プレイヤーキャラクターが居る方向に5cm動く、というプログラムになってる。ティックイベントで動かせば徐々に近づく感じになる。実際は5cmにしたVectorに、イベントティックにあるDelta Secondsも掛けて速度調節した方がいいんだけど」

f:id:una_unagi:20150811004947g:plain

「実際に動かすとこうなる」

妹「おお。ちゃんと動いて、障害物にもブロックされている」

「このノードにもSweepがあるからそれをTrueにしてある。だけどこういう敵キャラの場合ブロックされたら駄目な気がしないでもない。壁をOverlapするか、ナビメッシュで避けるかした方がいいような」

妹「そのへんはテスト段階だから。でもナビメッシュって地面を歩いてるやつでしか使えないんじゃないの? なんか前に試した時に上手く行かなかったし。サンプルもそういうのばっかりだったけど」

「使えると思うんだけどな。空中を浮くキャラとかもよくあるんだし。多分こうやってノード組むよりも、ナビメッシュとかビヘイビアツリーとか使うのがオシャレだと思う」