おーみんブログ

C#, ASP.NET Core, Unityが大好きです。

【Unity】ホーミングミサイルの作り方。

 f:id:bookreadkun:20190311072233p:plain

おはようございます。おーみんです。

 

現在Unityでゲームを制作中です。

今回はホーミングミサイルの作り方について解説していこうと思います。

 

まずは完成した動きを見てみましょう。

 

 

仕組みとしては、マウスカーソルを相手に被せるとロックオンのマークが出現し、ロックオンされている間にミサイルを撃つと、その相手の方向へミサイルが飛んでいくという感じです。

 

ただし、一度ミサイルを撃つとターゲットを外されないためにもその相手をずっと追う必要性があります(80年代の戦闘機のミサイルはそんな感じだったので、僕が作ったホーミングミサイルはその時代レベルということになりますw)。

 

それではロックオンの画像やミサイル自体の作り方はまた今度やるとして、今回は「ミサイルが相手に飛んでいく仕組み」に絞って見ていきたいと思います。

 

以下がミサイルの動きについての関数になります。

f:id:bookreadkun:20190311073528p:plain

 

まず2、3行目ではRayの設定です。マウスカーソルをかざした部分からRayが出るようになっています。

 

5行目以降はそのRayがヒットした際の処理です。6行目のif文で「Rayにヒットした物体のタグ名がEnemyかどうか」の判定をします。Enemyタグを付けるのはもちろん敵の戦闘機ですね。

 

7行目は一旦飛ばして、8行目の「isTrue」はbool関数です。初期設定ではfalseに設定していますが、Rayが敵にヒットした際にtrueに変わるようになっています。

なぜbool設定してるの?と思うかもしれませんが、Update関数にて、isTrueがfalseの時とtrueの時で処理を変えているからです。isTrueがtrueになった際に今回載せているLockon関数が発動されます。

 

9行目はプログラムがちゃんと動いているか確認のためにDebug.logで確認。

11行目はミサイルの位置をrayのヒットした物体へ移動させています。この際に使っているVector3.MoveTowards関数はかなり便利なので覚えておきましょう。

 

Vector3.MoveTowards(現在地、目的地、移動速度)になります。

 

13、14行目ではRayがヒットしていないときにisTrueをfalseに戻しておきます。

 

さて、7行目以外は全て解説しました。

実際に7行目抜きでもミサイルは飛びますし、Rayが当たった相手に向かってしっかり飛んでいきます。

 

しかしながらこのスクリプトだと・・・例えばミサイルが相手を通り過ぎた後にロックオンしても再び戻ってきて敵機を撃墜してしまうんですよねw

 

イメージが湧くでしょうか?一度当たらなかったミサイルが再びロックオンすることで戻ってくるんです。

 

これではミサイル全部がブーメランミサイルになってしまい、ちょっと現実から離れてしまうので、7行目のif文を入れています。

 

ミサイルのスピード(speed変数)は少しずつ速度が上がるようになっています。ですので、そのspeedがある一定速度に達したらrayが当たっても反応しないという風に設定したんですね。今回のスクリプトだと210.0fを超えるとロックオン機能は発動しないことになっています。

 

ということで、これでミサイルの動き自体のスクリプトは完成です。

ロックオン画像やミサイルの作り方などは、またいつかの機会にやろうかな。

 

ではでは、何か質問等がございましたらコメントかTwitterでお待ちしております。