LT会
ホーミングショット
公開日:
2020/03/28
ホーミングショット

はじめに

こんにちは、こんばんは、おはようございます。2020年4月から新2回生になります、Ryoと申します。
自己紹介終わり。
今回は、2Dゲーム制作とかで使えそうな「ホーミングショット」の簡単な?作り方の一例の紹介です。
と言っても私が知らないだけで、もしかしたらネットで以下の内容とほぼ同じものや、もっと良いものが書かれている可能性は大いにあると思いますが許してください。
また、筆者は現時点でUnityを用いたゲーム制作を行ったことがないため、実際は考慮する必要のないことを書いているなどといった場合もございます。重ねてご了承くださいませ。

ホーミングショットとは

撃った方向に真っすぐ飛んでいくショット(弾)とは違い、動き続けるプレイヤーの自分や敵キャラを追いかけるように飛ぶショットのことです。ゆっくり追尾してくるアレです。

作り方

どこまで詳しく書くべきで、どこを省略するべきかなどが分からないので、その辺はテキトーです。
以下では既にあるキャラ(敵など)によって撃たれたホーミングショットの「動き方」について考えていきます。

基本的な部分

  1. 「(狙う対象キャラの座標)ー(ショット自身の現在のピクチャ座標)」の値(差分の値)をX座標、Y座標それぞれに関して算出します。
  2. 算出した値について tan1\tan^{-1} などを使ってショットの移動角度を求めます。
  3. 得られた角度を利用して cos\cos でショットの移動X成分、sin\sin でY成分を求めます。ただし実際は整数型では 0.50.50.666-0.666\cdots などといった値は使えないので、20cos20\cos1000sin1000\sin などとして元々の三角関数の値を何倍かした値を保持しておくと無難でしょう。

このままでは…?

上記の方法だけで求められたX成分とY成分に従ってショットを動かすことを繰り返せば、特定の対象を追いかける基本的なショットが作れます。
しかし、ここで対象を自分として想像してみてください。これで出来上がったのは常に自分の現在位置に向かって常に最短距離で飛んでくるショットです。
ショットのスピードが自分の動きより速ければほぼ確実に避けられませんし、同じくらいのスピードであっても回避が苦しくなりそうなことが予想されます。
ホーミングショットとは大抵、自分が移動した軌跡をなぞって追いかけてくるような動きをするものである(と私は思っている)ので、そういった動きをしてもらうための処理を組む必要があります。
…といっても答えは単純で、軌跡をなぞって追いかけてきて欲しいわけですから、対象の現在位置ではなく、少し過去の位置で計算を行えば良いのです。言い換えれば、現在位置を使って計算を実行した後、その通りににショットを動かすまでに少しの待ち時間を設ければ良いのです。
すると、さっきまでいた場所に向かってショットが飛んでくる、すなわち自分が移動した軌跡をなぞって追いかけてくる動きを実現できるはずです。
まぁ、この過去の位置を使った計算計算結果の反映を遅らせるという処理の実装が、変数の値をいくつか保持しておく必要があるなど、制作ツールやエディタによってはちょっと面倒かもしれないですけどね。

ということで…

  1. 求めたX成分とY成分を、どんな方法でもいいのでディレイをかけて利用し、実際にショットを動かす。
    (重要な部分ですがすごく日本語での説明が難しい)

後はひたすらループ

というわけで後は並列処理で 1. ~ 4. をひたすら繰り返す処理を組めばOKです。
処理するショット数が多くなると余裕で処理落ちするので、適度にウェイトを挟みながら必要なショット数分ループしましょう。

まとめ

  • 三角関数を使ってショットの移動方向のX成分とY成分を算出しよう!
  • 移動した軌跡をなぞって追いかけてくるようにディレイを利用した処理を実装しよう!

さいごに

以上になります。拙い日本語&説明下手で長々と失礼しました。
何かあったらまた加筆、修正が行われるかもしれません。
この記事が私自身の技術メモであるとともに、ここまで読んでくれたあなたにとっての新たな知見となれば幸いです。

loading...