上下に移動する床にプレイヤーが乗ると、上に移動中若干床にめり込んでしまいます。同じように左右に移動する床に乗っても左右に少しズレてしまいます。これを回避する良い方法はあるでしょうか?
CharacterBody2D同士では物理判定が「双方」から発生してしまうためこのような挙動が起きると思われます。
対処方法についてですが、以下2点のいずれかではいかがでしょうか?
-
GameObject自体のコリジョンは使用せず、AnimatableBody2Dをゲームオブジェクトの子として作成し、その子にあるCollisionShape2Dで壁判定を作る。
-
同様にTileMapLayerを子として使い、TileMapLayerで移動床を作る。
1.埋まる以外は正しく動作している動く床にAnimatableBody2Dを追加し、既存のCollisionShape2Dを子に設定したところ、床と違う場所に見えない判定が出現する挙動になってしまい、上手く機能しませんでした。
2.動く床をTileMapLayerに配置してみましたが特に変化ありませんでした。
なるほど・・・・少し手元でためしてみます。
諸々調べて試してみました。まず、前提として、この問題はGodotの仕様によるものが大きいです。
問題はキャラ、床の双方で物理処理を行っているため、「床が動く」「キャラが動きを検知して動く」の処理順次第でめり込みが発生し、それを解消しようとして動いてズレるという動作をします。
結論からいうと、GameObjectを使わずAnimatableBody2Dを使うことが解決方法になります。
試しに以下のオブジェクトをフィールドに置いて乗ってみていただければ1ドットズレは起きないと思います。
animatablebody_test.zip (1.6 KB)
一方で、これをそのまま使うと着地に遷移しないはずで検知のための処理が必要です。恐らくArea2D等で処理を作る必要があるとおもうのですが、何が最適な方法かを開発に確認させていただきます。
こちら確認をしまして、
AnimatableBody2DのCollision2Dとも「オブジェクトの壁判定と接触」の遷移がとれるとのことでしたので前コメントのものを使っていただき、AnimatableBody2Dに「グループ」を設定いただけば着地もとることができました!
単純な足場であればこのままお使いいただき、
スイッチで動き出す、等の動作をしたい場合はシグナルなどを使っていただく形になるかなとおもいます。
色々試してみて概ね想定通りにはなったんですが、上下への移動中一瞬主人公が空中判定になってしまいます。これは解消でき得る問題でしょうか?
AnimatableBody2Dであれば、snaplengthの設定が聞くはずなのでsnaplengthを長めに取れば起きないのではないか?とおもいますがどうでしょうか?
snaplengthってプレイヤー側のですよね?いま20ピクセルにしてます。
あまり大きくするとおかしい挙動になるんですが、どの程度にすれば良いでしょうか?
プラットフォームの速度によると思います。
1フレーム(0.016秒)以内にsnaplength以上に離れると吸い付き効果が失われて浮いてしまうとおもいますので、プラットフォームの移動速度*0.016に少しバッファをもたせた数字をsnaplengthにしていれば吸い付くのではないかと思いますが・・・
速度を落としてみました、今のところ見た感じ正しく機能しているようです。速度に限界は出てしまいますが・・・現状許容範囲かなと思います。ありがとうございます。
以下の問題は検証中ですが、何か思いつくことがあればご教示願います。
・すりぬけ床をAnimatableBody2Dにすると一瞬着地判定が出てしまう
通常の壁判定だとOneWayCollisionで作成した下から上へ抜けられる床が正しく機能していたのですが、AnimatableBody2Dにすると上へ抜けた時一瞬下方向で接触した判定になってしまうようです。
・AnimatableBody2Dの天井に頭をぶつけられない
「オブジェクトの壁判定で上昇を止める」にチェックが入っていてもAnimatableBody2Dは判定外らしく上昇が止まりません。まあ上方向で接触した際にベクトルを0にするアクション等を入れれば何とかなるかもしれませんが、微妙に不自然な仕様のような気もするような。
こちら2点手元で確認後開発に報告させていただきます。
こちら2点の問題を本日配信の1.0.21で修正させていただきました。ご確認をいただければと思います。
2点の問題に関しては正しく機能しているようです。
・・・が、上に向かって移動している足場に着地できなくなってしまいました。あまり細かく検証してませんがver1.06に戻すと着地できるので最近の壁判定修正によるエンバグかもしれません。
手元で試したところ着地できているようでした、もう少し詳しく情報を教えていただくことはできますか?