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

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

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

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

Unity

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

Q&A

解決済

1回答

7072閲覧

unityにおける一人称視点のカメラの角度制限について

yaira

総合スコア8

C#

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

Unity

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

0グッド

0クリップ

投稿2018/02/19 01:07

前提・実現したいこと

私はunityとC#を使い一人称視点のゲームを作っています。
そこでカメラの角度制限をつけようとしたところ以下の二つの問題が発生しています。

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

1.上方向のカメラの角度を90度で制限したいが90度を超えて駆動してしまう
2.下方向にカメラを動かすと指定した40度で止まるがそれ以上動かそうとするとカメラのY軸が回転してしまう

該当のソースコード

C#

1//プログラム上から関係のあるところのみ抜粋 2  public Transform verRot; 3 public Transform horRot; 4 5 // Use this for initialization 6 void Start () { 7 verRot = transform.parent; 8 horRot = GetComponent<Transform>(); 9 } 10 11 // Update is called once per frame 12 void Update() { 13 float X_Rotation = Input.GetAxis("Mouse X"); 14 float Y_Rotation = Input.GetAxis("Mouse Y"); 15 float mouseLogY = 0; 16 verRot.transform.Rotate(0, -X_Rotation, 0); 17 if (horRot.rotation.eulerAngles.x < 40 || horRot.rotation.eulerAngles.x > -90) 18 { 19 horRot.transform.Rotate(-Y_Rotation, 0, 0); 20 mouseLogY = Y_Rotation; 21 } 22 else if (horRot.rotation.eulerAngles.x > 0) 23 { 24 if (Y_Rotation < mouseLogY) 25 { 26 horRot.transform.Rotate(-Y_Rotation, 0, 0); 27 } 28 29 } 30 else if (horRot.rotation.eulerAngles.x < 0) 31 { 32 if (Y_Rotation > mouseLogY) 33 { 34 horRot.transform.Rotate(-Y_Rotation, 0, 0); 35 } 36 } 37 if (horRot.rotation.eulerAngles.x > 40 && horRot.rotation.eulerAngles.x < 180 || horRot.rotation.eulerAngles.x < -90) 38 { 39 if(horRot.rotation.eulerAngles.x > 0) 40 { 41 horRot.transform.eulerAngles = new Vector3(40, 0, 0); 42 } 43 else if(horRot.rotation.eulerAngles.x < 0) 44 { 45 horRot.transform.eulerAngles = new Vector3(-90, 0, 0); 46 } 47 } 48 49 } 50

補足情報

Unity 2017.3.1f1 (64-bit)を使いC#はvisual studioを使用
また、上記のプログラムはウェブサイトを参照しています。

どうかご教授いただけると幸いです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

上90°で止まらなかったのは条件が適切でなかったため、下40°でY軸回転が発生したのはhorRot.transform.eulerAngles = new Vector3(40, 0, 0);の部分でeulerAnglesによるワールド空間基準での回転設定を行ったためではないかと思います。

下記のようにコードを改変してみましたが、いかがでしょうか。
なお、上下方向の回転にはRotateに代わってlocalEulerAnglesへの角度代入を使うことにしました。というのも、オイラー角を監視して上下方向回転角を補正する方法だと、上90°に到達したときに左右方向回転角が不定になり、おかしな挙動をする可能性があったためです(一旦90°まで見上げると視点を下へ戻せなくなるなど)。

C#

1 public Transform verRot; 2 public Transform horRot; 3 4 private float horAngle; // 現在の上下回転角を保持するフィールドを追加 5 6 // Use this for initialization 7 void Start() 8 { 9 verRot = transform.parent; 10 horRot = GetComponent<Transform>(); 11 horAngle = horRot.localEulerAngles.x; // 上下方向初期回転角を取得 12 // localEulerAnglesからの値の取得は最初の一回だけとし、Update内で毎回取得するのは避けた方がいいでしょう 13 // やってみるとお分かりかと思いますが、意図しない値にころころ変わってしまっている場合があります 14 } 15 16 // Update is called once per frame 17 void Update() 18 { 19 float X_Rotation = Input.GetAxis("Mouse X"); 20 float Y_Rotation = Input.GetAxis("Mouse Y"); 21 // float mouseLogY = 0; // この変数は特に使う必要がないように思えたため削除しました 22 23 verRot.transform.Rotate(0, -X_Rotation, 0); 24 25 // 以下のコメントアウト部分は意図が不明だったため削除しました 26 /* 27 if (horRot.rotation.eulerAngles.x < 40 || horRot.rotation.eulerAngles.x > -90) // 「40未満または-90超」ということは、この条件は常にtrueになる? 28 { 29 horRot.transform.Rotate(-Y_Rotation, 0, 0); 30 mouseLogY = Y_Rotation; // ここで代入されたmouseLogYは以降のコードで(引き続くelse節でも)使われていない 31 } 32 else if (horRot.rotation.eulerAngles.x > 0) 33 { 34 if (Y_Rotation < mouseLogY) // mouseLogYは常に0 35 { 36 horRot.transform.Rotate(-Y_Rotation, 0, 0); 37 } 38 39 } 40 else if (horRot.rotation.eulerAngles.x < 0) 41 { 42 if (Y_Rotation > mouseLogY) // mouseLogYは常に0 43 { 44 horRot.transform.Rotate(-Y_Rotation, 0, 0); 45 } 46 } 47 */ 48 49 // 回転角制限方法を変えたため以下の部分は削除しました 50 /* 51 if (horRot.rotation.eulerAngles.x > 40 && horRot.rotation.eulerAngles.x < 180 || horRot.rotation.eulerAngles.x < -90) 52 { 53 if (horRot.rotation.eulerAngles.x > 0) 54 { 55 horRot.transform.eulerAngles = new Vector3(40, 0, 0); 56 } 57 else if (horRot.rotation.eulerAngles.x < 0) 58 { 59 horRot.transform.eulerAngles = new Vector3(-90, 0, 0); 60 } 61 } 62 */ 63 64 horAngle = Mathf.Clamp(horAngle - Y_Rotation, -90, 40); // horAngleを増減、さらに-90~40にクランプ 65 horRot.localEulerAngles = new Vector3(horAngle, 0, 0); // ワールド回転ではなく、ローカル回転をhorAngleに設定する 66 67 if (Y_Rotation != 0) 68 { 69 // localEulerAngles.xをコンソールに表示してみるとお分かりかと思いますが 70 // オイラー角は(ほぼ)0~360になるよう整形されて返ってきます 71 // ですので、真上を見上げたときは-90でなく270になるはずです 72 Debug.Log(horRot.localEulerAngles.x); 73 } 74 }

投稿2018/02/19 21:55

Bongo

総合スコア10807

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

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

yaira

2018/02/19 22:39

わざわざコードの全文を改変していただき、その上で説明のコメントまでつけていただきありがとうございます。このコードを実行したところ正常に作動しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問