このブログはUnityの初心者向けに、Untiyの機能の使い方、基本のスクリプトファイルの使い方から応用までをご説明しています。中級以上の方に読んでいただきたい内容も随時更新していますので、お時間がある方、検索でここにアクセスされた方はぜひ立ち寄っていってください。
一分間Unity講座のまとめはこちらから。
前回の記事「マウスクリックした座標に向けてミサイルを発射する方法」では、ターゲットを狙ってミサイルを発射する動きができました。でも弾が当たってもはね返るだけ巣ので、今回は当たった相手を削除する動きを作ってみます。
下の動画は「ファイブボックス 一分間Unity講座 ミサイルを当てた相手を消す方法」 のショート動画です。ご興味がございましたら、こちらの動画もご参照ください。
オブジェクトの設定
Cubeプレハブ
ターゲットとなる Cube のプレハブには、Tagを設定します。
- Tag の右の▼を押して、一番下の「Add Tag」を選択
- 表示されたパネル、Tags の右下の「+ボタン」を押して作成パネルを表示
- 「Cube」という名前で Tag を作成し「Saveボタン」
- Cube の Inspectorに戻り、Tag で作成した「Cube」Tag を指定
当たり判定を有効にするには、互いのオブジェクトに「Colliderコンポーネント」が必要になります。Cubeは作成した段階でついていますが、ついているのを確認しておきます。
合わせて「IsTrigger プロパティ」のチェックが外れているのを確認しておきます。
Bulletプレハブ
Bullet はそのままでOKです。この後、スクリプトファイルを追加します。
こちらも「Colliderコンポーネント」がついていて「Is Trigger プロパティ」のチェックが外れているのを確認しておきます。
Bulletのプログラム
「BulletManager」というスクリプトファイルを作成し、Bulletのプレハブにアタッチしておきます。
このスクリプトファイルは、Cube のプレハブで作られたInstanceに当たった時に、当たったCubeを削除するプログラムを実行します。
BulletManager.cs
void OnCollisionEnter(Collision collision) //衝突検知のイベント関数
{
//衝突したオブジェクトがCubeタグを持っていたら
if (collision.gameObject.CompareTag("Cube"))
{
Destroy(collision.gameObject); //衝突したオブジェクトを削除
Destroy(gameObject); //自分自身を削除
}
}
■ OnCollisionEnter(Collision collision)
Unityには Colliderを持ったオブジェクト同士が衝突したときに呼び出される「イベント関数」が用意されています。
イベント関数(引数の型 引数) | 説明 |
---|---|
OnCollisionEnter(Collision col){} | Colliderを持つObject同士が衝突したタイミングで呼び出される |
OnCollisionStay(Collision col){} | Colliderを持つObject同士が衝突している間、1フレームごとに呼び出される |
OnCollisionStay(Collision col){} | Colliderを持つObject同士が離れたタイミングで呼び出される |
いずれの関数も、発動の条件として以下のものが必須です。
- 両方のオブジェクトに Collider コンポーネントを含み、Is Trigger がfalse
- 少なくとも一方のオブジェクトに RIgidbody コンポーネントを含む
- 3D プロジェクト内で有効
今回のコードで使用したのは、当たったタイミングで発動する OnCollisionEnter()
です。引数で (Collision collision)
と指定しています。前半の Collisiton
は引数の型 、ここではColliderコンポーネントの当たり判定型で、後半の collision
は引数ですので、任意の文字列となります。
このコードではこの引数「collisiton」を「当たったCollider」として、関数内で2回活用しています。
if (collision.gameObject.CompareTag("Cube"))
もし、「当たったCollider」のオブジェクトが”Cube”タグを含んでいたら
Destroy(collision.gameObject);
「当たったCollider」のオブジェクトを削除する。
なお、今回説明した OnCollisionEnter()
などのイベント関数は、3Dのプロジェクトに有効です。2Dのプロジェクトの場合は、それぞれ以下のようになります。
イベント関数(引数の型 引数) | 説明 |
---|---|
OnCollisionEnter2D(Collision2D col){} | Collider2Dを持つObject同士が衝突したタイミングで呼び出される |
OnCollisionStay2D(Collision2D col){} | Collider2Dを持つObject同士が衝突している間、1フレームごとに呼び出される |
OnCollisionStay2D(Collision2D col){} | Collider2Dを持つObject同士が離れたタイミングで呼び出される |
■ CompareTag()
カッコ内で指定したタグを含んでいたら true
、含んでいなかったら false
を返すメソッドです。
次のような記述方法もあります。
if (collision.gameObject.tag == "Cube")
どちらも正しく起動しますが、ConpareTag()
を使った方が若干処理が速いようです。
■ Destroy()
Unityの Destroy()メソッドは、ゲームオブジェクトやコンポーネント、アセットを削除するために使用されるメソッドです。引数の中に削除したいオブジェクト、またはコンポーネントなどを指定します。
使用例:
Destroy( 対象オブジェクト.gameObject)
Destroy( GetComponent<コンポーネント名>())
また float型の2つ目の引数を指定することで、指定した時間後にオブジェクトを削除します。
使用例:
Destroy(gameObject, 2f); // このオブジェクトを2秒後に削除
Destroy()
を呼び出すとオブジェクトは即座に削除されるわけではなく、そのフレームが終了した後に実行されます。
ファイブボックスでは、スクラッチやUnityの個別指導のオンラインレッスンを行っています。