i-school - 画面をクリックしたらボールを発射するようにする

設計


 ゲームスタートと同時にボールが発射される仕様になっていますが、こちらを「画面をクリック(タップ)したら」発射するという開始条件に変更していきます。

実装動画
https://gyazo.com/8e8215866b281fc3cb2f05b9370c85e5


 まずは画面のクリックを確認する条件式が必要になりますので、if文を使って制御文を考えていきます。
このままですと何回でもクリックをしてボールを発射できてしまうので「1回だけ(発射していないときだけ)」という条件も一緒に考えておきます。



 それからこの後、「プレイヤーの動きに合わせてボールも一緒に移動させる」という応用も用意します。
プレイヤーの上にボールが乗って動く感じですね。こちらはプレイヤーとボールとの間に親子関係を作る設計で考えます。

 この実装により、ユーザーが自由な位置にプレイヤーを移動させてからボールを発射できるようになります。
ゲーム性が増すことになりますので、こちらにも挑戦してみましょう。

応用動画
https://gyazo.com/a71049be67fadd025068e04e2122152c

実装手順


 以下の2つの実装例を用意しました。どちらの例で実装をして頂いても構いません。また実装しない場合でも読んでおくと学習になります。

1.ShotStartスクリプトを修正する。修正案 その1<RigidbodyのVelocityを利用する>
2.ShotStartスクリプトを修正する。修正案 その2<bool型の変数を利用する>



 それぞれに学習できる技術が異なります。

・Rigidbodyクラスのvelocity
・bool型を条件式に使用する場合の省略記法

1.ShotStartスクリプトを修正する。修正案 その1<RigidbodyのVelocityを利用する>


StartShot.cs

<= クリックすると開きます。



Rigidbody.velocity(ベロシティ)

 velocityとはRigidbodyクラスの持つ情報の1つで、各軸(x,y,z)の速度ベクトルを表しています。
ボールが停止している場合、velocityの値はすべて0です。(velocity = 0, 0, 0)

 ボールが動いている場合にはy軸以外の情報に速度の値が入るため、その内のz軸の速度ベクトル情報を利用して、停止状態を管理して発射を制御しています。
【Unity入門】Rigidbodyで自在に移動!velocityの活用方法!
https://www.sejuku.net/blog/55084


2.ShotStartスクリプトを修正する。修正案 その2<bool型の変数を利用する>


StartShot.cs

 <= クリックすると開きます。



<条件式時のbool型の省略記法>


 bool型は条件式の判定の際に、省略記法が使用できます。

 if(bool型の変数名){ }  は  if(bool型の変数名 == true){ } と同義です

 if(!bool型の変数名){ }  は  if(bool型の変数名 == false){ } と同義です

 今回は isShooted という変数の条件式に、下の省略記法を利用しています。
if(!isShooted){ } // isShooted が false ならば、という意味です


応用<親子関係を利用して、プレイヤーの移動にボールの位置を追従させる>


 Unityにはヒエラルキー上に設置したゲームオブジェクト間に親子関係を結ばせることが出来ます。
親子間ではTransformの値の取り方が変化したり(子オブジェクトは親に対しての相対的な座標表示になる)、親が移動すると子も一緒に移動する、といった特徴があります。

 親子関係については、こちらのサイト様が詳しいので参考にしてください。

れー様
Unityのオブジェクトの親子関係について【初心者向け】
https://dkrevel.com/makegame-beginner/parent/

 
 この親子関係の機能を利用して、プレイヤーとボールとを親子関係にしましょう。
こうすることで、ゲーム開始時に、プレイヤーの移動に合わせてボールが一緒に動くようになります。

 親子関係の作り方は、ヒエラルキー上で直接変更するか、あるいはスクリプトを使って動的に親子にするか、といった方法があります。

 ヒエラルキー上に親子にするゲームオブジェクトがある場合、ドラッグアンドドロップして親子にすることが出来ます。
https://gyazo.com/b7b52310cf15c3e7ef0c0b9293b159b0

スクリプトの場合(ゲーム実行時に親子にする処理がある)
https://gyazo.com/85a619c38477eb2a7881e45b9921ca97


 親子関係にすることはできましたが、このままの状態でボールを発射しますと、ボールの位置情報が親に対しての位置情報になっているため
正常な方向へと発射することが出来ません。

 そのため、発射のタイミングに合わせて、ボールとプレイヤーとの親子関係を解消する必要があります。

https://gyazo.com/0a4602bc7adf4bb628bb74e073f60638

 動画を観て頂くとおわかりいただけるように、ボールが発射されるときには、プレイヤーとボールとが親子関係を解消し、
それぞれが別々のゲームオブジェクトとして独立しているのがわかると思います。


 それでは、親子関係を構築する場合と解消する場合を実際にスクリプトから変更できるようにしましょう。

StartShot.cs

 <= クリックすると開きます。(bool型でボールの発射を制御している処理に追記しています)