2Dキャラクターを泳がせる・改良版
「PhysicsVolume使わない方が楽なのでは……と言ってはみたものの、なんか悔しいので色々試したところ、なんとかそれっぽく泳げるようになった」
妹「これはどうやって泳いでるの?」
「水の設定はそのまま、PhysicsVolumeの液体入りで、ジャンプボタンで泳ぐようにしてある」
妹「でもJumpは効かなかったのでは?」
「2段ジャンプではLaunchCharacterノードを使うと聞いたから、ジャンプのところをこういう風に書き換えてみた」
↓
「こうすると水の力に負けずに進めるから、飛ばす量を調節して泳ぎの速度に合わせる。Overrideにチェックを入れるとその時点での落下速度を無視するから、沈んでいる途中でも安定して泳げる。あとは水中での落下速度をCharacterMovementの浮力で調節してある。結構上に進む力が強くなったから、その分浮力を下げてある」
妹「でもわたしがLaunchCharacterは使ってみたけど上手くいかなかったよ。それ使って作ってあるジャンプ台があるから、地面に置いて乗ってみたんだけど、飛んだ時点で通常モードになって、水中だけどSwimmingじゃなくなっちゃうから、水の中に居るけど泳げなくなるんだよ」
「その問題に関しては、適当なタイミングでSwimmingにしちゃえばいいんだよ。色々方法は考えられるけど、とりあえずイベントティックで落下し始めたのを検知して、Swimmingに切り替えるようにした。これで上にビョインで進みつつ、勢いが尽きたらヒョロヒョロと落ちていく」
「Falling(落下中)であること、水のPhysicsVolumeと重なってること、そしてVelocityが下方向を向いてる時に、Swimmingに切り替えるようにする。」
妹「他はわかるけど、ベロシティってなんだっけ?」
「今動いてるベクトルというか、止まってる時は0で、左に歩いてる時は左方向、右に歩いてる時は右方向のベクトルになる。ジャンプの上昇中だと上に、下降中だと下に。そして移動速度が速いほど大きい数字になる。丁度最初の動画でズラ~って出てきてる数字がそうだよ」
妹「あの数字意味あったんだ……」
「もし重力や空気抵抗がない設定だったら、いったん動き出すと何もしなければそのまま動いていく。ずっと同じVelocityのまま。弾丸でもそんな感じの動きになることもある。でもこのキャラクターの場合は重力がある設定だから、ジャンプの上昇中、頂点、下降中と徐々にベロシティが変わっていくので、それを条件分岐で調べてる」
妹「でもなんで条件が0以下じゃなくて5以下なの?」
「そこは操作感の問題で、ジャンプが頂点に達するより先に減速させた方がいいかなと思ってそうしている。もう少し数字いじってもいいかも」
妹「たしかに今までのよりは思ってた水中に近い感じになってる」
「問題としてはジャンプボタンで泳いでる時は、Falling状態になってるということ。だからIsSwimmingで調べると上手くいかないことがある。水中かどうかは別の方法で調べないといけない。今回Swimmingに戻す時に使ったGetPhysicsVolumeとWaterVolumeフラグで調べるのがいいと思うけど」
妹「泳ぐ時の勢いは調整するとして、飛び出す時に水の抵抗がなさすぎるような感じがする。そのままのスピードでスポッっと出ちゃうから。泳ぎはそのままで、水から出た場合だけ大きく飛び出るようにしたいような」