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

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

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

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

Unity

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

Q&A

解決済

1回答

1186閲覧

マウスでの視点移動でカメラがブレる

退会済みユーザー

退会済みユーザー

総合スコア0

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/03/29 12:50

Unity3Dで分からないことがあります
https://unity-shoshinsha.biz/archives/574
こちらのサイトと
https://tech.pjin.jp/blog/2016/11/04/unity_skill_5/
こちらのサイトを参考にカメラとプレイヤーの動きをスクリプトで作っているのですが
とある条件のもとでカメラがブレます

どんな条件かと言うと「メインカメラの親オブジェクトのTransform.Rotaion.xの値が90°或いは-90°になるとブレる」ということです
Transform.Rotation.yは正常に動きます
文字で書いてもよく分からないと思うのでTwitterに動画をあげてあるのでそちらでご確認ください
https://twitter.com/0191otukiApp/status/1111610522493816833


コードを載せます
上記に挙げたサイトを自分なりに改変してみたものです

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class CameraController : MonoBehaviour 6{ 7 8 //MainCameraが回転するスピード 9 [SerializeField] 10 float rotate_speed = 3; 11 12 //CameraControllerの座標を指定する変数 13 //CameraControllerはMain Cameraの親オブジェクト 14 [SerializeField] 15 Vector3 CameraControllerPos; 16 17 GameObject Player; 18 GameObject MainCamera; 19 20 // Start is called before the first frame update 21 void Start() 22 { 23 Player = GameObject.Find("Player"); 24 MainCamera = GameObject.Find("Main Camera"); 25 26 //Cameraの初期位置を設定 27 MainCamera.transform.position = new Vector3(0, 0, -3); 28 //CameraとCameraControllerの角度を最初だけそろえる 29 MainCamera.transform.localRotation = transform.rotation; 30 } 31 32 // Update is called once per frame 33 void LateUpdate() 34 { 35 //CameraControllerの位置をPlayerの位置+CameraControllerPosで決める 36 transform.position = Player.transform.position + CameraControllerPos; 37 38 //Cameraの角度にマウスから取った角度を入れる 39 transform.eulerAngles += new Vector3(Input.GetAxis("Mouse Y") * rotate_speed * -1, Input.GetAxis("Mouse X") * rotate_speed, 0); 40 } 41}

一応プレイヤー側のコードも載せておきます

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class PlayerController : MonoBehaviour { 6 7 float InputHorizontal; 8 float InputVertical; 9 10 float MoveSpeed = 3.0f; 11 12 //Animatorを入れる 13 Animator PlayerAnimator; 14 15 //Rigidbodyを入れる 16 Rigidbody PlayerRigit; 17 18 //Capsule Colliderを入れる 19 CapsuleCollider PlayerCollider; 20 21 // Start is called before the first frame update 22 void Start() 23 { 24 PlayerAnimator = GetComponent<Animator>(); 25 PlayerRigit = GetComponent<Rigidbody>(); 26 PlayerCollider = GetComponent<CapsuleCollider>(); 27 } 28 29 // Update is called once per frame 30 void Update() 31 { 32 33 InputHorizontal = Input.GetAxisRaw("Horizontal"); 34 InputVertical = Input.GetAxisRaw("Vertical"); 35 36 if (Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.S) || Input.GetKeyDown(KeyCode.D)) 37 { 38 PlayerAnimator.SetTrigger("Run"); 39 } 40 else if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.A) || Input.GetKeyUp(KeyCode.S) || Input.GetKeyUp(KeyCode.D)) 41 { 42 PlayerAnimator.SetTrigger("Idle"); 43 } 44 } 45 46 void FixedUpdate() 47 { 48 // カメラの方向から、X-Z平面の単位ベクトルを取得 49 Vector3 cameraForward = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized; 50 51 // 方向キーの入力値とカメラの向きから、移動方向を決定 52 Vector3 moveForward = cameraForward * InputVertical + Camera.main.transform.right * InputHorizontal; 53 54 // 移動方向にスピードを掛ける。ジャンプや落下がある場合は、別途Y軸方向の速度ベクトルを足す。 55 PlayerRigit.velocity = moveForward * MoveSpeed + new Vector3(0, PlayerRigit.velocity.y, 0); 56 57 // キャラクターの向きを進行方向に 58 if (moveForward != Vector3.zero) 59 { 60 transform.rotation = Quaternion.LookRotation(moveForward); 61 } 62 } 63}

どなたか教えて下さいお願いします

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

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

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

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

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

guest

回答1

0

ベストアンサー


(オブジェクトのy, zの回転がインスペクタ上で0である場合の図)

図のように、UnityのeulerAnglesの値は特殊な変化をしています。
インスペクタ上の値とは、ある範囲では同じになり、それ以外では違う値になり、なんとも分かりにくい動き方です。


加算(減算)し続けると最終的に90°(または-90°)の箇所にハマります。
これが振動の原因です。


解決するにあたって、この方の記事が参考になるかと思います。
transform.eulerAnglesは参照せず代入のみ」という扱い方です。

投稿2019/03/29 14:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2019/03/30 08:29

この場合どのようなコードにすればいいんでしょうか?
退会済みユーザー

退会済みユーザー

2019/03/30 08:47

なるほど osaru2002729が言わんとしていらっしゃることは理解できました
退会済みユーザー

退会済みユーザー

2019/03/30 08:49

transform.eulerAngles += new Vector3(Mathf.Clamp(Input.GetAxis("Mouse Y") * rotate_speed * -1, 0, 90), Input.GetAxis("Mouse X") * rotate_speed, 0); このようなコードにしてみたのですがうまく行きません
退会済みユーザー

退会済みユーザー

2019/03/30 12:54

もう一度書きますが、「eulerAnglesは代入のみ」です。 +=の処理を省略せず書くとよく分かるかと思いますが、一度参照が入っています。 Vector3の中身は質問にあるコードの状態で正解でしたので、eulerAnglesの扱いを先述の記事の通り、適宜自身の環境に置き換えてあげれば正常に動きます。
退会済みユーザー

退会済みユーザー

2019/03/31 09:03

うまく動きました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問