敵オブジェクトに乗れないように/乗られないようにしたい

お世話になっております。
掲題の件について、敵オブジェクトに
・横での接触:可能
・上または下で接触:乗れないように(滑り落ちるように)したい
といったことは可能でしょうか。
CollisionShape2Dのシェイプをcapsuleやcircleにして、CharacterBody2Dのfloor_max_angleをかなり小さい値にすれば実現可能のようですが、現状マップに最大45度の傾斜があるため、floor_max_angleはデフォルト値の45度にしたまま掲題の機能を実現したく考えております。

CollisionPolygon2Dを使用して上下を尖らせる、上または下で接触した場合にレイヤーやマスクを切り替える、One Way Collitionを利用する等も検討してみたのですが、どれも現実的ではなく上手くいかずでした。。。
何か別の代替案があれば教えてください。

私の理解では、横からは壁のように振る舞うが、上や下からは踏めず、またマウントもできない敵を求めているとのことですね。狙いは理解できますが、ここでデザイン上の考慮点を一つ提案させてください。プラットフォームゲームの物理エンジンにおいて、これをきれいに実装するのは非常に難しく、多くのアクションプラットフォームゲームでは敵との接触をそのような方式で処理していません。

私の推奨としては、これはデザイン上の判断として捉えることです。敵のAttackAreaとプレイヤーのHitAreaによる接触判定を採用する方が、はるかに容易で予測可能であり、ジャンルの標準的な手法です。私が検討するいくつかのアプローチは以下の通りです:

  1. すり抜け攻撃。プレイヤーは敵を自由にすり抜けます。プレイヤーを脅かすのは敵の攻撃(振り攻撃、弾など)であり、重要なのはタイミングと位置取りであって、体当たりではありません。アクションプラットフォームゲームでは非常に一般的な手法です。
  2. すり抜け接触ダメージ。プレイヤーはすり抜けますが、敵には接触するとダメージを与えるAttackAreaがあり、ノックバックでプレイヤーが押し戻されます。『カストルヴァニア』や『メトロイド』スタイルです。
  3. 上部にバウンズゾーンを持つ接触ダメージ。上記と同様ですが、上部(および必要に応じて上方向攻撃用の下部)にHitではなくバウンスをトリガーとする別のAttackAreaを追加します。『マリオ』の踏みつけスタイルです。
  4. 上記の組み合わせ。敵の種類ごとにこれらの要素を組み合わせます。すり抜け型の敵、接触でダメージを与える敵、踏みつけ可能な敵などを混在させます。

Option 1または2が、通常は最もクリーンなスタート地点となり、そこからバウンズゾーンを追加したり、敵ごとに挙動を混ぜたりすることができます。

「いいね!」 1

ありがとうございます。
その認識で合っています。また、ご提案もありがとうございます。
既存機能ではなかなか実現が難しい旨承知いたしました。

質問させていただいた後も自分で検討して、一旦以下の実装で進めてみようと思います。

  1. オブジェクトにArea2Dを追加

  2. Area2DにCollisionShape2Dを追加してオブジェクトの底面に設置

  3. Area2Dのスクリプトに以下を記載

extends Area2D

弾き出す強さ(ピクセル数)

@export var push_dist: float = 5.0

func _physics_process(_delta):
var bodies = get_overlapping_bodies()

for body in bodies:
# 自分(親)自身を除外
if body == get_parent():
continue

\# 相手が特定のグループに属しているか確認
if body.is_in_group("Enemy"):
	var parent = get_parent() as CharacterBody2D
	if parent:
		\# 相手との位置関係を見て左右に強制移動
		var direction = 1 if parent.global_position.x > body.global_position.x else -1
		\# 座標を直接書き換えることで、物理演算を無視して押し出す
		parent.global_position.x += direction \* push_dist

少し不格好かもしれない、かつ上記でどの程度処理が重くなってしまうか不明ですが、今後検証しながら進めてみようと思います。

testmovie (1)

必要に応じてご提案頂いたアプローチも参考にさせていただこうと思います。
ありがとうございました。