前提・実現したいこと
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()だとズレるのか、御存知の方いらっしゃたら教えていただけますか。 よろしくお願いします。
該当のソースコード
C#
1public class Scrpt1 : MonoBehaviour 2{ 3 Animation anim; 4 bool _switch = true; 5 int cnt = 0, no = 0; 6 7 void Start() 8 { 9 anim = GetComponent<Animation>(); 10 } 11 12 void Update() 13 { 14 if (Input.GetKeyDown(KeyCode.Space)) 15 { 16 float stZ, edZ; 17 if (_switch) 18 { 19 stZ = 0; 20 edZ = 45; 21 } 22 else 23 { 24 stZ = 45; 25 edZ = 0; 26 } 27 _switch = !_switch; 28 29 const float conTimeRound = 0.3f; 30 31 var clip = new AnimationClip(); 32 clip.legacy = true; 33 34 var quatrnSt = Quaternion.Euler(0, 0, stZ); 35 var quatrnEd = Quaternion.Euler(0, 0, edZ); 36 var curveX = AnimationCurve.Linear(0, quatrnSt.x, conTimeRound, quatrnEd.x); 37 var curveY = AnimationCurve.Linear(0, quatrnSt.y, conTimeRound, quatrnEd.y); 38 var curveZ = AnimationCurve.Linear(0, quatrnSt.z, conTimeRound, quatrnEd.z); 39 var curveW = AnimationCurve.Linear(0, quatrnSt.w, conTimeRound, quatrnEd.w); 40 clip.SetCurve("", typeof(Transform), "localRotation.x", curveX); 41 clip.SetCurve("", typeof(Transform), "localRotation.y", curveY); 42 clip.SetCurve("", typeof(Transform), "localRotation.z", curveZ); 43 clip.SetCurve("", typeof(Transform), "localRotation.w", curveW); 44 clip.wrapMode = WrapMode.Once; 45 anim.AddClip(clip, "Rotate"); 46 anim.Play("Rotate"); 47 //anim.PlayQueued("Rotate", QueueMode.CompleteOthers); // この実行で角度がズレる。 48 } 49 50 // 一定時間毎に現在の回転角を表示する。 51 if (cnt++ > 300) 52 { 53 var lrot = transform.localEulerAngles; 54 string str = $"localR({lrot.x,8:0.000}, {lrot.y,8:0.000}, {lrot.z,8:0.000})"; 55 Debug.Log(no++ + " : " + str); 56 cnt = 0; 57 } 58 } 59}
試したこと
Unityのユーザーマニュアルを調べ、またネットも検索してみたのですが、
解決にいたる情報を見つけることができませんでした・・・。
補足情報(FW/ツールのバージョンなど)
Unity 2019.4.3f1
あなたの回答
tips
プレビュー