isa
2026 年 4 月 22 日午前 5:25
1
お世話になっております。
掲題の件について、敵オブジェクトに
・横での接触:可能
・上または下で接触:乗れないように(滑り落ちるように)したい
といったことは可能でしょうか。
CollisionShape2Dのシェイプをcapsuleやcircleにして、CharacterBody2Dのfloor_max_angleをかなり小さい値にすれば実現可能のようですが、現状マップに最大45度の傾斜があるため、floor_max_angleはデフォルト値の45度にしたまま掲題の機能を実現したく考えております。
CollisionPolygon2Dを使用して上下を尖らせる、上または下で接触した場合にレイヤーやマスクを切り替える、One Way Collitionを利用する等も検討してみたのですが、どれも現実的ではなく上手くいかずでした。。。
何か別の代替案があれば教えてください。
Baz
2026 年 4 月 22 日午後 8:34
2
私の理解では、横からは壁のように振る舞うが、上や下からは踏めず、またマウントもできない敵を求めているとのことですね。狙いは理解できますが、ここでデザイン上の考慮点を一つ提案させてください。プラットフォームゲームの物理エンジンにおいて、これをきれいに実装するのは非常に難しく、多くのアクションプラットフォームゲームでは敵との接触をそのような方式で処理していません。
私の推奨としては、これはデザイン上の判断として捉えることです。敵のAttackAreaとプレイヤーのHitAreaによる接触判定を採用する方が、はるかに容易で予測可能であり、ジャンルの標準的な手法です。私が検討するいくつかのアプローチは以下の通りです:
すり抜け攻撃 。プレイヤーは敵を自由にすり抜けます。プレイヤーを脅かすのは敵の攻撃(振り攻撃、弾など)であり、重要なのはタイミングと位置取りであって、体当たりではありません。アクションプラットフォームゲームでは非常に一般的な手法です。
すり抜け接触ダメージ 。プレイヤーはすり抜けますが、敵には接触するとダメージを与えるAttackAreaがあり、ノックバックでプレイヤーが押し戻されます。『カストルヴァニア』や『メトロイド』スタイルです。
上部にバウンズゾーンを持つ接触ダメージ 。上記と同様ですが、上部(および必要に応じて上方向攻撃用の下部)にHitではなくバウンスをトリガーとする別のAttackAreaを追加します。『マリオ』の踏みつけスタイルです。
上記の組み合わせ 。敵の種類ごとにこれらの要素を組み合わせます。すり抜け型の敵、接触でダメージを与える敵、踏みつけ可能な敵などを混在させます。
Option 1または2が、通常は最もクリーンなスタート地点となり、そこからバウンズゾーンを追加したり、敵ごとに挙動を混ぜたりすることができます。
「いいね!」 1
isa
2026 年 4 月 23 日午前 1:20
3
ありがとうございます。
その認識で合っています。また、ご提案もありがとうございます。
既存機能ではなかなか実現が難しい旨承知いたしました。
質問させていただいた後も自分で検討して、一旦以下の実装で進めてみようと思います。
オブジェクトにArea2Dを追加
Area2DにCollisionShape2Dを追加してオブジェクトの底面に設置
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
少し不格好かもしれない、かつ上記でどの程度処理が重くなってしまうか不明ですが、今後検証しながら進めてみようと思います。
必要に応じてご提案頂いたアプローチも参考にさせていただこうと思います。
ありがとうございました。