今回は、衝突判定について書いていきます。
弾と機体があたった時に、判定をして機体が爆発するような感じにします。
目次
宇宙戦闘機の弾と敵の衝突判定
まずは、宇宙戦闘機から発射される弾と敵が当たった時の衝突判定から設定していきます。
Colliderの追加
弾と敵にColliderを追加します。
このCollider同士がぶつかる事で、衝突判定を行ってくれます。
まずは、Prefab化されている弾を[Sceneタブ]に追加します。
[MyFolder]→[Prefab]から弾のPrefabを選択し、[Hierarchyタブ]にドラッグ・アンド・ドロップします。
そして、弾の[Inspectorタブ]に[Box Collider]を追加します。
[Add Component]の中の[Physics]→[Box Collider]を選択します。
衝突判定の範囲の設定
次は、衝突判定の判定範囲を設定します。
先ほど追加した[Box Collider]の[Center]と[Size]をいじっていきます。
Sizeが判定のサイズで、Centerが範囲の中心の位置です。
[Scene]に出ている弾を見ながらいじってみてください。少しわかりにくいですが、この緑の四角い範囲が衝突判定です。
Sizeをいじるとわかると思います。
そして、最後に[Is Trigger]のチェックを入れます。
Prefabの更新
今、新しく追加した設定をPrefabの方にも追加するための更新をします。
[Inspectorタブ]にある[Apply]をクリックします。
これで、[Prefab]フォルダの中にあるのも同じ設定になりました。
[Hierarchy]にある方はもういらないので、削除してしておいてください。
敵にもColliderを追加
宇宙戦闘機にもColliderを追加しましょう。
ただ、こちらは[Box Collider]ではなく[Mesh Collider]を追加します。
インポートした宇宙戦闘機にはMeshのデータがあるので、こちら方がぴったりとしたColliderを貼り付ける事が出来ます。
そして、[Convex]と[Is Trigger]にチェックをします。
Rigidbodyの追加
[Rigidbody]というのも追加します。
Rigidbodyを追加するとUnity の物理エンジンの管理下に置くことが出来ます。
これが追加されていないと衝突判定がうまく動作しないようです。
しかし、今回は重力を使わないので[Use Gravity]のチェックは外しておきましょう。
Prefabの更新
敵も弾と同様にPrefabの更新をしておいてください。
これで、弾と敵があたった時の衝突判定は取得出来るようになりました。
次は、衝突した時の処理をコードに継ぎ足していきましょう。
OnTriggerEnterの実装
using UnityEngine; using System.Collections; public class EnemyControl : MonoBehaviour { public GameObject EnemyBullet; public GameObject Explosion; float Z_Speed = 0.7f; float intervalTime; // Use this for initialization void Start () { intervalTime = 0; } // Update is called once per frame void Update () { transform.Translate(0, 0, -1 * Z_Speed); Quaternion quat = Quaternion.Euler(0, 180, 0); intervalTime += Time.deltaTime; if (intervalTime >= 0.3f) { intervalTime = 0.0f; Instantiate(EnemyBullet, new Vector3(transform.position.x, transform.position.y, transform.position.z), quat); } } void OnTriggerEnter(Collider coll) { if (coll.gameObject.tag == "PlayerBullet") { Instantiate(Explosion, new Vector3(transform.position.x, transform.position.y, transform.position.z), Quaternion.identity); Destroy(this.gameObject); } } }
これが追加された[EnemyControl]です。
32行目からが新しい部分ですね。
[OnTriggerEnter]が衝突判定をしてくれる関数です。
34行目で、また新しくInstantiateがありますね。
作られるのが[Explosion]です。今回始めて出てきた変数です。
7行目で宣言されているので、追加し忘れないようにしてください。
[Explosion]の中に爆発エフェクトが入っており、弾があたった時に生成されるようになっています。これについては、この記事のあとでまた作成方法を書きます。
まずは、追加されたコードの全体的な説明をします。
33行目の[if
(coll.gameObject.tag ==
"PlayerBullet"
)
]がどのオブジョクトにあったかの判定をしています。
また、”coll.gameObject.tag
“がオブジョクトのどこを見て判断するのかという部分です。
今回の場合、単語の通り[Tag]を見て判断します。なので、弾のオブジョクトのタグに“PlayerBullet”と追加しなければなりません。
そして、35行目の[Destroy(
this
.gameObject);
]で時のごとくデストロイ(破壊)しています。
[this.gameObject]は、このScriptが追加されているオブジョクトという意味です。
つまり、この追加された部分では、
“PlayerBullet“というタグが付いたオブジョクトに衝突した時に、爆発エフェクトを生成し自分自身は破壊します。ということです。
爆発エフェクトの作成
では、先ほど飛ばした爆発エフェクトの作成をしていきます。
弾のAssetを追加した時に一緒に爆発エフェクトも追加されています。
[Assets]→[SampleParticlePack]→[Resources]→[Explosions]の中にいろいろな爆発エフェクトがあります。
好きなモノを選んで見てください。
自分は[Explosion01c]を選びました。
これを一度、[Hierarchy]に追加して、なにもしないで[MyFolder]の[Prefab]に追加しておいてください。
これで爆発エフェクトの作成が完了です。
オブジョクトのタグ設定
次は、タグをセットしていきましょう。
[Prefab]フォルダの中にある弾のPrefabを選択し、[Inspectorタブ]を見てください。赤線で引いた部分に[Tag]とあります。ここでTagのセットが出来ます。
新しいタグの作成
まずは、”PlayerBullet”というタグを作成しなければなりません。
[Tag]の横にある[Undefined]をクリックしてください。図のように出てきたと思います。
そして、[Add Tag…]をクリック。
プラスのところをクリックします。
そして、Tag 0に“PlayerBullet”を追加します。
これで、新しいタグが出来ました。
タグのセット
もう一度、弾のPrefabを選択して[Inspector]を見てください。
そして、タグを作成した時と同じように[Undefined]をクリック。
一覧に[PlayerBullet]が追加されているので、それをクリックします。
Tagのところが[PlayerBullet]に変わっていれば変更完了です。
敵、Prefabに爆発エフェクトの追加
次は、先ほど作った爆発エフェクトを[EnemyControl]に追加しましょう。
Prefabのところから、爆発エフェクトを選択し、[EnemyControl]の[Explosions]に追加してください。
これで、宇宙戦闘機から発射された弾が敵にあたると敵が爆発したような処理になりました。
まとめ
今回は、宇宙戦闘機から発射された弾が敵と衝突した時に敵が爆発するような処理の方法を書いていきました。
記事では、宇宙戦闘機から敵への攻撃部分だけを書いていきました。
今度は、敵の弾が宇宙戦闘機に衝突した時の処理です。
では。
コメント
MissingReferenceException: ‘GameObject’タイプのオブジェクトは破棄されましたが、まだアクセスしようとしています。
あなたのスクリプトは、それがヌルかオブジェクトを破壊してはならないかどうかをチェックする必要があります
とでるのですがどうしたらいいでしょうか。