【Godot4.x】タイルマップに一方通行床を設定する方法

このページでは、タイルマップに One-Way-Platform (一方通行床) を設定する方法について説明します。

一方通行コリジョンを設定する方法

タイルマップについて

タイルマップの使い方については以下のページに記載しています。

【Godot4.x】タイルマップの基本的な使い方

一方通行床とは

One-Way-Platform (一方通行床) とは、上から方向の衝突のみ行うコリジョンです。このコリジョンを使うことでマップ作成の自由度が上がるためレベルデザインにおいて重要なタイルとなります。

タイルマップに一方通行床を設定する方法

タイルマップにコリジョンの設定ができていれば、「物理 > Physics Layer > Polygon」のところにある「One Way」にチェックを入れることで一方通行床となります。

なお、タイルセットにコリジョンを設定するには、Tilesetのインスペクタにある「Physics Layers」の要素を追加しておく必要があります。

Collision Layer と Collision Mask については以下の記事に書いています。

【Godot】コリジョンレイヤーとマスクについて

飛び降りを実装する

一方通行床からの飛び降りができると、さらにマップの自由度が上がります。

飛び降りを実装するには Physics Layers を複数用意して、一方通行床に別の Collision Mask を割り当てておきます。

Tilesetのインスペクタから、例えば 通常壁の Collision Layer を「2」一方通行床用の Collision Layer を「3」とします。

一方通行床には2つめの Physics Layer を使用するようにします。(1つめのものには何も設定しません)

後はプレイヤー側で飛び降り中は “collision_mask” のビットを下ろすようにすることで床のすり抜けが実装できます。

	var oneway_layer = 3
  var oneway_bit = int(pow(2, oneway_layer-1)
	if _is_fall_through:
		# 飛び降り中なのでビットを下げる.
		collision_mask &= ~oneway_bit
	else:
		collision_mask |= oneway_bit

飛び降りの問題点の対処法

コリジョンマスクを変更する方法だと is_on_floor() が false にならず、落下処理が正常に行われないことがあります。

例えば上記のように「壁に接触している」 かつ「壁に向かって移動している」状態で、collision_mask を変更することで通り抜けする方法を行うと、is_on_floor が「true」から変わらないため落下処理が正常に行われなくなります(おそらく Y方向への落下がリセットされてしまうため?)。

これを回避するには「飛び降り」を開始する1フレームだけ X方向への移動を「0」にすると正常に落下できるようになります。