質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

1667閲覧

UnityでFPSゲームのカメラの移動が上手くできません

ytDu9QHRgvzgNlB

総合スコア15

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2020/03/07 12:16

取り組んでいること

私は、現在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で行われている代入の操作がローカルからグローバルに変換しているのではないかと考えたのですが、どうもしっくりきません。どなたか、ご教授お願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MMashiro

2020/03/09 13:54

こちらの環境で①のスクリプトを動かしてみましたが、正しくカメラの向いた方向に移動するようになっていました。 プレイイン中にカメラをぐりぐりいろんな方向を向かせてみましたがそれぞれ正しく移動を行っていました ご提示されている①のコードで現象が再現するかもう一度確認お願いします。
sakura_hana

2020/03/11 06:28

「斜め上」とはY軸方向の上下でしょうか? もしそうなら①だとカメラの向きによりY値が入る可能性があるのでY軸方向の上に行き、②だと恐らくY値が0のままなので水平移動のみなのかなと思いました。(試した訳ではないのでMMashiroさんと検証結果と矛盾してて謎ではありますが)
ytDu9QHRgvzgNlB

2020/03/11 09:45

そうですね、斜め上はY軸方向の上下です。hanaさんのおっしゃるとおり、➀だとカメラを水平にしていればy = 0で進むのですが、少しでもマウスを上にしてしまうと徐々にy軸の値が増え空中を浮くような形になってしまいました。自分の情報不足でわかりずらい質問となってしまい、お二人とも申し訳ございませんでした。
guest

回答1

0

自己解決

moveDirをVector3(0,0,0)で初期化していてキーの情報はxとzに代入していてy軸には代入がされていないのでyの値は常に0となっているためy軸が増えるという事はなかった。しかし、➀の方はカメラの前方方向にキー情報を掛けているだけなのでカメラが少しでも上を向けば、その方向に行ってしまうため今回のような結果になりました。

投稿2020/03/11 09:50

ytDu9QHRgvzgNlB

総合スコア15

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問