YKpages

ロボット分野で勉強したことのまとめ

Unity ゲーム開発日記:当たり判定を作る

はじめに

今回は当たり判定を作っていきます

これができれば最低限のシューティングゲームのシステムができるはずです

Colliderの設定

衝突判定のためにオブジェクトの形状を定義します

Playerには「Box Collider」、Enemyには「Sphere Collider」にしました

いい感じに大きさを調節します

次にオブジェクトのレイヤーを分けます

何も設定していない場合、オブジェクトは全て衝突してしまいます

オブジェクトがどのオブジェクトと衝突するかは、レイヤーを設定することで簡単に決められるようです

Edit > Project Settings > Tags and Layers で以下のように設定

f:id:kato_robotics:20181104054416p:plain

Edit > Project Settings > Physics で以下のように設定

f:id:kato_robotics:20181104071912p:plain

Bullet どうしも衝突するようにしました

Particle System 作成

PlayerまたはEnemyが相手のBulletに衝突して消滅するときのエフェクトとしてParticle Systemを作成します

Create > Effects > Particle System を選択、名前は「enemyParticle」とします

設定は以下のように(好きなように)

f:id:kato_robotics:20181104055856p:plain

f:id:kato_robotics:20181104062043p:plain

f:id:kato_robotics:20181104055907p:plain

新しくマテリアルを作成してenemy用の画像を設定

Shader を Particle > Alpha Blended にする

作成したマテリアルをParticle Systemに設定

こんな感じになります

f:id:kato_robotics:20181104062139p:plain

これをEnemyが消滅したときに発生させます

同じようにPlayer用のParticle Systemも作ります

f:id:kato_robotics:20181104062523p:plain

Particle System のパーティクルに画像を設定

vivi.dyndns.org

衝突時のイベントを書く

衝突判定には方法が二つあるようです

qiita.com

レイヤーを設定するとTriggerを使えますが、 今回はOnCollisionEnter関数を使ってみます

各オブジェクトに「Tag」を設定します

「Tag」を利用して衝突したオブジェクトを判別します

f:id:kato_robotics:20181104081157p:plain

Particle System は Prefab 化してから Instantiate 関数を用いて発生させます

// PlayerDriver.csに追加
public GameObject playerParticleSystem;

// 衝突時のイベント
    void OnCollisionEnter(Collision col)
    {
        // 衝突したオブジェクトのTagが敵の弾かどうか
        if (col.gameObject.tag != "EnemyBullet") return;
        Debug.Log(col.gameObject.tag);
        Debug.Log(gameObject.name);

        // Particle System を起動
        GameObject pps = Instantiate(playerParticleSystem, transform.position, transform.rotation);
        Destroy(pps, 2f);
        // 弾を削除
        Destroy(col.gameObject);
        // Enemyオブジェクトを削除
        Destroy(gameObject);
    }
// EnemyDriver.csに追加
public GameObject enemyParticleSystem;

   // 衝突時のイベント
    void OnCollisionEnter(Collision col)
    {
        // 衝突したオブジェクトのTagがプレイヤーの弾かどうか
        if (col.gameObject.tag != "PlayerBullet") return;
        Debug.Log(col.gameObject.tag);
        Debug.Log(gameObject.name);

        // Particle System を起動
        GameObject eps = Instantiate(enemyParticleSystem, transform.position, transform.rotation);
        Destroy(eps, 2f);
        // 弾を削除
        Destroy(col.gameObject);
        // Enemyオブジェクトを削除
        Destroy(gameObject);
    }

当たり判定を取り入れたゲームはこんな感じになりました

f:id:kato_robotics:20181104081826p:plain

画像では分かりにくいですが、当たり判定がうまく働いています

弾が敵に当たるとParticleSystemを発生させた後、敵が消滅します

おわりに

無事に当たり判定を取り入れることができました

これでシューティングゲームの最低限のシステムができました

次はクリア条件などゲームとして遊べるようにしていきます