0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Godot4でノックバックを実装したらキャラが連れ去られた

Posted at

プレイヤー連れ去られ事件の概要

Godot4でバンサバライクなゲームを作ってますが、プレイヤーと敵が接触したときに敵を吹き飛ばすようにしたかったんです。

いざやってみると、横や上からはちゃんと動くんです。
なんだ結構簡単じゃん。下からも大丈夫かな?
そしたらこれ↓ですよ。

_人人人人人人人人人人人人人人人_
> プレイヤー連れ去られ事件! <
 ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y ̄

プレイヤーキャラと敵はどちらもCharacterBody2Dで作成してました。

接触判定はこんな感じの実装です

func _physics_process(delta: float) -> void:
  for i in get_slide_collision_count():
    var collision = get_slide_collision(i)
    var collider = collision.get_collider()
    if collider.is_in_group("Player"):
      # 衝突!

実装には特におかしな点はありません。
だって下以外からの接触はちゃんと動いてるんですから。

事件の真相

真相と言いつつ本当に正しいかは不明です。

私の予想では、おそらく当たり判定のめり込みが発生したのだと思います。
なぜ下からのみめり込むのかは不明ですが、判定がめり込んだまま敵が下に動き、自機にも同じ方向への力が加わり、結果的に連れ去られたのだと思います。

よって解決方法としてはめり込まないようにすること。
つまりある程度の距離を取ること。そう、shall distance.

衝突判定の実装を変更し、実距離を参照することも考えました。
ですが現時点でのイラストは仮置きなため、諸々の値があとで変わる可能性が高いです。
それにそういった実装は得てして不安定になります。経験則。

なので別の方法を取る必要があります。
そこで見つけました。Safe Marginのパラメータを。

Extra margin used for collision recovery when calling move_and_slide().
If the body is at least this close to another body, it will consider them to be colliding and will be pushed away before performing the actual motion.
A higher value means it's more flexible for detecting collision, which helps with consistently detecting walls and floors.
A lower value forces the collision algorithm to use more exact detection, so it can be used in cases that specifically require precision, e.g at very low scale to avoid visible jittering, or for stability with a stack of character bodies.

move_and_slide() 呼び出し時に、衝突検出のために使用される追加のマージンです。
この値は、ボディが他のボディにこの距離以上近い場合に衝突とみなされ、実際の移動処理の前に押し出されるかどうかを判断するために使用されます。
値が高いほど衝突検出に柔軟性が増し、壁や床をより確実に検出するのに役立ちます。
一方、値が低いと、衝突アルゴリズムはより正確な検出を行うようになります。これは、非常に低いスケールでの目に見えるちらつきを防ぐ場合や、キャラクターボディを積み重ねた際の安定性など、特に精度が要求される場合に役立ちます。

どうやら、少し離れていても接触扱いにしてくれるようです。
これだよこれ、ちょうど欲しかった機能だよ。

早速試してみます。
初期値で0.08pxというあるのか無いのか分からないゴミみたいな値だったので、とりあえず5pxに広げました。
その結果がこちら↓。

完璧に動いてますね。
Godot村から誘拐犯が消え、平和が訪れました。

めでたしめでたし。

参考記事

【Godot】move_and_slideとmove_towardの使い分け:ノックバック処理の実装


(P.S.)
AIに聞いても教えてくれなかったし、いろんなノックバック実装の記事見ても書いてないんですが、皆ちゃんと動いてるんですか?おまかんですか?やめてもらっていいですか?

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?