マリオ風ゲームの制作で地面判定を斜面でも正常に行いたい。

質問内容

マリオ風ゲームの制作で提示画像の実行画面の下のログですが。地面に居るのに斜面では足元に何もなくなる瞬間があるので、その瞬間にジャンプ出来ないという判定が降りてしまう。原因を対処したいです。

知りたいこと

斜面でも地面判定を途切れず行いたい

作っているもの

マリオ風 2Dゲーム

現状

地面では問題なし、斜面でログのように、斜面を移動したり、地面とのつなぎ目でジャンプ不可能(空中判定)がされてしまいます。一瞬

試したこと

1,プレイヤーのRectangleShape2D → Size.Yの値を大きくすると物理的に修正出来ますが、ジャンプ処理で地面上数ピクセル内で地面判定を下すことになってしまうので違います。

2,if(checkGround.isJumpEnabled == true) 内部でVelocity.Yを変更してジャンプしていない時の専用の貼り付け強制重力をせっていしてみたのですが、今度は斜面から上がれません。

提示コードについて

PlayerController プレイヤー操作 Playerノードにアタッチ
CheckGround: 地面判定 PlayerノードのCheckGround (Area2D) にアタッチ

環境

Godot: 4.6
Lang: C#



https://cdn.discordapp.com/attachments/1486988234914402407/1486988236516626573/PlayerController.cs?ex=69c78136&is=69c62fb6&hm=928eb3d51528a935f26a3239ad818b9b57fff1e0ff3cf3cd8ac6936b25dcc5bb&
https://cdn.discordapp.com/attachments/1486988234914402407/1486988236843778200/CheckGround.cs?ex=69c78136&is=69c62fb6&hm=1761047ede057e9bcb7434f570043a3df04511e986aad78515a0534301788f4a&


from Discord by amagichan00

CharacterBodyを使ってるならIsOnFloor()を使ったほうがいいんじゃないかと思います。

(なんならジャンプ含めサンプルコードまんまでスロープの処理は自動でやってくれるかと)

もうすこし細かく制御したい場合はRayCastも検討してもいいと思いますが、基本はサンプルコードで基本は十分だと思います


from Discord by _saitos

ありがとうございます。IsOnFloor()はキャラの横壁と当たったときにtrueしてしまうので、変更する必要がありました


from Discord by amagichan00

自己解決 対処方法 Area2Dはイベントではなく、Overlappingで取る```cs var bodies = checkGround.GetOverlappingBodies();
if(bodies.Count > 0)
{
foreach(var body in bodies)
{
if(body.Name != Name)
{
isJumpEnabled = true;
break;
}
}
}
else
{
isJumpEnabled = false;
}


---
*from Discord by amagichan00*

横壁でtrueが返るってのはおかしいですね。
たぶん何か別の処理でうまく取れてないんだと思いますよ。
IsOnWallやIsOnFloorはだいぶ精度が良くなりましたし、シンプルな2Dならほとんど問題なく動くかと思います


from Discord by _saitos

ありがとうございます。斜面を登る時だけ微妙にがくつような動きになるのはなぜでしょうか? IsOnFloor()にを使うことにしたのですが、以前としてこれは解決されません


from Discord by amagichan00

矩形の衝突判定だからとかですかね
カプセルがおすすめです


from Discord by _saitos

ありがとうございます。カプセルなのですが、治りません。


from Discord by amagichan00

スロープの角度やスロープとしての許容値の問題もあるかもしれませんね。

そのへんはいろんな要素が絡んでるので一概に言えませんが、まずはチュートリアルをそのまま作ってみてどう動くか見てみるとよいかと思います


from Discord by _saitos

わかりました。ありがとうございました。


from Discord by amagichan00