前回は、画面をタップするたびにボールを飛ばせるようにしました。
今の状態だと、固定された座標からしかボールを飛ばすことが出来ないので、的当てゲームとして成り立ちませんね。
というわけで、よりゲームらしさを出すために、タップした場所にボールを飛ばせるようにします。
ボールをタップした場所へ飛ばす方法
タップした場所にボールを飛ばすには、タップした座標を取得する必要があります。
座標を取得するには、Input.mousePositionを使えば良いんですけど、今回のように3Dゲームの場合は値をそのまま使うことができません。
なぜ使えないのかと言うと、mousePositionの値がスクリーン座標系の値だからですね。
スクリーン座標系は、2Dの座標系になるので、今回は使えないのです。
これまで出てきたボールや的の座標は、ワールド座標系と言って、オブジェクトがゲーム空間のどこにあるのかを示すための座標系です。
これから行うボールを飛ばす方向についても、ワールド座標系で計算する必要があります。
どうするのかと言うと、「ScreenPointToRay」というメソッドを使います。
このメソッドは、スクリーン座標を渡すとワールド座標系のベクトルを取得できるという優れもので、ボールをタップした方向に飛ばせるように出来ます。
さっそく、以前作ったスクリプトを修正していきましょう。
こんな感じでアップグレードしました。
ボールを作成すると同時に、ScreenPointToRayメソッドで取得した方向に力を加えれば良いので、赤枠内のようになりますね。
まずは、21行目でタップした座標を渡します。ScreenPointToRayメソッドは、カメラからタップした座標に向かうベクトルに沿って進むRayを返します。
Rayは光線のことで、コライダがアタッチされたオブジェクトとの当たりを検知出来ます。
Rayのメンバ変数であるdirectionが、カメラからタップした座標に向かうベクトルです。
directionの方向にボールを飛ばすために、normalized変数を使って長さ「1」のベクトルにした後で「1500」の力を掛けています。
この処理によって、ベクトルの大きさにかかわらず、一定の力をボールにかけることが出来ます。
いわゆるベクトルの正規化ってことですね。
スクリプトを保存したら、ゲームを実行して動作を確認してみましょう。
このように、タップした方向にボールが飛んでいるようならOKです。
これで、ちょっとゲームっぽくなってきましたかね。
まだ未完成な部分も多いので、今後もう少し改良していきたいと思います。