i-school - おはじきゲーム 手順6
 以下の内容で順番に実装を進めていきます。

手順6 −スワイプ処理を実装−
11.スワイプ用スクリプトを作成する
12.手球用スクリプトを修正する(スワイプで生成されたCueLineゲームオブジェクトとの接触判定を追加する)



 新しい学習内容は、以下の通りです。

・Input.mousePosition 変数
・Camera.ScreenToWorldPoint(Vector3 position)メソッド
・OR(||)演算子 
・Layer の設定



11.スワイプ用スクリプトを作成する

設計


 画面をスワイプ(Unityエディター上ではマウスでドラッグ)している間、キュー役のCueLineゲームオブジェクトを生成し、
手球と接触した際に、手球を弾くようにしてゲームを進行させる役割を与えます。

https://gyazo.com/4b6e32e23f8c0ac3990601f3b79664db


CueLinerスクリプトを作成する


 画面のスワイプに同期して、プレファブにしてある CueLineゲームオブジェクトを生成する機能を実装します。

 以下のサイト様の記事を参考にスクリプト作成しています(ただしこちらのサイト様は3D環境でのスクリプトであるため内容は2D用に変更しています。)

参考サイト
@Nicky様
[Unity] 当たり判定のある線を引く 〜超簡易版〜
https://qiita.com/Nicky/items/348a2b3da591c9c5ff39


 Scriptsフォルダ内(もしもフォルダがなければ作成してください)で右クリックしてメニューを表示し、Create => C# Script を選択し、名前を CueLiner に変更します。


CueLiner.cs

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



<Input.mousePosition 変数>


 Inputクラスの持つstatic変数です。現在のマウスの位置のピクセル座標(x, y)を取得します。マウスの情報は平面であるため、z 座標の情報はありません。
この情報と次のScreenToWorldPointメソッドを組み合わせることにより、マウスの位置をゲーム内の座標に変換しています。

 今回のスクリプトでは省略していますが、どういった値が取得できているかはDebug.Logを使用することが確認できますので、実際に記載して値を確認してみてください。

参考サイト
Unity公式スクリプトリファレンス
Input.mousePosition
https://docs.unity3d.com/ja/2019.4/ScriptReference...


Camera.ScreenToWorldPoint(Vector3 position)メソッド


 Cameraクラスの持つメソッドの1つです。カメラを使い、引数の座標をワールド座標に変換します。

  // マウスでクリックした位置を取得
  touchPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);

 今回は引数にマウスの座標を指定し、その位置をゲームのワールド座標に変換(戻り値)する処理を行うことでマウスの位置とゲーム画面との情報を同期させています。

 戻り値としては Vector3 型で設定されていますが、今回は2Dゲームですので、Vector2型で受け取っています。(touchPos 変数は Vector2型です)
この場合、Vector3型ではありませんが問題なく代入処理が行われます(第3引数の値(z)が代入されない処理になります。)


参考サイト
Unity公式スクリプトリファレンス
Camera.ScreenToWorldPoint
https://docs.unity3d.com/ja/current/ScriptReferenc...


CueLinerゲームオブジェクトを作成してアサイン情報を設定する


 CueLinerスクリプトをアタッチするため、空のゲームオブジェクトを1つ、Canvas内に作成します。(必ずCanvas内に作成してください)

CueLinerゲームオブジェクト ヒエラルキー画像



 名前を CueLiner に変更し、作成したCueLinerスクリプトをドラッグアンドドロップしてアタッチします。

 CueLinerゲームオブジェクトを選択し、インスペクターを確認します。
CueLinerスクリプトのアサイン情報が表示されていますので、それぞれ設定を行います。

 cuelinePrefab 変数には、Project内のPrefabs フォルダにある CueLine ゲームオブジェクトをドラッグアンドドロップしてアサインします。

 minCuelineLength 変数は、どの位スワイプを行えば CueLineゲームオブジェクトを生成し始めるか、その最小値を設定します。
