(1) コリジョンマスクによる衝突のフィルタリング


新たに「APPLE」シーンを作成する

メニューから「シーン → 新しい継承シーン」を選択し、「actor.tscn」を選ぶ

シーンドックの「Actor」を「APPLE」に変更する

シーンドックの「APPLE」を右クリックして「スクリプトを拡張」を選び、APPLEのスクリプトファイル(apple.gd)を作成する。

Sprite2Dノードをクリックし、ファイルシステムドッグ内の「img/APPLE.jpg」を「Texure」の「<空>」にドッグする

2D画面を表示し、画像が表示されていることを確認する

CollisionShape2Dノードをクリックし、「Shape」を「CircleShape2D」にし、当たり判定の領域を調整する

Ctrl+S を押してAPPLEシーン(apple.tscn)を保存する

タブでMyWorldシーンに切り替える

2D画面を開き、APPLEシーンをひとつインスタンス化して適当な位置に移動する。

スクリプト画面に切り替えて taro.gd を開く

taro.gd の下の方に以下のソースコードを追加する

ソース 1: 当たり判定
# 他のキャラクターに消失したときに呼び出される関数
# 引数 area に衝突したキャラクターが入る
func _on_area_entered(area: Area2D) -> void:
	$"../CanvasLayer/Label".text = "ITAI"
	$"../CanvasLayer/Label".show()


MyWorldシーンを開いているのを確認してから「現在のシーンを実行」ボタンを押し、TAROがAPPLEに当たるとラベルに「ITAI」と表示されることを確認する。

APPLEシーンを開き、APPLEをクリックしてからインスペクタドックの 「CollisionObject2D → Collision → Layer」を 1 から 2 に変更するとAPPLEのコリジョンレイヤーが 1 から 2 に変更される。

TAROシーンを開き、TAROをクリックしてからインスペクタドックの 「CollisionObject2D → Collision → Mask」の 2 をオフにする。するとコリジョンレイヤー2に属しているキャラクターと衝突しなくなる。

MyWorldシーンを開いて「現在のシーンを実行」ボタンを押し、TAROがAPPLEに当たってもラベルの表示が変化しない事を確認する。

(2) グローバルグループによる衝突時の場合分け


新たに「ORANGE」シーンを作成する

メニューから「シーン → 新しい継承シーン」を選択し、「actor.tscn」を選ぶ

シーンドックの「Actor」を「ORANGE」に変更する

シーンドックの「ORANGE」を右クリックして「スクリプトを拡張」を選び、ORANGEのスクリプトファイル(orange.gd)を作成する。

Sprite2Dノードをクリックし、ファイルシステムドッグ内の「img/ORANGE.jpg」を「Texure」の「<空>」にドッグする

2D画面を表示し、画像が表示されていることを確認する

CollisionShape2Dノードをクリックし、「Shape」を「CircleShape2D」にし、当たり判定の領域を調整する

ORANGE をクリックしてからインスペクタドックの右にあるグループドックを開き、「+」ボタンを押し、名前に Enemy と入れ、グローバルをセットし、作成ボタンを押してEnemyグループを作成する。すると ORANGEが Enemy グローバルグループに登録される。

Ctrl+S を押してORANGEシーン(orange.tscn)を保存する

タブでHANAKOシーンに切り替える

HANAKO をクリックしてからグループドックを開き、「+」ボタンを押し、名前に Friene と入れ、グローバルをセットし、作成ボタンを押して Friend グループを作成する。すると HANAKOが Friend グローバルグループに登録される。

Ctrl+S を押してFriendシーン(friend.tscn)を保存する

タブでMyWorldシーンに切り替える

2D画面を開き、ORANGEシーンをひとつインスタンス化して適当な位置に移動する。

スクリプト画面に切り替えて taro.gd を開く

_on_area_entered関数を次のコードに変更する

ソース 1: 当たり判定
func _on_area_entered(area: Area2D) -> void:
	# 当たったキャラクターが"Enemy"グローバルグループに属しているか判定
	if area.is_in_group("Enemy"):
		$"../CanvasLayer/Label".text = "ITAI"
		$"../CanvasLayer/Label".show()
	# 当たったキャラクターが"Friend"グローバルグループに属しているか判定
	if area.is_in_group("Friend"):
		$"../CanvasLayer/Label".text = "Konnitiwa"
		$"../CanvasLayer/Label".show()


MyWorldシーンを開いているのを確認してから「現在のシーンを実行」ボタンを押し、TAROがORANGEに当たるとラベルに「ITAI」、HANAKOに当たると「Konnitiwa」と表示されることを確認する。