忍者ブログ
まったくのプログラミング素人の筆者がC++/HSPを使用してSTG(シューティングゲーム)を作っていく過程を書くブログでしたが最近は脱線気味。プログラミング以外にも、ゲーム関連の記事、日々の戯言など。
【Unity】自機を表示して移動させる【簡単な2DSTGを作ってみるNo.1】

【Unity】自機弾を発射する(プレハブ化する)【簡単な2DSTGを作ってみるNo.2】

【Unity】敵のアニメーション表示と移動(プレハブ化する)【簡単な2DSTGを作ってみるNo.3】

【Unity】自機狙い弾を発射させる【簡単な2DSTGを作ってみるNo.4】

【Unity】背景の表示とオブジェクトの表示順位【簡単な2DSTGを作ってみるNo.5】

【Unity】当たり判定の追加【簡単な2DSTGを作ってみるNo.6】

【Unity】爆破アニメーションの追加【簡単な2DSTGを作ってみるNo.7】

【Unity】タイトル画面の追加(シーン移行)とテキスト表示【簡単な2DSTGを作ってみるNo.8】

【Unity】ボスの追加【簡単な2DSTGを作ってみるNo.9】

当たり判定を追加します。
Unityには当たり判定を行ってくれる機能(コンポーネント)があるので、これを使うと非常に簡単に複雑な当たり判定を実装することが出来ます。
使用するコンポーネントはなんちゃらColliderとRigidbody。(なんちゃらColliderのなんちゃらにはサークルとかボックスとかポリゴンとか色々な種類があります。)

オブジェクトにコンポーネントをアタッチしていくのですが、そのままだと全てのオブジェクト同士が当たってしまうので、レイヤー機能を使って当たり判定を行いたいオブジェクトの設定を行います。

右上のLayersタブを開いてTagsとLayersを画像のように編集します。
Tagsは
tag0 ship
tag1 ship_bullet
tag2 enemy
tag3 enemy_bullet

Layersタブは
Layer8 ship
Layer9 enemy
Layer10 ship_bullet
Layer11 enemy_bullet


自機や自機弾、敵、敵弾のInspectorのTagとLayerを変更します。


変更したらファイルメニュー→Edit→Project Settings→Physics 2dを選択します。


下図のような表が出てきますので画像のようにレ点を入れます。
当たり判定を行いたい物の設定ですね。


オブジェクトの方も弄っていきます。
Hierarchyタブのshipを選択して右下のAdd Componentをクリック→Physics 2d→Circle Collider 2DをクリックしてshipにCircle Collider 2Dをアタッチします。
Is Triggerにレ点を入れてRadiusで緑の丸の範囲を調整します。この緑の丸が当たり判定される部分となります。今回は0.1に設定しました。
ちなみにIs Triggerにレ点を入れないと当たった時に反射するようになります。

次にAdd Componentをクリック→Physics 2d→Rigidbody 2Dを選択してアタッチします。
Body TypeをKinematicにすればOK。
Collider 2Dは全てのオブジェクトに必要ですがRigidbody 2Dは判定するオブジェクトのどちらかにアタッチされていれば良いです。


同じように自機弾ship_bullet_prefabにはCircle Collider 2DとRigidbody 2Dをアタッチ。
敵enemy_prefabと敵弾enemy_bullet_prefabにはCircle Collider 2Dをアタッチしておきます。

スプリクトで当たり判定を行います。
当たり判定はOnTriggerEnter2D関数で行います。
他にもOnTriggerStay2DとOnTriggerExit2Dがありまして
OnTriggerEnter2Dは当たった時
OnTriggerStay2Dは当たってる間中
OnTriggerExit2Dは当たってから離れた時
にそれぞれ呼び出される関数となります。
enemy0_moveスクリプトの一番下に
void OnTriggerEnter2D(Collider2D coll)
    {
          Destroy(coll.gameObject);
          Destroy(gameObject);
    }
を追加してみて下さい。
追加したら再生ボタンを押すと、自機弾と敵が当たったら自機弾と敵が消滅したと思います。でも敵と自機が当たっても敵と自機が消滅してしまいます。
出来れば自機弾が当たった時と自機が当たった時の挙動は違うものにしたいです。
ここで活躍するのが最初に設定したTagsです。
void OnTriggerEnter2D(Collider2D coll)
    {
        if (coll.tag == "ship")
        {
            Destroy(gameObject);
        }
        if (coll.tag == "ship_bullet")
        {
            Destroy(coll.gameObject);
            Destroy(gameObject);
        }
    }
上記のように書くと当たったのが"ship"なら敵だけ削除、"ship_bullet"なら敵と自機弾削除のように挙動を変更することが出来ます。
それらを踏まえたenemy0_moveスクリプトが下記になります。

このコードを入力して再生すれば自機弾と自機が敵に当たった時は敵が削除されると思います。
正直、これだけの事でもプログラム的に実装しようと思うとかなり大変なのですが、数行のプログラムだけで当たり判定が出来てしまうのは便利だなぁと思いました。
PR
この記事にコメントする
お名前
タイトル
メールアドレス
URL
コメント
パスワード   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
カウンター
Twitter
カレンダー
10 2018/11 12
S M T W T F S
2 3
4 5 6 8 9 10
11 12 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
最新コメント
[11/24 kt.]
[11/24 kt.]
[11/24 NONAME]
[11/23 NONAME]
[10/05 tejas]
プロフィール
HN:
kt.
HP:
性別:
男性
自己紹介:
STG大好きな45歳。
プログラミング経験は昔ファミリーベーシックでちょっとさわったくらい。
好きなSTGは、怒首領蜂大往生、エスプガルーダ(2)等の弾幕STGやら雷電シリーズなんかの非弾幕、バトルガレッガ、グラディウスシリーズ、R-TYPE等、STGなら何でも好きです。
音楽がカッコイイSTGが特に好きで、並木学氏は最高!
ブログ内検索
忍者ブログ [PR]