妹でもわかるUnrealEngine4

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

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

妹、発射した弾が行方不明になる

妹「弾を発射するブループリント作ってたんだけどさ、弾が全然出てこなくて、結局出てないんじゃなくて、+と×を間違えてたせいで変なとこ飛んで行ってた……という話なんだけどね。大変な目にあったよ」

「じゃあその直し方についてブログに書いときましょうか」

妹「+と×は見間違えないようにしましょう?」

「そうなんだけど、そういう話ではなく……今回の原因はともかく、発射した弾が見つからないというのはよくある事だから、その調査方法というか」

妹「よくある事なのかよ!」

「よくあるよ。物を出したい場所に出すというのは結構むずかしい……とりあえずおかしかった時の状況に再現するために、+のところを×に戻して、こうなってたの?」

f:id:una_unagi:20150530214021p:plain

妹「そうそう。ちなみにこれもUE4学び部屋を見ながら作った。そしてよく見たら写し間違えていたんだ」

manabibeya.com

「まず弾が出ないトラブルは大きく分けて2パターン、弾が出てないケースと、弾は出てるんだけど見えてないケースがある」

妹「今回は場所がズレてただけで、弾自体はあったんじゃないの?」

「結果的にはそうだった。弾が出てるというのを確認するには、UE4の場合アクターアウトラインのところを見ると良いと思う」

f:id:una_unagi:20150530214026p:plain

「ここを見ると、左クリックを押す毎にアクタが増えてる事がわかる、つまり弾は出てる。出てるけど見えてないということになる」

妹「あ、それはやってる時も気付いたよ。アクタが増えてるって」

「それがわかれば、次の見えてない理由探しの段階にうつれる」

妹「もしアクタが増えてなくて、弾自体出てないってなった時はどうするの?」

「出た瞬間に消えるパターンもあるけど、UE4の場合消えた後しばらくはリストに残ってる。ここに反応がないということは本当に出てない。だから弾を出す所…SpawnActorノードの前後に、ブレークポイントを設置したり、print stringしたりして、本当のそのノードが実行されてるか調べる」

妹「それでも上手く行かなかったら?」

「バグの可能性も疑いつつ、サンプルプロジェクトとかでSpawnActorを使ってるものが正常に動くか調べる。複雑な仕組みならシンプルにして実験する。それで駄目なら他の人に聞くしかないけど、大抵の場合何か見落としがある」

妹「まあ今回はそっちではなかったと」

「で、弾が見えてないケースだけど、これもいくつかのパターンがある」

  • 弾の場所が違う
  • カメラが場所や向きが違う
  • 表示設定が違う
  • 背景に紛れ込んでる

「この他にゲームエンジンのバグってのもあるけど、そのバグがどういうバグかを考えていくと、結局この4パターンのどれかになる」

妹「今回は弾の場所が違うやつだったのかな?」

「そう。それを確認するには、一時停止してアクタの現在地を見る。実行中にマウスで一時停止するの大変だから、事前にショートカットキーを設定した方が良さそう。今回はとりあえずF7にした」

f:id:una_unagi:20150530221537p:plain

妹「よし、一時停止して…と。うーん、XYZの数字はあるけど、これ見てもよくわからないなあ」

「じゃあF8キー(もしくはイジェクトのアイコン)を押して、エディタ側にカメラ操作をうつす。こうすることでゲーム本来のカメラを無視して、エディタ操作の時と同じ視点操作でゲーム状況を把握出来る」

妹「なんか裏技みたいだ」

「その状態で、リストの中のprojectileほにゃららを右クリックして、"ここへ移動"を押す」

f:id:una_unagi:20150530220339p:plain

妹「あ、なんにもないとこに弾だけ浮かんでる!」

「これで、弾は出てるけど、全然違うところに出てる事がわかった。後は弾の場所を決めるノードを見なおしたり、print stringでXYZの変化を表示したりしてデバッグしていけば、そのうち+と×のあたりがおかしいのに気づける」

妹「なるほど……なんか凄いハイテクな気がする」

「ハイテクだよ。昔だったらprint stringみたいなのをひたすら繰り返してるとこだから」

妹「他の3パターンだった時の対処法も聞いておきたいんだけど……」

「他のパターンだった場合、さっきの操作をすると弾がありそうな地点、他のキャラクタとか背景とかある場所に移動するはず。そしてエディタ上でちゃんと見えてるか確認する」

妹「あるのに見えないってどんな状況?」

「例えば黒い背景に黒い弾とか、完全に透明なマテリアルが設定されてるとか、これが背景に紛れ込んでるパターン。エディタ画面から色んな角度で見たり、背景を消したり、別のマテリアルを設定したりして確認する」

妹「ふむふむ。それは設定すれば直せそう」

「表示設定が違うというのは、詳細欄のRenderingで、Visibleのチェックが外れている場合。これも見えなくなる。ゲーム画面に切り替えると急に見えなくなる場合は、Visibleの下にあるActor Hidden In Gameにチェックが入ってる可能性がある」

妹「それはチェックを正しくしておけばいいのか?」

「SpawnActorの後に設定が変更された可能性もあるから、その辺のノードにあやしいのがないか見る。あと大きさの倍率が極端に大きかったり小さかったりという可能性もある。これも一時停止状態でよく調べてみればわかるはず。」

妹「カメラ原因説というのは?」

「当然カメラの向きが違ったら表示されないけど、その場合キャラクタとかも見えなくなったりしてすぐわかるはず。ただカメラの細かい設定で見えなくなってる可能性がある」

ボリュームに関するユーザーガイド | Unreal Engine

「ここに書いてあるCull Distance Volumeとか……何かの事情でカメラの設定をいじってなければ問題ないはずだけど、一応可能性の話として」

妹「ふーん、なかなか大変なんだな。まあ今回は×を+と修正して一件落着と」

「カチカチ、うん、弾は出てる。……弾は出てるけど、なんか横向いてる時に撃つと弾が脇から出てるのはいったい……」

妹「ほえ!? いや、でもサンプルがそうなってるんだから、それでいいんじゃ……」

「なんかおかしい。キャラクタの角度じゃなくてカメラの方向に発射してる。弾の角度を決めてるのは……Get Control Rotation? 雰囲気的にはGet Actor Rotationってのがありそうな……あるね。じゃあこれに入れ替えてと……直った」

妹「えー! でもサンプルはたしかにそうなって……ないね。Get Actor Rotationって書いてあるね。うわーん、また失敗だよ!」