ブロック崩しの作り方4 Destroy関数とプレハブを用いてボールに当たった壁を消す | Unity入門の森 ゲームの作り方

ブロック崩しの作り方4 Destroy関数とプレハブを用いてボールに当たった壁を消す

Unity C# ブロック崩しの作り方


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

前回の記事ではボールの当たり判定処理と移動処理を作りました。

前回の記事:

ブロック崩しの作り方3 当たり判定の実装 UnityEngine.Colliderと物理マテリアルの使い方
今回の記事でも引き続きブロック崩しを作成していきます。 前回はUnityの入力処理とRigidBodyを用いた物理エンジンの利用法を習得しましたね。 前回の記事: 今回はボールを動かしてみましょう! 物理エンジンを使ってボールを動かしてみよ...

今回の記事では以下の内容を習得しながら、ボールに当たった壁が崩れる処理を作ります。

  • GameObject削除に用いるUnityEngine.Object.Destroy()の使い方
  • GameObjectを識別法である名前、タグ、レイヤーの使い方
  • 同じ設定を持つGameObjectをたくさん作れるプレハブの使い方

それでは作成していきましょう!


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

ボールが壁に当たった時に壁を消してみよう

前回までの記事で物理エンジンによる当たり判定を使用したい時はコンポーネントにOnCollitionXXX系やOnTriggerXXX系のコールバック関数を定義すると説明しました。

今回のケースでも同じようにコールバック関数を使用します。

GameObjectを削除するには UnityEngine.Object.Destroy()関数を使う

それでは実際にボールに当たったらGameObjectを削除するC#スクリプトのコンポーネントを作ってみましょう!

次のサンプルコードでは何かに当たったら自分自身を削除するコンポーネントになります。

この記事ではコンポーネントのファイル名を「SelfDestroy」と名付けますが、読者の方は好きな名前でOKです。

GameObjectを削除する時はUnityEngine.Object.Destroy()を使用します。

自分自身を削除するときは引数にthis.gameObjectと自身を表すGameObjectを渡しましょう!

また、Destroy()はコンポーネントも削除することができます。その時は引数にGameObjectではなくコンポーネントをそのまま渡してください。

次のサンプルコードはコンポーネントを削除するObject.Destroyの使用例になります。

コンポーネントを実装し終えましたら、実際にシーンにあるオブジェクトにアタッチしてみましょう。

アタッチ対象は崩れる壁だけにしてください。

アタッチできたら実際に再生して動作を確認してください。成功すると次の画像のように崩れる壁が消えていきます。

間違ってボールやプレイヤーなどにアタッチすると、それらが削除されてプレイできなくなるので注意してください。

  GameObjectを識別できるようにしてみよう

上のコンポーネントでは崩れる壁は何かに当たったら削除されます。なので、プレイヤーや外壁に当たった時でも消えてしまいます。

それでもいいかもしれませんが、この講座ではボールに当たった時のみ消えるようにします。

そのためには当たった時にどのGameObjectなのか判別できるようにしないといけません。

UnityにおいてGameObjectを判別する方法は次のものがあります。

  • GameObject.name:GameObjectの名前
  • GameObject.tag:GameObjectに一つだけ付けられる識別用の文字列
  • GameObject.layer:Unityの処理で利用されるGameObjectの分類分け用の識別用の値
  • GameObject.GetComponent():アタッチされているコンポーネントを取得する

今回は名前でGameObjectを識別してみましょう!名前の場合はGameObject.nameを使用すればOKです。

(関連記事:特定ゲームオブジェクトへスクリプトからアクセスする方法まとめ

ブロック崩しではシーンに登場するオブジェクトが少ないので名前だけで十分に対応できますが、もっと複雑なゲームになった時は上で紹介したものも利用してください。

それでは名前で識別できるように上で書いたコンポーネントを改造してみましょう!

実装できましたら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をたくさん作りたい時はプレハブを利用するといい。

それでは次の記事に行ってみましょう!

ブロック崩しの作り方5 クリア・リトライ・ゲームオーバー処理の作り方
今回の記事でブロック崩しを完成させます。 以前までの記事でボールやプレイヤーブロックの移動処理、ボールが壁に当たったときの破壊処理など、ブロック崩しに必要な要素を実装してきました。 前回の記事: 今回は最後にプレイヤーの残機などUIに関係す...

ブロック崩しの作り方講座に戻る>>



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

コメント

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