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

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

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

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

Unity

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

Q&A

解決済

3回答

2099閲覧

Unity-回転範囲制限付きのカメラが逆回転する

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2018/05/11 07:48

編集2018/05/12 03:25

Unity3Dについてです。
マウスのドラッグに応じてカメラが回転するスクリプトを書いたのですが、回転が設定した範囲制限に達すると、たまに逆回転し始めることがあります。

C#

1public class CameraController : MonoBehaviour { 2 3 [SerializeField] 4 private float RotSpeed; 5 6 private Vector3 last; 7 private Vector3 delta; 8 9 10 // Use this for initialization 11 void Start () { 12 13 } 14 15 // Update is called once per frame 16 void Update () { 17 18 19 if (Input.GetMouseButtonDown(0)) 20 { 21 last = Input.mousePosition; 22 }else if (Input.GetMouseButton(0)) 23 { 24 delta = Input.mousePosition - last; 25 26 var preEA = transform.localEulerAngles; 27 28 preEA += new Vector3(-delta.y * RotSpeed, delta.x * RotSpeed, 0); 29 30 if (preEA.x > 74.9f&&preEA.x<75.1f) 31 { 32 preEA.x = 75; 33 }else if (preEA.x<265.1f&&preEA.x>264.9f) 34 { 35 preEA.x = 265; 36 } 37 38 39 transform.localEulerAngles = preEA; 40 41 42 last = Input.mousePosition; 43 44 } 45 46 } 47} 48

イメージ説明

これは何が原因なのでしょうか?

また、回転の範囲制限についてなのですが、範囲制限に達するとカメラが細かく振動してしまうのを防ぐにはどうすればよいですか?
入力でカメラがわずかに制限を超える→制限に応じて引き戻される
の繰り返しが起きて振動しているのだとは思いますが、対策が思い浮かびません。

回答よろしくお願いします。

追記:
以下がうまくいったコードです。

C#

1public class CameraController : MonoBehaviour { 2 3 [SerializeField] 4 private float RotSpeed; 5 6 private Vector3 last; 7 private Vector3 delta; 8 9 10 // Use this for initialization 11 void Start () { 12 13 } 14 15 // Update is called once per frame 16 void Update () { 17 18 19 if (Input.GetMouseButtonDown(0)) 20 { 21 last = Input.mousePosition; 22 }else if (Input.GetMouseButton(0)) 23 { 24 delta = Input.mousePosition - last; 25 26 var preEA = transform.localEulerAngles; 27 28 preEA += new Vector3(-delta.y * RotSpeed, delta.x * RotSpeed, 0); 29 30 if (preEA.x > 75 && preEA.x < 285) 31 { 32 if (delta.y > 0) 33 { 34 preEA.x = 285; 35 } 36 else if(delta.y<0) 37 { 38 preEA.x = 75; 39 } 40 } 41 42 43 transform.localEulerAngles = preEA; 44 45 46 last = Input.mousePosition; 47 48 } 49 50 } 51}

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

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

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

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

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

negitama

2018/05/11 18:12

質問者さんのスクリプト、変数 currentEA が定義されていないので動かないですね。動いている版のものを貼り付けてください。
退会済みユーザー

退会済みユーザー

2018/05/12 02:27

すいません、preEAの間違いですね。直しておきます。
guest

回答3

0

細かく振動する件についてだけコメントします。

私も同じようなものを作ったことがありますが、「特定の高さ以上(以下)では入力を処理しない」、という考え方をとりました。
入力を受け取って処理をしてあとで、上下限を超えていたら範囲内に収める、という処理にすると、その動きが繰り返されて細かく振動してしまうためです。

参考コード(質問者さんのコードとは全く別の物です)

C#

1 //上下キーでカメラを上下に移動する 2 if ( Input.GetKey ( KeyCode.UpArrow ) ) 3 { 4 // 対象物との高さの差が上限を超えない範囲でのみ、入力を処理する 5 if ( transform.position.y < target.position.y + yOffsetMax ) 6 { 7 transform.Translate ( Vector3.up * verticalMoveSpeed * Time.deltaTime ); 8 } 9 } 10 else if ( Input.GetKey ( KeyCode.DownArrow ) ) 11 { 12 if ( transform.position.y > target.position.y - yOffsetMax ) 13 { 14 transform.Translate ( -Vector3.up * verticalMoveSpeed * Time.deltaTime ); 15 } 16 }

質問者さんの場合は角度で処理を行って、その角度に制限を付けようとしていると思いますが、同じような考え方を適用できるのではないでしょうか。

投稿2018/05/12 03:43

negitama

総合スコア943

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

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

0

ベストアンサー

■たまに逆回転する
74.9 〜 75.1 なら 75 にする
264.9 〜 265.1 なら 265 にする
となっていますが、入力値によっては「この条件分岐に当てはまらずに通過する」可能性があるかと思います。

1フレーム目:74.0 →条件には入らないのでそのまま
2フレーム目:74.8 →条件には入らないのでそのまま
3フレーム目:75.6 →条件には入らないのでそのまま
これは恐らく想定外の状況だと思うのですがいかがでしょうか?(大小逆かもしれませんが)

■範囲制限に達すると振動する
上記に影響されている可能性が高そうなのでまずはこちらを修正してみてください。

投稿2018/05/11 08:37

sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2018/05/12 03:30

指摘してくださったことを参考にあれこれ試してみたところ、追記したコードでうまく動いてくれました。 マウスドラッグの方向で場合分けする感じです。 回答ありがとうございました、勉強になりましたm(__)m
guest

0

Mathf.Clampを利用してはどうでしょうか?

投稿2018/05/11 08:06

YAmaGNZ

総合スコア10242

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

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

退会済みユーザー

退会済みユーザー

2018/05/12 03:32

Clampはすでに試したのですが、うまくいきませんでした。 制限したい範囲が0~75と285~360と地続きになっていないからだと思います。
YAmaGNZ

2018/05/12 04:07

すみません、コードをよく読んでいませんでした。 75~285の範囲と勘違いしていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問