自機狙い弾を作りたいんだ!
この記事は何
この記事では、弾幕ゲームなどを作る際に生じる、特定のターゲットに向かって弾を発射する方法について説明します。三角関数の$sin$と$cos$の定義がわかる方で、逆三角関数の概念をすんなり受け入れられる方なら簡単に理解できます。(逆関数についてもふんわりとした理解でOKです。)
記事の最後には動作例もあるので是非見てくださいね。
ご挨拶
みなさんこんにちは。RiG++コーディング課の田きです。おそらく3回目です。慣れてきましたか?またきれいな模様を描くための話をしていきたいと思います。
今回やる事
この記事では、Unityエンジン上で自機狙いの弾を作っていこうと思います。その方法を書いていこうと思います。
登場する変数
プレイヤー(自機)の座標$(x_{Player},y_{Player} )$
発射始点の座標$(x_{Start},y_{Start} )$
以上!
実際に考察してみましょう
まず、発射地点からプレイヤーの地点までの向きを求める必要があります。これを逆三角関数を用いて求めましょう。
三角関数は、角度から様々な値を取り出すことができます。$sin$や$cos$は斜辺1の直角三角形の、一つの角度が決まった時の高さや底辺を得ることができます。その中でも、$tan$は角度から傾き$\frac{y}{x}$を得ることができます。
逆三角関数はその名の通り、別のパラメータから角度を求めることができます。(この私の説明はおそらく厳密さに欠けます。)
特に、$tan$の逆三角関数$atan$($arctan$や、$tan^{-1}$と表記されることもあるが、プログラムの関数では$atan$表記をよく見ます)は、傾きからその角度を求められる関数です。どのように実現されているかはさておき、プログラムに$atan( \frac{y}{x} )$と入力すればよいわけです。では、今回の $\frac{y}{x}$ を求めましょう。
弾の発射地点からプレイヤーの向きへ向かうときの傾きが欲しいので、座標が発射始点が$(0,0)$になるように補正しましょう。
そのため、補正された際のプレイヤーの座標$(x,y)$は、$(x_{Player} -x_{Start} ,y_{Player} -y_{Start} )$となります。これで $\frac{y}{x}$ が求められます!!
しかし
$x=0$である例外が発生したり、(素直に$atan$を実装している場合は)$atan$の定義上そもそも$0$から$180°$までしか求められません。
そこで、別の方法を使う必要があります。それは、$atan2$関数を使う事です。
$atan2$は、$y$と$x$を引数に渡すだけで使えます。例外だとか角度が$0$から$180°$まで問題はライブラリがよしなにやってくれます。そのため、実際にやらなければならないのは、$atan2(y,x)$を呼び出すだけでした。
求めるべき角度θは$atan2$で求められるので、後は例によって速度を$(cosθ,sinθ)$とすればOKです。
別の方法
まず、発射地点からプレイヤーの地点までの向きを求める必要があります。すなわち、発射始点からプレイヤーに向かうベクトルを求める必要があります。
もとめるベクトルを$(x_{StoP} ,y_{StoP} )$とすると、$( x_{StoP} ,y_{StoP} )= (x_{Player} -x_{Start} ,y_{Player} -y_{Start} ) $です。発射始点の座標を0にすると考えてもらっても構いません。
このベクトルを単位ベクトルにしましょう。このベクトルの大きさは三平方の定理簡単に$( x_{StoP} ^2+ y_{StoP} ^2)^{\frac{1}{2}}$と求められます。
$(x_{StoP} ,y_{StoP} )$ に、その大きさである $( x_{StoP} ^2+ y_{StoP} ^2)^{\frac{1}{2}}$ の逆数を掛けたベクトル、すなわち
$\frac{ (x_{StoP} ,y_{StoP} ) }{ ( x_{StoP} ^2+ y_{StoP} ^2)^{\frac{1}{2}} }$が弾の速度となります。
まとめ
逆三角関数を使う方法を用いるか、単位ベクトルを求めることによって時期狙いの弾を発射することができました。数学の概念も途中で出てきましたが、定義を程度の利用しかしていません。
弾幕、というよりあらゆるゲームの基本中の基本でしたが、やったことが無いと地味に難しそうな内容でした。今回示した式は様々な場面で使えます。発射始点からプレイヤーの方向の角度を求め、その値を扇状に発射したりする弾幕に適用することで、プレイヤーに向かって扇状に弾を発射できます。弾幕以外のアクションゲームでも、エフェクトでも、様々な場面で使えそうだと思います。
弾幕を楽しんでくださいね。
動作例
拙作ではありますが、以下のようなものが作れます。
音が出ます!!!!!
上の動画では、複数の地点からプレイヤーに弾を放つ工夫がされています。また、よくよく見ると、「4つの弾を円形に発射し、そのうち一つの向きをプレイヤーにしている」とも見えます。
このような、プレイヤーに向かって円形に弾を放つ動きはよく見られます。