【Godot】move_and_slideで動かしているKinematicBody2Dの向きを反転させようとscaleを直接操作したらバグった

はい。長くてわかりづらいタイトルになってしまった気がする。

Godotでゲームを作っていると、キャラクターのスプライトやらなんやらを反転させたいことがよくある。
矢印キーの右を押せば右に向いて、左を押せば左を向くみたいな。

こういうとき、反転させたいノードのscaleにマイナスを掛けると反転させることができる。
scaleが(1,1)だとしたら(-1,1)にすると左右反転、(1,-1)にすると上下反転するというテクニック。

しかし表題にあるとおり、move_and_slideで動かしてるオブジェクトのscaleをいじったところ、反転したりしなかったりと不可解な動きになってしまった。
詳しいことはよくわからないが、オブジェクトを物理演算で動かしているときはscaleを直接いじるんじゃないということみたいだ。これはRigidBodyも同様だろうねきっと。

ということで、スプライトを反転させたいときはKinematicBody2Dではなく、スプライトのscaleをいじればいい。
反転させたい対象がいくつもある場合は、Positon2Dとかにまとめてぶら下げてしまい、Position2DのscaleをいじればOK。

ちなみに似たような問題として、RigidBody2Dのpositionを直接書き換えるようなことをすると、これまた不可解な動きをしてしまう。 物理エンジンが計算しているところを邪魔するなってことですね。

この場合、_integrate_forces()を使うことで上手く制御することができる。↓のような感じ。

    func _integrate_forces(state):
        var xform = state.get_transform()
        xform.origin = hoge # ここで位置を好きに書き換える
        state.set_transform(xform)

なんかとっ散らかった文章になったが、書かないよりはマシだろう。以上。