取り組んでいること
私は、現在FPSのゲームを作っています
わからないこと
➀
Vector3 velocity; velocity = Vector3.zero; velocity = (FPScamera.transform.forward * Input.GetAxis("Vertical") + FPScamera.transform.right * Input.GetAxis("Horizontal")).normalized; float speed; if (Input.GetButton("Run")) { speed = runSpeed; } else { speed = walkSpeed; } velocity *= speed; characterController.Move(velocity * Time.fixedDeltaTime);
➁
float moveH = Input.GetAxis("Horizontal"); float moveV = Input.GetAxis("Vertical"); Vector3 velocity = new Vector3(moveH, 0f, moveV); if(velocity.sqrMagnitude > 1) { velocity.Normalize(); } Vector3 desiredMove = FPScamera.transform.forward * moveV + FPScamera.transform.right * moveH; moveDir.x = desiredMove.x * 5f; moveDir.z = desiredMove.z * 5f; if (Input.GetKey(KeyCode.LeftShift)) { characterController.Move(moveDir * Time.deltaTime * runSpeed); } else { characterController.Move(moveDir * Time.deltaTime * walkSpeed); }
➀と➁のようなスクリプトを書いて実行した結果、下の画像のような結果になりました。
スクリプト➀を実行すると、斜め上(画像では➀)の移動となってしまいました。こうなってしまった原因としては、transform.forwardやrightとしているためローカル座標での移動となってしまったことが原因ではないかと考えました。そこで、プレイヤーの動きを改良する|CodeGeniusを参考にスクリプト➁を書くと画像上の➁のような自分がやりたかった動きを実現することができました。しかし、コード自体は➀と➁どちらも似ているような感じがするのですが、なぜスクリプト➁はローカルではなくグローバル座標系で移動することができたのでしょうか?私の考察では、moveDirのxとzにdesireMoveのxとzで行われている代入の操作がローカルからグローバルに変換しているのではないかと考えたのですが、どうもしっくりきません。どなたか、ご教授お願いします。
こちらの環境で①のスクリプトを動かしてみましたが、正しくカメラの向いた方向に移動するようになっていました。
プレイイン中にカメラをぐりぐりいろんな方向を向かせてみましたがそれぞれ正しく移動を行っていました
ご提示されている①のコードで現象が再現するかもう一度確認お願いします。
「斜め上」とはY軸方向の上下でしょうか?
もしそうなら①だとカメラの向きによりY値が入る可能性があるのでY軸方向の上に行き、②だと恐らくY値が0のままなので水平移動のみなのかなと思いました。(試した訳ではないのでMMashiroさんと検証結果と矛盾してて謎ではありますが)
そうですね、斜め上はY軸方向の上下です。hanaさんのおっしゃるとおり、➀だとカメラを水平にしていればy = 0で進むのですが、少しでもマウスを上にしてしまうと徐々にy軸の値が増え空中を浮くような形になってしまいました。自分の情報不足でわかりずらい質問となってしまい、お二人とも申し訳ございませんでした。
回答1件
あなたの回答
tips
プレビュー