前回の記事ではボールの当たり判定処理と移動処理を作りました。
前回の記事:
今回の記事では以下の内容を習得しながら、ボールに当たった壁が崩れる処理を作ります。
- GameObject削除に用いる
UnityEngine.Object.Destroy()
の使い方 - GameObjectを識別法である名前、タグ、レイヤーの使い方
- 同じ設定を持つGameObjectをたくさん作れるプレハブの使い方
それでは作成していきましょう!
ボールが壁に当たった時に壁を消してみよう
前回までの記事で物理エンジンによる当たり判定を使用したい時はコンポーネントにOnCollitionXXX系やOnTriggerXXX系のコールバック関数を定義すると説明しました。
今回のケースでも同じようにコールバック関数を使用します。
GameObjectを削除するには UnityEngine.Object.Destroy()関数を使う
それでは実際にボールに当たったらGameObjectを削除するC#スクリプトのコンポーネントを作ってみましょう!
次のサンプルコードでは何かに当たったら自分自身を削除するコンポーネントになります。
この記事ではコンポーネントのファイル名を「SelfDestroy」と名付けますが、読者の方は好きな名前でOKです。
1 2 3 4 5 6 7 8 9 10 |
// … using UnityEngine; public class SelfDestroy : MonoBehaviour { private void OnCollisionEnter(Collision collision) { Object.Destroy(this.gameObject); } } |
GameObjectを削除する時はUnityEngine.Object.Destroy()
を使用します。
自分自身を削除するときは引数にthis.gameObject
と自身を表すGameObjectを渡しましょう!
また、Destroy()
はコンポーネントも削除することができます。その時は引数にGameObjectではなくコンポーネントをそのまま渡してください。
次のサンプルコードはコンポーネントを削除するObject.Destroyの使用例になります。
1 2 3 4 5 6 7 8 9 10 11 12 |
// … using UnityEngine; public class SelfDestroy : MonoBehaviour { private void OnCollisionEnter(Collision collision) { var rigidBody = GetComponent<RigidBody>(); Object.Destroy(rigidBody); //アタッチされているRigidBodyを削除 Object.Destroy(this); //SelfDestroy自身を削除 } } |
コンポーネントを実装し終えましたら、実際にシーンにあるオブジェクトにアタッチしてみましょう。
アタッチ対象は崩れる壁だけにしてください。
アタッチできたら実際に再生して動作を確認してください。成功すると次の画像のように崩れる壁が消えていきます。
間違ってボールやプレイヤーなどにアタッチすると、それらが削除されてプレイできなくなるので注意してください。
GameObjectを識別できるようにしてみよう
上のコンポーネントでは崩れる壁は何かに当たったら削除されます。なので、プレイヤーや外壁に当たった時でも消えてしまいます。
それでもいいかもしれませんが、この講座ではボールに当たった時のみ消えるようにします。
そのためには当たった時にどのGameObjectなのか判別できるようにしないといけません。
UnityにおいてGameObjectを判別する方法は次のものがあります。
- GameObject.name:GameObjectの名前
- GameObject.tag:GameObjectに一つだけ付けられる識別用の文字列
- GameObject.layer:Unityの処理で利用されるGameObjectの分類分け用の識別用の値
- GameObject.GetComponent():アタッチされているコンポーネントを取得する
今回は名前でGameObjectを識別してみましょう!名前の場合はGameObject.nameを使用すればOKです。
(関連記事:特定ゲームオブジェクトへスクリプトからアクセスする方法まとめ)
ブロック崩しではシーンに登場するオブジェクトが少ないので名前だけで十分に対応できますが、もっと複雑なゲームになった時は上で紹介したものも利用してください。
それでは名前で識別できるように上で書いたコンポーネントを改造してみましょう!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
//Nameフィールドに指定したものと当たった時だけ削除するようにする // … using UnityEngine; public class SelfDestroy : MonoBehaviour { public string Name = ""; private void OnCollisionEnter(Collision collision) { if(collision.gameObject.name == Name) { Object.Destroy(this.gameObject); } } } |
実装できましたらNameフィールドを「Ball」と設定してください。
崩れる壁を全て選択してからコンポーネントのNameフィールドを編集すると簡単です。
Nameフィールドの設定が終わったら再生して実際にボールに当たった時だけ消えるか確認してみましょう。
プレハブ(Prehab)を使用してみよう
ここまでボールが当たった時に崩れる壁が消えるようになりました。
が、崩れる壁は数が多かったので、コンポーネントをアタッチしたりパラメータを設定するのは手間だったと思います。
一つ作って複製していくなど工夫次第で簡単に設定できますが、パラメータを変更したくなった時はまた同じ作業を繰り返す必要があります。
そのような場面でUnityではプレハブ(Prehab)というGameObjectのテンプレートを作成することができます。
プレハブを使用すると同じ設定を持つGameObjectを簡単に複製できます。
また、プレハブのパラメータを変更するとそのプレハブから複製されたGameObjectにもその変更が反映されます。
もちろん複製されたGameObjectのパラメータを変更することもできますので、一部のGameObjectだけ異なるパラメータを設定することも可能です。
プレハブの作り方
プレハブを作る時はまずシーン上でプレハブにしたいGameObjectを選択し、Assetタブにドラッグ&ドロップしてください。
そうすると、選択したGameObjectを基に新しいプレハブがアセットとして作成されます。
作成したプレハブを選択するとプレハブのプレビュー用の画面に切り替わりますので、そこからパラメータを変更することができます。
プレハブを複製したい時は複製したいプレハブをシーン上にドラック&ドロップしてください。
そうすると選択していたプレハブの複製となるGameObjectが作成されます。
作成されたGameObjectはこれまでと同じように扱えます。
プレハブから作成されたGameObjectはプレハブのパラメータを変更すると同じように変更内容が反映されるのでぜひ活用していきましょう!
プレハブを元にしたGameObjectに追加されるInspectorのUIについて
プレハブから複製されたGameObjectのInspectorにはプレハブ関連のUIが追加されています。
そこから元になったプレハブのビューワーを開いたり、パラメータが異なる部分を確認することもできます。
パラメータが異なる場合はプレハブのものに戻すか、それともプレハブにそのパラメータを反映させるか選択できるので便利です。
プレハブとの関連性を切る方法
プレハブから複製したGameObjectはそのプレハブと関係性を持っています。
が、作業中にその関係性を切りたい時が出てきます。
その時は切りたいGameObjectを選択してから右クリックでコンテキストメニューを開き「Unpack Prefab Completely」をクリックしてください。
クリックするとプレハブとの関係性が消え、通常のGameObjectに戻ります。
プレハブのバリアントについて
Unityではあるプレハブからさらにプレハブを派生することができます。
そのようなプレハブをバリアント(Variant)などと呼んだりしています。
バリアントとなったプレハブは元となったプレハブを変更した時にその変更内容が反映されます。
作り方はプレハブと似たもので、シーン上にあるプレハブを元にしたGameObjectをProjectタブにドラック&ドロップしてください。
そうすると元になったプレハブのバリアントにするか新しくプレハブを作成するか尋ねるダイアログが表示されますので、そちらで「Prefab Variant」の方をクリックしてください。
そうするとプレハブのバリアントが作成されます。
作成されたプレハブのUIは通常のプレハブと少し変わったものになります。
ちなみに、プレハブとの関連性を切る時に「Unpack Prefab」をクリックするとバリアントになった部分との関連性が切れますので「Unpack Prefab Complete」と使い分けてください。
それではプレハブを使って崩れる壁を設定し直してみましょう!
作業完了の一例としては次の画像のようになります。
画像では崩れる壁を表すプレハブとそれを色分けしたプレハブのバリアントを新しく作成し、シーン上に再配置しています。
まとめ
今回の記事ではボールが壁に当たった時にその壁を削除するようにしました。
また、プレハブについても詳しく解説していきました。
プレハブはUnityおいてよく使うものなので今後も頻繁に登場していきますのでしっかりとマスターしましょう!
まとめますと以下のようになります。
- GameObjectを削除したい時は
UnityEngine.Object.Destroy()
を使用する。 - GameObjectを識別するには名前、タグ、レイヤー、アタッチされているコンポーネントを利用する。
- 同じ設定を持つGameObjectをたくさん作りたい時はプレハブを利用するといい。
それでは次の記事に行ってみましょう!
コメント