問題

私はLateUpdateでアニメーションをクランプしています:

     float fMinRotationLR = 320f;

    float fOldX = Chest.localEulerAngles.x;

    if (Chest.localRotation.eulerAngles.y < fMinRotationLR)
    {
         Chest.Rotate(new Vector3(Chest.localRotation.x, fMinRotationLR, Chest.localRotation.z));
    }

    float fNewX = Chest.localEulerAngles.x;
 

"Rotate" を呼び出す前に、fOldX は "Rotate" を呼び出した後、fNewX は 0 です。

ここで何が起こっているのですか?どうすればこれを防ぐことができますか?

私はすでに使ってみました

 Chest.localEulerAngles = new Vector3(Chest.localRotation.x, fMinRotationLR, Chest.localRotation.z);
 

しかし、それは同じ結果をもたらします。

助けてくれてありがとう。

  ベストアンサー

transform.Rotate(x,y,z)またはVector3を受け入れる同等のものは、x軸の周りにx度、y軸の周りのy度などで変換を回転させます。元のコード:

 Chest.Rotate(new Vector3(Chest.localRotation.x, fMinRotationLR, Chest.localRotation.z));
 

x軸の周りのChest Chest.localRotation.x度を回転させます。これは0に戻すのに十分です。

もう少し深く掘り下げるために、ソフトウェアの慣習では、関数/メソッドは通常「何かをするアクション」を意味すると述べています。 SetRotationという名前のメソッドは通常rotation =と等しい。

この場合、メソッド名はRotateなので、同じコンベンションでは、「変換を回転させる」ことを意味すると推測できます。 UnityのAPIはこのコンベンションをかなりうまく守っています。

2回目の試み:

 Chest.localEulerAngles = new Vector3(Chest.localRotation.x, fMinRotationLR, Chest.localRotation.z);
 

また、Chest.localEulerAngles(Vector3)にChest.localRotationの値( Quaternion )を割り当てているため、機能しません。 QuaternionはVector4で、3Dロタテーショナル状態を表す別の方法(より信頼性の高い)です。それはEulerAnglesとは異なるので、値は同じ意味を持ちません。

あなたは自分で問題を解決したようですが、なぜそれが起こるのか説明しています。

 Chest.localEulerAngles = new Vector3(Chest.localRotation.eulerAngles.x, fMinRotationLR, Chest.localRotation.eulerAngles.z);
 

  同じタグがついた質問を見る

c#unity3d