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

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

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

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

2回答

784閲覧

Unity,C# 視点操作がうまくいきません

yukineko184

総合スコア16

C#

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

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2018/11/29 03:27

編集2018/11/30 03:51

前提・実現したいこと

FPSのような、マウスで視点を操作するプログラムを作ろうとしています。

発生している問題・エラーメッセージ

視点を移動するためにマウスを動かすと、マウスを動かした方向(X軸の+の方向に動かしたらプレイヤーのX軸の+の方向)にプレイヤーのX軸またはZ軸の値がものすごい勢いで加算され続けてしまい制御不能になってしまいます。

該当のソースコード

C#

1public class Playercontroller : MonoBehaviour { 2 3 private CharacterController chara; 4 private Vector3 vec3; 5 public float speed; 6 private Transform camera; 7 [SerializeField] 8 private float cameraRotatelimit = 30f; 9 [SerializeField] 10 private bool cameraRotForward = true; 11 private Quaternion initCameraRot; 12 [SerializeField] 13 private float rotateSpeed = 2f; 14 private float xRotate; 15 private float yRotate; 16 [SerializeField] 17 private float mouseSpeed = 2f; 18 private Quaternion charaRotate; 19 private Quaternion cameraRotate; 20 21 void Start() 22 { 23 chara = GetComponent<CharacterController>(); 24 camera = GetComponentInChildren<Camera>().transform; 25 initCameraRot = camera.localRotation; 26 charaRotate = transform.localRotation; 27 cameraRotate = camera.localRotation; 28 } 29 30 void Update() 31 { 32 RotateCamera(); 33 34 RotateChara(); 35 36 if (chara.isGrounded) 37 { 38 vec3 = Vector3.zero; 39 vec3.x = Input.GetAxis("Horizontal"); 40 vec3.y = 0; 41 vec3.z = Input.GetAxis("Vertical"); 42 } 43 44 if (Input.GetKeyDown(KeyCode.LeftShift)) 45 { 46 speed = speed + 10; 47 } 48 49 if (Input.GetKeyUp(KeyCode.LeftShift)) 50 { 51 speed = speed - 10; 52 } 53 54 vec3.y += Physics.gravity.y * Time.deltaTime; 55 chara.Move(vec3 * speed * Time.deltaTime); 56 } 57 void RotateChara() 58 { 59 float yRotate = Input.GetAxis("Mouse X") * mouseSpeed; 60 61 charaRotate *= Quaternion.Euler(0f, yRotate, 0f); 62 63 transform.localRotation = Quaternion.Slerp(transform.localRotation, charaRotate, rotateSpeed * Time.deltaTime); 64 } 65 66 void RotateCamera() 67 { 68 69 float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed; 70 71 if (cameraRotForward) 72 { 73 xRotate *= -1; 74 } 75 76 cameraRotate *= Quaternion.Euler(xRotate, 0f, 0f); 77 var resultYRot = Mathf.Clamp(Mathf.DeltaAngle(initCameraRot.eulerAngles.x, cameraRotate.eulerAngles.x), -cameraRotatelimit, cameraRotatelimit); 78 cameraRotate = Quaternion.Euler(resultYRot, cameraRotate.eulerAngles.y, cameraRotate.eulerAngles.z); 79 camera.localRotation = Quaternion.Slerp(camera.localRotation, cameraRotate, rotateSpeed * Time.deltaTime); 80 } 81 }

試したこと

charaRotate *= Quaternion.Euler(0f, yRotate, 0f);

charaRotateをcameraRotateに変えてみたりしましたが、そうするとY軸の値が変動してしまい視界が斜めになってしまいます。

補足情報(FW/ツールのバージョンなど)

親子関係は chara(Player)の子としてCameraがあるだけで他のオブジェクトは全部Playerと同じ階層にあります。

Unity 2018.2.5f1 Personal(64bit)
Visual Stadio

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

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

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

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

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

izmktr

2018/11/29 17:49

ソースは```で囲んでください、少なくとも投稿したあと、正しく表示されてないなら修正してください あと、説明を読んでも何が起こっているのかまったくわかりません 吹き飛ぶとは、Inspector上のpositionの値が変わるのでしょうか?
yukineko184

2018/11/29 23:19

すみません、質問初めてで色々勝手が分からず...。吹き飛ぶというのは、もしマウスを動かしたのがx軸の+方向だったらプレイヤー自身のx軸もその方向に加算されていってしまうという事です。
sakura_hana

2018/11/30 01:17

カメラとプレイヤー、各オブジェクトの親子関係はどうなっていますか? また、「chara.Move(vec3 * speed * Time.deltaTime);」この行をコメントアウトして動かすとどうなりますか?
izmktr

2018/11/30 01:26 編集

質問とは関係ないですが、eulerAngles の使い方が間違っています 3つセットでないと意味がなく、どこか1つの値を取り出して使うのは間違っています
yukineko184

2018/11/30 03:55 編集

カメラとプレイヤーの親子関係はプレイヤーが親でカメラが子になってます。他のオブジェクトは全部プレイヤーと同じ階層にあります。指定された行をコメントアウトしたところ今度は何もしなくてもY軸の+の方向に加算され続けてしまうようになりました。
yukineko184

2018/11/30 03:46

eulerAnglesの公式の説明見てませんでした・・・。指摘ありがとうございます。
MMashiro

2018/12/11 08:33

現在提示されているスクリプトをアタッチして実際に触ってみましたが、特に制御不能な動きにはなりませんでした(滑らかにカメラが動いて制御しやすいとは言えませんが)制御不能とはいったいどれほどの物でしょうか
yukineko184

2018/12/15 03:02

返答遅れてすみません。制御不能というのは、視点移動をしようとほんの少しでもマウスを動かすと動かした時点で問題が発生してしまいします。
guest

回答2

0

「前提・実現したいこと」を考慮して話します。
私はUnityの知識は非常に浅いですがdirectXでの経験がありますので、参考がてらに聞いてもらえると幸いです。

まず、カメラマトリックスの上と右のベクトルを取得します。
この時、上と右のベクトルは正規化しておく必要があります。

そのからマウスの移動距離を算出。
画面サイズによってマウスの移動量がxとyで違うのに注意してください。

上のベクトルを軸にx量分、任意軸回転。
右のベクトルを軸にy量分、任意軸回転。
カメラのマトリックスに戻します。

ただFPSの場合、プレイヤーの顔を回転させているパターンが一般的ですので、何がしたいのかは自分で決めて下さい。

投稿2018/12/12 07:03

stdio

総合スコア3307

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

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

0

ベストアンサー

メンバー変数にfloat rotationH;とfloat rotationV;をおいて
rotationHとrotationVをInputでいい感じに調整したあと
camera.localRotation=Quarternion.Euler(0,rotationH,0)*Quarternion.Euler(rotationV,0,0);
みたいな感じで出来ます
うまく行かなかったらQuarternionの掛ける順番を逆にしてみて下さい

投稿2018/12/18 04:06

bochan2

総合スコア2050

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

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

yukineko184

2018/12/18 12:42

何とか動くようになりました!ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問