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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Q&A

解決済

1回答

2842閲覧

Unityで、rotationがうまく動かない

TSE

総合スコア28

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

0グッド

0クリップ

投稿2021/11/26 14:14

前提・実現したいこと

Unity2020.3.23f1で、
FPSゲームのような、基本的なプレイヤーの動きをスクリプトで設定しようとしたところ、rotationがうまく動きません。
具体的には、インスペクター上でのパラメータが変わっているのは確認できましたが、ゲーム画面のみ、上下にしか回転しません。
Playerオブジェクトを"カプセル"で作り、その子としてカメラを入れています。
このPlayerオブジェクトにこのスクリプトをアタッチしています。

このPlayerオブジェクト自体は、Sceneビュー上では回転していることが確認できます。
しかし、カメラは回転していることが確認できません。しかしながら、インスペクター上でTransformを見た限りでは、値は変わっています。
上下方向には回転しています。これはゲーム画面でも確認できます。

写真は、実行中の状態のものです。赤枠は、カメラのオブジェクトMainCameraを選択した際のインスペクター。
外側(背景)の画像は、Playerオブジェクトを選択した状態のインスペクター及びその他もろもろ。
イメージ説明

また、cameraObj変数に、インスペクター上からカメラを設定しています。

なお、position(移動)は思い通り動いています。

解決したいことはもちろん、Playerオブジェクトと連動してカメラの回転のY軸も動くようにしたいということです。
動かない原因は何なのでしょうか?

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

実行してもエラーメッセージは出ません。

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Player : MonoBehaviour 6{ 7 public float sensitivity = 60f, fov = 80f; 8 9 public float speed = 5f; 10 11 private float moveX, moveZ; 12 private Vector3 moveVector; 13 14 private float mouseXDelta, mouseYDelta, mouseY; 15 16 private Rigidbody rigidbody; 17 public GameObject cameraObj; 18 private Camera camera; 19 20 21 private void Start() 22 { 23 rigidbody = gameObject.GetComponent<Rigidbody>(); 24 camera = cameraObj.GetComponent<Camera>(); 25 camera.fieldOfView = fov; 26 } 27 28 void Update() 29 { 30 MovePlayer(); 31 RotatePlayer(); 32 } 33 34 void RotatePlayer() 35 { 36 mouseXDelta = Input.GetAxis("Mouse X"); 37 mouseYDelta = Input.GetAxis("Mouse Y"); 38 mouseXDelta *= Time.deltaTime * sensitivity * 10; 39 mouseYDelta *= Time.deltaTime * sensitivity * 10; 40 41 rigidbody.transform.rotation *= Quaternion.Euler(0, mouseXDelta, 0); 42 43 mouseY += mouseYDelta; 44 mouseY = Mathf.Clamp(mouseY, -90, 90); 45 cameraObj.transform.rotation = Quaternion.Euler(-mouseY, 0, 0); 46 } 47 48 void MovePlayer() 49 { 50 moveX = 0; 51 moveZ = 0; 52 if (Input.GetKey(KeyCode.W)) 53 { 54 moveZ = 1; 55 } 56 else if (Input.GetKey(KeyCode.S)) 57 { 58 moveZ = -1; 59 } 60 61 if (Input.GetKey(KeyCode.D)) 62 { 63 moveX = 1; 64 } 65 else if (Input.GetKey(KeyCode.A)) 66 { 67 moveX = -1; 68 } 69 moveVector = new Vector3(moveX, 0, moveZ); 70 moveVector.Normalize(); 71 72 rigidbody.transform.position += moveVector * speed * Time.deltaTime; 73 } 74} 75

###プログラムで実装したかったこと

W,A,S,DでのPlayerオブジェクトの移動、カメラ視点移動です。
視点移動は、水平回転はPlayerオブジェクトの回転(rigidbody経由)、上下の回転はカメラのTransformの回転です。

試したこと

Unityの再インストールのようなことはしました。すでに2019代のバージョンでやったときに同じことが起きており、インストールし直しも兼ねてバージョンを最新にした次第です。
また、
rigidbody.transform.rotation *= Quaternion.Euler(0, mouseXDelta, 0);
のところをgameObject.transform.rotation(以下略)に変えてもみましたが、結果は同じでした。

補足情報

回答に際して必要な情報がございましたら、返信でお伝え下さい。

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

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

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

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

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

guest

回答1

0

ベストアンサー

解決したいことはもちろん、Playerオブジェクトと連動してカメラの回転のY軸も動くようにしたいということです。
動かない原因は何なのでしょうか?

RotatePlayer()cameraObj.transform.rotation = Quaternion.Euler(-mouseY, 0, 0);を実行することで、カメラのY軸が0に固定されていることが原因です。

対策として、現在のcameraObj.transform.rotationに対してX軸の回転を加えるように変更しましょう。

C#

1 void RotatePlayer() 2 { 3 mouseXDelta = Input.GetAxis("Mouse X"); 4 mouseYDelta = Input.GetAxis("Mouse Y"); 5 mouseXDelta *= Time.deltaTime * sensitivity * 10; 6 mouseYDelta *= Time.deltaTime * sensitivity * 10; 7 8 rigidbody.transform.rotation *= Quaternion.Euler(0, mouseXDelta, 0); 9 cameraObj.transform.rotation *= Quaternion.Euler(-mouseYDelta, 0, 0); 10 }

投稿2021/11/27 04:29

ku__ra__ge

総合スコア4524

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

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

TSE

2021/11/27 12:07

なるほど!そこでしたか^w^; ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問