0 であればほとんどスワイプせずに生成してしまいますので、0.3f - 0.5f 位の値を設定し、調整を行います。ここでは 0.3f で設定しています。

 duration 変数には、生成された CueLineゲームオブジェクトがどの位ゲーム画面内に表示されているかを設定します。
あまり長いといつまでもCueLineゲームオブジェクトが残り続けてしまうため、タイミングよく弾く、という挙動からは遠くなります。
初期値としては 0.2f - 0.5f 程度を設定し、調整を行ってください。ここでは 0.25f で設定しています。
 

CueLinerゲームオブジェクト インスペクター画像



スワイプしてラインが引けるかデバッグする


https://gyazo.com/2ede8e85535db119efc12dcac5d14b4a

 ゲームを実行し、ゲーム画面をスワイプしてみてください。スワイプに沿って CueLineゲームオブジェクトが複数生成されてライン状になっていれば問題ありません。

 手球とCueLineゲームオブジェクトとを接触させてみましょう。まだ弾く処理がないため、いまはオブジェクト同士が物理的にぶつかった反動で少ししか動きません。
次の手順で手球を弾けるようにします。


Layer の設定を行う


 CueLine ゲームオブジェクトの Layer を選択してプルダウンメニューを表示し、一番下にある Add Layer… を選択します。
インスペクターの内容が Tags & Layers という項目に切り替わり、Tag と Layer を登録できる設定内容に切り替わります。

 Layers を選択すると User Layer の部分に新しく Layer を作成して登録できますので、
User Layer 8 に CueLine と登録してください。

 もう一度 CueLine ゲームオブジェクトをヒエラルキーで選択して、同じように Layer を選択すると、プルダウンメニュー内に新しく追加した
CueLine が登録されていますので、そちらを登録してください。


12.手球用スクリプトを修正する(スワイプで生成されたCueLineゲームオブジェクトとの接触判定を追加する)


 CueLineゲームオブジェクトに接触した際に、手球が弾かれて動くようにCharaBallスクリプトを修正します。

 OnCollisionEnter2Dメソッドに、CueLine Tagの分岐を追加し、CueLine のTag設定のある CueLineゲームオブジェクトに接触した際の処理を追加します。
またすでにある Wall Tagの分岐部分に、次の手順で接触判定を行うEnemyBall Tag の分岐も追加しておきます。


CharaBall.cs

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



OR(||)演算子


 OR演算子は、条件式で用いられる演算子です。半角 || で条件式を構築します。
これは左オペランド(条件)が true の場合には評価をせず、 false の場合にのみ条件の判定を行います。

 つまり、どちらか一方の条件を満たせば、if文の条件式を満たしたことになる演算子です。

 if (col.gameObject.tag == "Wall" || col.gameObject.tag == "EnemyBall") {

 この例では、始めに Wall Tag を持つゲームオブジェクトであるかどうかを判定し、true の場合には、 || 以降の条件は行わずに条件を満たしたことになります。
逆に、Wall Tag が false の場合には、EnemyBall Tag の判定を行い、true の場合には条件を満たしたことになります。

 今回はありませんが、3つ以上の場合でも同様になります。


ゲームを実行して動作を確認する


 これで準備が整いました。ゲームを実行して、画面をスワイプし、CueLineゲームオブジェクトを手球に接触させてみてください。
手球が弾かれれば成功です。
 手球の速度が遅い場合には、CharaBallゲームオブジェクトを選択し、インスペクターのCharaBallスクリプトの Speed 変数の値を変更してみてください。


検証画像 画面をスワイプして CueLineゲームオブジェクトを生成し、手球を弾いてみる
https://gyazo.com/0fc783b2bce7636f67b148665bab32ae


 もしも上手くいかない場合には、手順4〜6までをもう一度読み返して、設定が抜けていないか、スクリプトに書き忘れはないか、確認をしてみてください。
Tagの設定の他、ParticleSystemの設定など、多くの部分が重なって処理を行っていますので、1つ1つ順番に、問題点がないかを切り分けてみていくことが大切です。


 以上でこの手順は終了です。