質問するログイン新規登録
C#

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

Unity

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

Q&A

解決済

1回答

4297閲覧

【Unity2D】transform.Rotate がマイナス方向に回らない

rinchu_17

総合スコア24

C#

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

Unity

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

0グッド

0クリップ

投稿2019/06/25 10:01

0

0

閲覧ありがとうございます。

Unity2Dのスクリプトに関する質問です。
コルーチンの中でオブジェクトをy軸について90°回転させたあと、同じ速度で0°まで回転させたいです。
ソースは以下の通りになります。

C#

1public class MyCardBehaviour : MonoBehaviour { 2 public float openSpeed = 3; 3 4 void Start() { 5 StartCoroutine(OpenMotion()); 6 } 7 8 public IEnumerator OpenMotion () { 9 while(transform.localEulerAngles.y <= 90f) { 10 transform.Rotate(0f, openSpeed, 0f); 11 yield return null; 12 } 13 14 while (transform.localEulerAngles.y >= 0f && transform.localEulerAngles.y <= 180 ) { 15 transform.Rotate(0f, -openSpeed, 0f); //なぜか回らない このブロック自体には入ってる 無限ループに入っている模様 yを正にすると回るしブロックを抜ける 16 yield return null; 17 } 18 19 transform.localEulerAngles = Vector3.zero; //誤差が出るかもなので一応0に戻す 20 } 21}

上記のコードを実行すると、一度目のwhileは正常に処理し90°になる(2Dオブジェクトなので視認できなくなる)のですが、二度目のwhileの中で止まってしまうらしく、マイナス方向への回転が行われません。(視認できないまま)

二度目のwhile内でログを出力したところ無限にログが出力されたため、ブロック自体には入っておりループもしているようでした。

原因がわかる方いらっしゃいましたらご回答よろしくお願いします。

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

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

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

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

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

Bongo

2019/06/25 11:42

私の試したかぎりではちゃんと逆回転しましたが、このスクリプトをどのオブジェクトに付けてもそうなってしまうでしょうか? なにか他に回転に干渉しそうなスクリプトはついていないでしょうか。たとえば仮にMyCardBehaviourが2つ重複してアタッチされていると、順回転と逆回転が相殺されて90°から動かなくなるかもしれません。
rinchu_17

2019/06/29 04:44

返信遅れてすみません。 他のオブジェクトから子オブジェクトとして生成しているほかは、特に思い当たる節はありません。
guest

回答1

0

ベストアンサー

Eularとか EularAngles とついているものは3つの値が揃って意味があるものです
x, z の値を無視してyの値だけを見ても、バグの原因になります

最近似たような質問に答えたのでこちらを参照してください
https://teratail.com/questions/196226

書くのならこんな感じで良いのではないでしょうか

for(int i = 0; i < 90; i++){ transform.localRotaiton = Quaternion.Euler(0f, (float)i, 0f); yield return null; } for(int i = 0; i < 90; i++){ transform.localRotaiton = Quaternion.Euler(0f, 90f - i, 0f); yield return null; } transform.localRotaiton = Quartanion.Eular(0f, 0f, 0f);

投稿2019/06/26 01:31

izmktr

総合スコア2856

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

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

rinchu_17

2019/06/29 04:51

回答ありがとうございます。 理想的な動きが出来ました! クオータニオンを使うべきだったのですね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問