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}
質問者さんのスクリプト、変数 currentEA が定義されていないので動かないですね。動いている版のものを貼り付けてください。
すいません、preEAの間違いですね。直しておきます。
回答3件
あなたの回答
tips
プレビュー