当たり判定の基本

■当たり判定

	
当たり判定はゲーム内のオブジェクト同士が当たっている(重なり、衝突等)か
どうかを判定する処理の総称です。
判定に使用するゲームオブジェクトはプレイヤーや敵、ステージだけではなく、
カメラやライトなど様々なオブジェクトが対象となります。
ほとんどのゲームで当たり判定は実装されており、
「描画」「入力」「音」のゲームの基本要素と同レベルで必須とされる機能です。

hit_0002
hit_0002

上の絵では次フレームに弾と敵オブジェクトの当たり判定で当たっていると判定され、
弾が消えたり、敵が爆発したりします。

■判定の種類

判定には様々な種類があります。
※各判定については記事を書いたらリンクを張ります。

●点と円
	点と円の当たり判定を行います。

●円と円
	円と円の当たり判定を行います。

●矩形と矩形

●矩形(回転有り)と矩形(回転有り)

●矩形と円

●矩形(回転有り)と円

●矩形と線

●矩形と円

●球と球

●立方体と立方体

●立方体(回転有り)と立方体(回転有り)

●球と立方体

●球と線

●立方体と線

●カプセルとカプセル

■判定に必要な情報

●必須情報
	当たり判定の必須情報は「当たっているか」「当たっていないか」です。
	当たり判定の関数では戻り値をbool型にしているケースが多いです。

	例:
		bool IsCollisionHit(オブジェクト1, オブジェクト2)
		{
			if (オブジェクト1とオブジェクト2が当たっている)
			{
				return true;
			}
			return false;
		}

●詳細情報
	詳細情報はゲーム毎、当たり毎に必要な内容が異なるので、
	明確な情報があるわけではありませんが、
	当たった相手の情報や当たった位置、距離など、
	判定後の処理に必要な情報を用意します。

■判定の流れ


	hit_0001
	hit_0001

上のフローは当たり判定の流れの例の1つです。

①.判定用データの準備
	判定を行うオブジェクトを用意します。
	当たり判定は基本的に2つのオブジェクトで行うので、
	データは2つ用意して下さい。

②.判定
	判定は①のデータに対して当たっているかどうかを判定します。
	この判定で使用する方法は「■判定の種類」で紹介している方法を使用します。
	判定の結果、当たっていると判定されたら③へ進み、
	当たっていなければ判定に関する処理は終了です。

③.相手情報の通知
	当たっていた場合は、移動を制限したり、描画をとめたり、
	パラメータを変更したりと様々な対応を行う必要があります。
	そのためには「誰と当たったか」「どこで当たったたか」などの
	情報が必要になることがあるので、当たりと判断されたら、
	それらの情報を各データに渡します。

④.当たりの対応
	誰と当たったかなどの情報から当たったあとの対応を行います。
	ここで移動の制限やHP、残機などの減少処理などを実装します。

●注意点
	今回紹介している当たり判定のフローは数あるフローの中の1つです。
	全てのゲームがこのフローにより当たり判定を実装しているわけではありません。
	例えばプレイヤーオブジェクトに敵との当たり判定や
	ステージとの当たり判定の関数を実装したり、
	④の当たりの対応を次フレームのゲーム処理にまわすこともあります。
	フローの好き嫌いや、最適な方法はゲームによって異なるので、
	今回のフローはあくまで参考程度にとどめてください。
	通知情報のデータも例として書いており、ゲームによってデータは変わります。

■最適化について

当たり判定は詳細な判定を求めれば求めるほど、処理コストが上昇します。
その結果、パフォーマンスが低下し、ゲームとして満足に動作しなくなります。
当たり判定はある程度の妥協と判定の最適化が必須になります。

●最適化
	当たり判定を行う上で判定の最適化は必須です。
	最も効果的な方法のひとつとして「判定を行わない」が考えられます。
	その他に「判定方法を変更する」「処理コストの低い判定を先に行う」などがあります。

	・判定を行わない
		当たり前の話ですが、判定処理が重いなら判定処理を行わないことが
		一番の最適化につながります。
		判定処理を見てみて必要のない判定を行っていないかを確認して下さい。
		もし、意味のない判定が行われていたらその判定処理を行わないように
		することが最適化につながります。
		
		例①:
			シューティングで相殺するわけでもないのに
			自機の弾と相手の弾で判定を行っている

		例②:
			非アクティブ(非描画)状態のオブジェクトが判定に含まれている

	・判定方法を変更する
		当たり判定は常に詳細な判定を取る必要はありません。
		プレイヤーと敵、敵と敵などに使用する当たりは
		ポリゴン1つ1つに対して判定を取る細かい判定ではなく、
		立方体と立方体など、処理コストの低い判定を使用しても
		十分にゲームとして成り立ちます。

	・処理コストの低い判定を先に行う
		どうしても処理コストの高い判定を行う必要がある場合は
		先に円や球などの処理コストが低い判定処理を行い、
		そちらの判定に当てはまる場合のみ、コストの高い処理をします。