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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

983閲覧

【Unity】カメラに視野角制限を設けると挙動がおかしくなる

Y0241-N

総合スコア1066

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2019/09/03 03:05

###現状と要望

画面をDragをした際にDragの移動量でカメラを動かすスクリプトでカメラを制御しています。
(uGUIのPanelにImageをアタッチし、画像を透過して入力を検知しています)

縦方向に制限を設けるべくMathf.Clampで回転に対する入力値に制限を設け、一定以上の角度には
カメラが向かないようにしたのですが、こうするとカメラが制限値に達した後、下方向にドラッグすると、
一瞬で下の制限値にカメラが向いてしまいます。

なぜこうなってしまうのかを探ってみたのですが、結局自力では解明できなかったので、
カメラが制限値の方に向いてしまう理由と回避策が知りたいです。
イメージ説明

カメラの制御スクリプト

cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.EventSystems; 5using UnityEngine.UI; 6public class CamContorl : MonoBehaviour, IBeginDragHandler, IDragHandler, IEndDragHandler, IPointerDownHandler, IPointerUpHandler 7{ 8 public GameObject MainCamera; 9 public GameObject TargetObject; 10 11 private Vector3 lastMousePosition; 12 private Vector2 lastTouchPosition; 13 private Vector3 newAngle = new Vector3(0, 0, 0); 14 15 int touchID = -10; 16 bool a = true; 17 public void Start() 18 {} 19 20 public void OnBeginDrag(PointerEventData eventData) 21 { 22 if(touchID == -10) 23 { 24 touchID = eventData.pointerId; 25 } 26 } 27 28 public void OnEndDrag(PointerEventData eventData) 29 { 30 if(touchID == eventData.pointerId) 31 { 32 touchID = -10; 33 } 34 } 35 36 public void OnPointerDown(PointerEventData eventData) 37 { 38 newAngle = MainCamera.transform.localEulerAngles; 39 lastMousePosition = Input.mousePosition; 40 } 41 42 public void OnPointerUp(PointerEventData eventData) 43 { 44 lastMousePosition = Input.mousePosition; 45 } 46 47 public void OnDrag(PointerEventData eventData) 48 { 49 if(lastMousePosition.y >= Screen.height * 0.28f || lastMousePosition.x >= Screen.width * 0.25f) 50 { 51 newAngle.y += (Input.mousePosition.x - lastMousePosition.x) * 0.015f; 52 newAngle.x -= (Input.mousePosition.y - lastMousePosition.y) * 0.015f; 53 54 55 //newAngle.x = Mathf.Clamp(newAngle.x, -90, 90); 56 if(newAngle.x > 90) 57 { 58 if(Input.mousePosition.y != 0 || Input.GetMouseButton(0)) 59 { 60 newAngle.x = 90; 61 MainCamera.transform.localEulerAngles = newAngle; 62 Debug.Log("!"); 63 } 64 }else if(newAngle.x < -90) 65 { 66 if(Input.mousePosition.y != 0 || Input.GetMouseButton(0)) 67 { 68 newAngle.x = -90; 69 MainCamera.transform.localEulerAngles = newAngle; 70 Debug.Log("?"); 71 } 72 }else 73 { 74 MainCamera.transform.localEulerAngles = newAngle; 75 Debug.Log("-"); 76 } 77 } 78 } 79}

試したこと

原因を調べるためにMathf.Clampと同じ処理をifで書き、合間にDebug.Logを仕込んで
カメラが下を向くタイミングでどの処理が発生しているかを調べました。
結果としては、一度カメラが-90、90を超えた後、-89~89の時に操作すると
中間の処理(-)を飛ばして下限の処理(!)が発生している、という事しかわかりませんでした...

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

Unity2019.1.4f1

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

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

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

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

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

guest

回答1

0

自己解決

自己解決いたしました。

追加調査で計算式と内部数値がどうなっているかを追っていったところ、
newAngle.x -= (Input.mousePosition.y - lastMousePosition.y) * 0.015f;の部分は
newAngle.x = newAngle.x - (Input.mousePosition.y - lastMousePosition.y) * 0.015f;ということなのでnewAngle.x自体に制限をかけてしまうと、newAngleは実質的には=カメラの角度なので、

入力値とカメラの角度、二つに制限が掛かっている状態なのではないか?と思い、
入力値を別の変数で受け取り、それに対して制限をかけ、newAngleに受け渡す。

という手法をとったところ、解決しました。

修正した部分

cs

1 Vector3 not; //受け取り用の変数 2 3 not.x -= (Input.mousePosition.y - lastMousePosition.y) * 0.015f; 4 5 not.x = Mathf.Clamp(not.x, -90, 90); 6 7 newAngle.x = not.x; 8 MainCamera.transform.localEulerAngles = newAngle; 9

投稿2019/09/03 05:20

Y0241-N

総合スコア1066

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問