Unity全方位2Dシューティングチュートリアル6回目。当たり判定の実装

「【Unity 入門】全方位シューティングを作る」というサイトのチュートリアルをやってみるシリーズの6回目です。前回は敵の作成を行いました。
Unity全方位2Dシューティングチュートリアル5回目。敵の作成 | 初心者のプログラミング

この記事はUnityさわりたての筆者がとりあえず真似して2Dシューティングを作ってみようという感じで書いてますので解説が全く含まれていません。詳細な解説等がしりたいかたは離脱したほうがよいです。

9.敵と弾の当たり判定

ここでやること

ここでおおまかにやることは以下の作業です

  • 弾のPrefabにcolliderを追加
  • 敵のPrefabにcolliderを追加
  • 敵のPrefabにrigidbodyを追加
  • 弾と敵があたったときのコードを実装

colliderはInspectorのadd componentから検索して追加。is Triggerにチェックをいれておくis Triggerにチェックをいれておかないと当たり判定がされません。

弾と敵のPrefabにcolliderを追加

弾と敵のPrefabにcolliderを追加します。敵のほうにはrigidbody 2dというコンポーネントを追加します。なぜコンポーネントをいろいろ追加しないといけないのかというと、これは当たり判定を実装するうえでおきまりの作業のようなものです。詳細はOnTriggerEnter2Dというメソッドに関係しています。詳しくは公式をみるとよいでしょう。

以下画像です。雑ですが変更箇所はピンクで塗りつぶしてます。
screenshot 20181210 1817

弾と敵が衝突したときの実装

前回の記事でEnemyScriptを作っているので、そのスクリプトにコードを追加します

private void OnTriggerEnter2D(Collider2D collision){
	//弾と衝突した場合
	if(collision.name.Contains("BulletPrefab")){
		//弾を作成よ
		Destroy(collision.gameObject);
		//敵のHPを減らす
		m_hp--;
		//敵のHPがまだのこっている場合はここで処理を追える
		if(0 < m_hp) return;
		//敵を削除する
		Destroy(gameObject);
	}
}

OnTriggerEnter2Dはcolliderがトリガー内に入ると発動します。条件分岐でcollisonをBulletPrefab(弾)のときだったらとしています。条件どおりだったら弾と敵が消えます。

ここまでの状態

弾が敵にあたると消えます。Unityで当たり判定の実装を行うには2つのオブジェクトにcollider。どちらか一方にはrigidbodyが必要になり、これは決まり文句みたいなものなのでここさえ抑えておけばコードはそこまで難しくないかと思います。
screenshot-20181210-1828

10.プレイヤーと敵の当たり判定

ここでやること

ここでやることはおおまけに2つです

  • Playerオブジェクトにcolliderを追加
  • プレイヤーと敵があたったときの処理を実装

Playerオブジェクトにcolliderを追加

Playerオブジェクトを選択後inspectorのadd componentからBox Collider2Dを追加していきます。colliderを追加したらis Triggerにチェックを入れておきます。

Playerと敵があたったときの処理の実装

敵のPlayerの関係を定義するので今回は2つのスクリプトを編集します

  • EnemyScript
  • PlayerScript

EnemyScriptのOnTriggerEneter2Dの末尾に以下のコードを追加します。

//プレイヤーと衝突した場合
if(collision.name.Contains("Player")){
	//プレイヤーにダメージを与える
	var player = collision.GetComponent<PlayerScript>();
	player.Damage(m_damage);
	return;
}

GetComponentを使ってプレイヤーを取得しているのがポイントです

次にPlayerScriptを編集します。PlayerやのHPの追加とPlayerのHPを減らDamage関数を追加します。

public int m_hpMax;//プレイヤーの最大HP
public int m_hp;//プレイヤーのHP

private void Awake(){
	m_hp = m_hpMax;
}

Awakeメソッドは定義こそしていますがこの時点では使いません。次にDamage関数の実装です。PlayerScriptの末尾に追加します。

public void Damage(int damage){
	m_hp -= damage; //hpを減らす
	if(0 < m_hp) return;//hpがまだある場合ここで処理を終える
	gameObject.SetActive(false);//プレイヤーが死んだので消す。
}

PlayerScriptで定義したメソッドはEnemyScriptで実行されます。メンバー(変数)を追加したのでPlayerのHPが設定できるようになりました。EnemyがPlayerに与えるダメージは5。PlayerのHPは10にしました。
screenshot 20181210 1907

ここまでの状態

尺が長くなるので一回あたったとこしかとってませんが、確かにプレイヤーが消えるようになりました。
screenshot-20181210-1911

次の記事

次の記事は爆発エフェクトを表示できるようにしていきます。本家サイトは爆発エフェクトを作成しているのですが、このブログではめんどうなので爆発エフェクトはアセットストアからimportしています。次の記事は↓
Unity全方位2Dシューティングチュートリアル7回目。爆発エフェクト


Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 49

Warning: Undefined array key "thumbnail_url" in /home/users/1/boy.jp-rolpop/web/skc/wp-content/themes/godios/inc/schema-org.php on line 78