質問: new Vector3(minangle, transform.localEulerAngles.y, 0); } //Mathf <====xが0になるとxが80に瞬間移動してしまう //Mathf.Clamp(transform.eulerAngles.x, minangle, maxangle); } ``` X角度制限はtransform.eulerAngles.xがmaxangle(80)を超えたらmaxangleまで戻す(minangleも同じ)という感じです mathfもやってみましたが直りませんでした
回答: 前の質問に回答したものです。 自分もオイラー角のZを0にすればいいだろう、と考えていましたが、そうではなかったみたいです(すみませんでした)。 オイラー角だと、ある向きを示す際に、複数の値で示せてしまうことがあるとのことです。 エディタ上で試してみたところ、(90°, 90°, 90°)と(90°, -90°, -90°)と(90°, 0°, 0°)は全て同じ向きになりました。 Unity上ではクォータニオンで計算するため、どれになるかは分かりません。 (90°, 90°, 90°)だったものが、突然(90°, -90°, -90°)になってもおかしくありません。 この状態でZ=0にすると、(90°, 90°, 0°)と(90°, -90°, 0°)は同じではないので、おかしい動作になってしまうみたいです。 そのため、スクリプト上でオイラー角を計算するという考えで、スクリプトを書いてみました。 それは以下の通りです。 (他に楽な方法があるかもしれませんし、これもまたバグがあるかもしれません) ``` // ...(中略) // 【追加】 Vector3 rotEuler; //追従 void Start() { updatePosition(); // 【追加】 rotEuler = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, 0f); } // ...(中略) void Update() { //マウス操作 float hor = rotatespeed * Input.GetAxis("Mouse X"); float ver = rotatespeed * Input.GetAxis("Mouse Y"); // 【変更】 rotEuler = new Vector3(Mathf.Clamp(rotEuler.x - ver, minangle, maxangle), rotEuler.y + hor, 0f); transform.localEulerAngles = rotEuler; } ```