2Dマップを作りたい!!query.body_y_rotationで禿げ散らかした備忘録【マインクラフト】

スポンサーリンク

ようこそぷっこ村へ、ししゃもです。

(・∀・)ノ

個人製作で横スクロールマップぽい感じのパートを入れたいなと思い、カメラコマンドで色々していた時に激ハマりしたquery.body_y_rotationの備忘録です。

query.body_y_rotationとはなんぞや

query.body_y_rotationはプレイヤーのヨー回転を返してくれるクエリです。要は横向きの方向に今何度か?みたいな値が返って来ます。これをよくわからんまま使ってまして、激ハマりしました。

返ってくる値なのですが ‐180~180 となっているようです。(自分調べ)この範囲を超える場合は、360を足すなり引くなりして範囲内に収まるような挙動を示します。

正負の方向なのですが、tpで ~~~ 0 0 した場合の方向(北向き)が0、右回りで正、左回りで負の値に各180までと思われます。

例えばプレイヤーが回転して、‐200になるような値になった場合は160になる模様です。たぶん。

何がしたかったのか?横スクロールマップ作りたかったんだよ!

で、何がしたかったかというとなんですが、マリオみたいな横スクロールマップにする時って、プレイヤーが回転しちゃうとわけ分からなくなるんですよね。縦スクロールとか俯瞰なら、まぁ回転しちゃってもラジコン操作でできるんですけど(おっさんゲーマー並感)、横スクロールはイカン!

というわけで、マウスでの回転は無効にして、強制的に一定方向を向かせた状態での運用としたいと思いました。ここで問題となるのが、体の回転について。WASDの移動と合わせたい場合、必然的にプレイヤーは奥を向かせる必要が出てきます。そうなると移動は直感的なんだけど、プレイヤーが常に画面にケツを向けるという、先輩諸兄垂涎の状態になります。

これはあまり好ましくないよね。掘られそうだし……。できれば右に移動するなら右向いてほしいし、手前に移動する時はこっち向いて欲しいやん?これ見てるあなたがどう思うかは知らんけど。

で、このようにquery.body_y_rotationを利用して改良を施しました。ご覧の通り、移動する方向に向きが変わるようになりました。

実際のコード部分

実際にどのような方法を使ったかというのがこちら。

"root": {
  "rotation": [0, "((query.body_y_rotation <= 56) && (query.body_y_rotation >= -56)) ? query.body_y_rotation * 1.3 : query.body_y_rotation * 2", 0]
}

どこかしら任意のアニメーションに加えましょう。プレイヤーのY方向の回転をq.body_y_rotationで判定し、微妙な差を見つけて見合った角度を足しています。

3人称視点のプレイヤーは左右に移動する時に、約53°(自分調べ)体の向きを回転させます。止まると49°(自分調べ)になります。後退する際は56.5°くらい(自分調べ)になります。この微妙な差を利用することで、より大きく体を振らせるわけです。

具体的には、まず現在の向きが‐56°~56°の範囲内かどうかを三項演算を使って判定します。範囲内なら、現在の向きに、さらに現在の向きを1.3倍した値を足すことで、何か程よい横向きになります。(ものによりますが、アニメーションの値は合算されますので注意!)

例、今の向きが30°の時 30 + 30 × 1.3 =69

範囲外の場合は後退時しかないので、もう2倍した値足したらええやん?56.5×3で170°弱位やん?(適当過ぎ)

"head": {
  "rotation": [0, "((query.body_y_rotation <= 55) && (query.body_y_rotation >= -55)) ? query.body_y_rotation * 2 : query.body_y_rotation * 3", 0]
},

ちなみに、頭はこんな感じです。これもないと首がグリってなるよ!こっちは55°の範囲になってますが53°以上ならおけです。参考までに。

まとめ

この方法に辿り着くのに妙に時間が掛かってしまったうえに、いまいちまだ理解しきれてないので、整理のために軽くまとめました。大事なのは北向きの時は0が返り、時計回りに180まで、反時計回りに‐180までってところ。ずっと360°対応なんやと勘違いしてたせいで地獄のハマりっぷりでした。(ヨー回転ってリファレンスに書いてあるやん?)

けどさぁ、正直Molangのリファレンス不親切すぎん?頻繁に名前変わるし、消えたりするし、無駄になる可能性があるのも、しんどいのも分かるねんけど、せめて取りうる値の範囲くらい書いといてくれたらええやん?なんやねん、ヨー回転を返しますって!どっちが正かも分らんわ!

というわけで、愚痴も備忘録も書き散らかしたので私は満足です。どうかこの記事を読んだあなたもシステム担当で禿げますように!それではこの辺で、お帰りの際はお気をつけて~(・∀・)ノシ

コメント