【Defold】衝突判定を付ける

2019/07/10Defold, DEVELOP

シューティングゲームの自機が発射した弾と敵キャラクターの様に衝突判定が必要な個所では、GameObjectにコリジョンコンポーネントを追加することで衝突判定ができる様になります。

そもそもDefold Engineって何?という方はこちら

サンプル

鳥さんが星を撃墜しています。

Collisionコンポーネントを追加する

衝突用のCollisionコンポーネントを追加するには、GameObjectを選択して右クリック->[Add Component]->[Collision Object]を選択します。

作成したcollisionobjectを右クリック->[Add Shape]で衝突判定用の形を選択しサイズを調整します。

円以外の他には四角やカプセル型もあります。

CollisionObjectのプロパティ設定

プロパティ
TypeKinematic
Group衝突グループA。分かりやすい名前を設定して下さい
Maskここで設定したグループと衝突判定が行われます

Typeは重力の影響を受けたくないのでKinematicに変更 しています。GroupやMaskは状況によって設定してみてくください。例えばシューティングゲームの弾と敵との衝突判定を付ける場合は、

弾のプロパティ

プロパティ
TypeKinematic
Groupbullet
Maskenemy

敵のプロパティ

プロパティ
TypeKinematic
Groupenemy
Maskbullet

この様に設定します。これで弾は敵と衝突しますし、敵と弾は衝突します。

コードを書く

衝突判定が取れる様にcollisionobjectの設定が終えたら、次はコードを書いていきます、まずは弾の方から

function on_message(self, message_id, message, sender)

	if message_id == hash("collision_response") then
		if message.group == hash("enemy") then
			go.delete()
		end
	end	
end

この様な何時でon_messageにメッセージが飛んできます。メッセージ内容がcollision_responseかどうかを確認し、衝突した時のグループがenemyなのかどうかをチェックしています。弾が衝突した対象がenemyであれば、自身を削除、つまり弾を削除しています。

これと同様に敵のスクリプトも書いていきます。

function on_message(self, message_id, message, sender)

	if message_id == hash("collision_response") then
		if message.group == hash("bullet") then
			go.delete()
		end
	end	
end

弾のスクリプトとほとんど同じです。違いは衝突確認するグループが弾なのかどうかという点です。敵は弾と衝突したかどうかを知りたいので、bulletグループかどうかを確認しています。衝突したことを確認できたら、敵を削除しています。

Posted by kazupon