Unity Tag(タグ)を使った衝突判定とボール落下位置の調整

Unityパズルゲームの作り方


Unity入門の森オリジナル本格ゲーム制作講座はこちら
8種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

パズルゲームの作り方講座の第3回ではunityスクリプトの書き方・使い方の導入を行いました。

前回の記事↓

unityスクリプトの書き方と使い方入門
パズルゲームの作り方講座の前回の記事では、unityを用いた衝突判定、重力処理を扱いました。 前回の記事↓ 今回は第三回です。unityを使ったC#スクリプトの書き方・使い方を習得していきましょう。 C#のスクリプトの書き方/使い...

第4回では、大きく分けて次の2つの処理を作成していきます。

  • ボールを落とす位置の調整
  • ボールの衝突判定の詳細設定

Unityではこうした機能追加を簡単に行えるように多くのメソッドや物理エンジンの機能が用意されています。便利な乱数の使い方もここで紹介します。


【Line登録者限定のプレゼントもあるよ!】

パズルゲームのボールを落とす位置の調整

まず、前回BallGeneratorから生成されるボールを落とす位置がゲームフィールド中央部でした。ここでフィールド上部からボールを落とすように調整します。

BallGeneratorの位置が低いので、BallGeneratorの位置をインスペクタから次の位置に変更しましょう。

オブジェクト名 Position
BallGenerator (0, 12, 0)

transform.localpositionを使って相対位置を指定する

では、次に実際にボールを生成する位置を変更する命令を追加しましょう。

BallGeneratorクラスのUpdate関数内を次のようにしましょう。

localPositionは親オブジェクト(BallGenerator)の相対位置を設定する変数です。localPositionにVector3.zeroで(0,0,0)の位置を与えると、子オブジェクトは親オブジェクトの位置に変換されて代入されます。

つまり、BallGeneratorの位置を変えるとボールの生成位置も変わるようになります。

すると次のように高い位置から落ちるようになります。

実際にコードを書くとわかりますが、ボールの落ちてくる角度が上記画像のようになっていないと思います(真下に落ちちゃってますよね)。

UnityのRandom.Rangeメソッドで落下するボールに角度を付ける

ボールの落下に角度をつけるためにもう一文コードを追加します。

gameObject.GetComponent<Rigidbody>().AddForce(Quaternion.Euler(0, 0, UnityEngine.Random.Range(-60.0f, 60.0f)) * Vector3.down * 10f, ForceMode.Impulse);

という行を追加しました。

UnityEngine.Random.Range(最小値, 最大値)は最小値から最大値未満の乱数を返すメソッドでUnityで用意されたものになります。

ballGeneratorで生成したボールがただ垂直落下しかしない問題に対処するために「-60~60度の範囲でボールを落とす方向を変える処理」を書いています。

この行は処理の内容が難しいので詳しい解説は割愛します(クォータニオンやオイラー角といった概念を使います。やや高度な物理・数学なのでひとまずスルーして先に進みましょう)。

ボールの衝突判定の設定 Unityのタグ機能とスクリプトを活用しよう

パズルゲームの作り方講座の第2回で、衝突判定について解説していきました。この衝突判定が発生したタイミングで処理を行う関数がUnityには用意されています。この処理を使って、ボール同士の衝突を検知する処理を書いていきます。

まずはBallObjectという名前でスクリプトを作成しましょう。

作成したら、プレハブ内のゲームオブジェクトBallにスクリプトBallObjectを追加しましょう。

スクリプトでの衝突判定の扱い方

衝突判定を検知する関数一覧は以下の通りです。

関数名 詳細
OnCollisionEnter 衝突した1フレームのみ実行
OnCollisionStay 衝突している間実行
OnCollisionExit 衝突しなくなった1フレームのみ実行

今回は衝突した瞬間を使いたいため、OnCollisionEnter関数を使用します。Update関数の下に次のようなOnCollisionEnter関数を書いてみましょう。

書き終えたら、実行してみましょう。すると、Console上(例では画面右下)でゲームオブジェクトが衝突した際に「ぶつかった!」と表示されます。

【Tips】Unityのタグ(Tag)とは

先ほどのコードでは、ボールとフィールドが衝突した場合でも「ぶつかった!」と表示されてしまう問題があります。どのオブジェクトがぶつかったかを識別するために、ここからはタグ(Tag)を使用していきます。

タグは、ゲームオブジェクトを分類するときに使用する機能です。

まずは、プレハブ上のBallのインスペクタを開いてみましょう。

初めはTagが「Untagged」になっています。これをクリックして、Add Tagを選択してください。

そして、Tagsのリストの右下の+ボタンを押して「Ball」タグを追加してみてください。

最後に、Ballのインスペクタに戻ってTagをBallに設定します。これでタグをつけることができました。

それでは、衝突したオブジェクトがボールか否かを識別するコードを書いていきましょう。

次のようなコードを書いてください。

このgameObject.tagを使ってタグ名を取得していることが分かります。タグ名がBallであるかどうかをif文により分岐させて出力を分けました。

それではこの状態で実行してみましょう。

ボール同士がぶつかった際は「ボールにぶつかった!」を、それ以外の時は「ボールじゃないところにぶつかった!」と表示されている様子が確認できます。

おさらいと次回予告

今回は、2つの処理をスクリプトに書いていきました。

  • ボールを落とす位置の調整
  • ボールの衝突判定の詳細設定

次回は、マウス入力の検知に関する処理について説明していきます。

次回の記事↓

入力処理の作り方 ~マウスの動かし方と座標の取得法~
Unityパズルゲームの作り方講座の第4回ではタグを使った衝突判定とボール落下処理を実装しました。 前回の記事↓ 第5回では、Unityエンジンに実装されているマウス入力処理を作成します。 また、レイキャスト機能を用いて何をマウス...


Unity入門の森オリジナル本格ゲーム制作講座はこちら
8種類の本格ゲームの全ソースコード公開・画像&動画による解説付き

コメント

  1. UT より:

    こんにちは。
    unityの勉強中で当サイトを参考にさせていただいております。

    1点「ボールを落とす位置の調整」でUnityのバージョンによって動作しない箇所がありましたので、コメントさせて頂きます。
    —-
    UnityEngine.Random.RandomRange(-60.0f,60.0f)

    Random.Range(-60.0f,60.0f)
    —-

    • Unity入門の森 より:

      こんにちは。ご報告ありがとうございます!
      うちのサイトだとパズルゲーム講座が一番古い無料講座になるので一回2020LTSとかで再追試など進めて必要に応じて修正加筆進めていきます。

タイトルとURLをコピーしました