0 支持
31 閲覧

unityの勉強をしているのですが、以下のコードで、
1.スペース押下でZ軸回りに45度回転
2.次のスペース押下でZ軸回りに-45度回転(つまり元の状態に戻る)

1 と 2 を繰り返し、出力されたログを見ると、以下のようになりました。

anim.Play("Rotate")だと以下のように、欲しい結果となります。

0 : localR(   0.000,    0.000,    0.000)
--------------------------
1 : localR(   0.000,    0.000,   45.000)
--------------------------
2 : localR(   0.000,    0.000,   45.000)
--------------------------
3 : localR(   0.000,    0.000,    0.000)

一方、anim.PlayQueued("Rotate", QueueMode.CompleteOthers)だと以下のように、角度的にズレた結果となりました。

0 : localR(   0.000,    0.000,    0.000)
--------------------------
1 : localR(   0.000,    0.000,   42.854)
--------------------------
2 : localR(   0.000,    0.000,   42.854)
--------------------------
3 : localR(   0.000,    0.000,    0.016)

何故、PlayQueued()だとズレるのか、御存知の方いらっしゃたら教えていただけますか。
よろしくお願いします。

public class Scrpt1 : MonoBehaviour
{
    Animation anim;
    bool _switch = true;
    int cnt = 0, no = 0;

    void Start()
    {
        anim = GetComponent<Animation>();
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            float stZ, edZ;
            if (_switch)
            {
				stZ = 0;
				edZ = 45;
			}
            else
            {
				stZ = 45;
				edZ = 0;
			}
            _switch = !_switch;

            const float conTimeRound = 0.3f;

            var clip = new AnimationClip();
            clip.legacy = true;

            var quatrnSt = Quaternion.Euler(0, 0, stZ);
            var quatrnEd = Quaternion.Euler(0, 0, edZ);
            var curveX = AnimationCurve.Linear(0, quatrnSt.x, conTimeRound, quatrnEd.x);
            var curveY = AnimationCurve.Linear(0, quatrnSt.y, conTimeRound, quatrnEd.y);
            var curveZ = AnimationCurve.Linear(0, quatrnSt.z, conTimeRound, quatrnEd.z);
            var curveW = AnimationCurve.Linear(0, quatrnSt.w, conTimeRound, quatrnEd.w);
            clip.SetCurve("", typeof(Transform), "localRotation.x", curveX);
            clip.SetCurve("", typeof(Transform), "localRotation.y", curveY);
            clip.SetCurve("", typeof(Transform), "localRotation.z", curveZ);
            clip.SetCurve("", typeof(Transform), "localRotation.w", curveW);
            clip.wrapMode = WrapMode.Once;
            anim.AddClip(clip, "Rotate");
            anim.Play("Rotate");
            //anim.PlayQueued("Rotate", QueueMode.CompleteOthers);    // この実行で角度がズレる。
        }

        // 一定時間毎に現在の回転角を表示する。
        if (cnt++ > 300)
        {
            var lrot = transform.localEulerAngles;
            string str = $"localR({lrot.x,8:0.000}, {lrot.y,8:0.000}, {lrot.z,8:0.000})";
            Debug.Log(no++ + " : " + str);
            cnt = 0;
        }
    }
}
初心者 (120 ポイント) | 31 閲覧

ログインまたはユーザー登録してから回答してください。

2021-02-08 質問・回答をMarkdownで入力できるようにしました。
2020-09-03 新たなスパム対策を導入しました。

158 質問

153 回答

159 コメント

189 ユーザー