質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

718閲覧

unityのPlayQueued()で回転角がズレる

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2021/05/19 07:16

編集2021/05/20 08:16

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問