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

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

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

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

Q&A

解決済

1回答

637閲覧

どのRatateメソッドの構文で回転させているか

退会済みユーザー

退会済みユーザー

総合スコア0

Unity

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

0グッド

0クリップ

投稿2021/07/03 17:07

前提・実現したいこと

以下のようにトランスフォームを回転させているコードを見かけたのですが、
これはtransform.Rotateメソッドのどの構文に該当するのでしょうか。
ご教示お願いします。

C#

1 float rotateSpeed = 2.0f; 2 3 void Update() 4 { 5 this.transform.Rotate(Vector3.up * rotateSpeed); 6 }

試したこと

ドキュメントを確認したところ、Rotateメソッドには以下の構文がありました。

C#

1public void Rotate (Vector3 eulers, Space relativeTo= Space.Self); 2public void Rotate (float xAngle, float yAngle, float zAngle, Space relativeTo= Space.Self); 3public void Rotate (Vector3 axis, float angle, Space relativeTo= Space.Self);

構文を見た限りでは、第1引数しか指定しなくてよいのは、一番最初の

C#

1public void Rotate (Vector3 eulers, Space relativeTo= Space.Self);

の構文のみなので、今回の場合はこれに該当するのかと思いました。
ただし、腑に落ちないことがあり、今回のコードでは、Vector3.upを指定していることです。
引数がeulersではなく、axisであれば、Vector3.upの軸周りに回転させるので、引数axisにVector3.upを指定するという使い方で
納得がいくのですが、eulersは(X,Y,Z)の3つの角度を示すVector3を指定すべきなので、
ワールド座標のY軸の方向ベクトルを意味するVector3.upを指定するのは、違うのではないか?と思ってしまいます。

ただ、以下のようにログを取ってみた所、

C#

1 void Update() 2 { 3 this.transform.Rotate(Vector3.up * rotateSpeed); 4 Debug.Log(Vector3.up * rotateSpeed); 5 }

以下の値が常に出続けました。

(0.0, 2.0, 0.0)

Vector3.upを指定してはいるものの、rotateSpeedを掛け合わせることで、結果として、
引数eulersに(0.0, 2.0, 0.0)のように、Y軸周りの角度2.0度を与え続けているということでしょうか?
つまり、Vector3.upという形で指定しつつも、rotateSpeedを掛け合わせることで、偶然(?)、結果的には、
eulersにY軸のみの角度を与える形となっているということでしょうか。
(第1引数はeulersという名前ではあるものの、結局は、第1引数はaxisのようにみなして、第1引数にVector3.upのような方向ベクトルを指定し、
それにrotateSpeedを掛け合わせてしまえばよいということでしょうか?)
それともドキュメントで見つけた上記構文には該当せずに、以下のような構文が他に存在するということでしょうか?

public void Rotate (Vector3 axis, Space relativeTo= Space.Self);

また、追記の質問となりますが、今回のコードでもTime.deltaTimeを掛けて、以下のようにしたほうがよいでしょうか?
(勉強している教材では、Time.deltaTimeを掛けていなかったため)。

C#

1 float rotateSpeed = 2.0f; 2 3 void Update() 4 { 5 this.transform.Rotate(Vector3.up * rotateSpeed * Time.deltaTime); 6 }

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、使用されているのは一番最初の
public void Rotate (Vector3 eulers, Space relativeTo= Space.Self);
という認識は正しいです。

次にVector3.upですが、これは「(0,1,0)というVector3」を示します。ただそれだけです。
これが「ワールド座標のY軸の方向ベクトルを意味する」のは解釈によるものであり、解釈が違えば意味が変わります。
Vector3が「ベクトル」の時もあれば「座標」の時もあるのと同じようなものであり、
例えば「1m」と言った時、それが「Vector3.forwardの長さ」なのか「キャラの身長」なのか「銃弾が1秒に進む距離」なのかは解釈(文脈)によるのと一緒です。

さて、Rotate (Vector3 eulers, Space relativeTo= Space.Self) のドキュメントを見ると「Rotate takes a Vector3 argument as an Euler angle.」と記載してあります。
つまり「Vector3はオイラー角として取り扱うよ」と言っているので、これはオイラー角として解釈されます。
よってVector3.upは「Y軸周りの角度1.0度」という意味になり、その通りに回転します。(そこにrotateSpeedを掛け算すればその分角度が増減します)
このようにドキュメントとは**「この引数はこういう意味として取り扱い、こういう処理をするよ」という資料**なので、素直に従いましょう。

なおTime.deltaTimeですが、これはあった方がいいです。FPSが違う環境だと回転速度が変わってしまいます。
教材の後ろの方で出て来るか、学習内容を増やしすぎないように省略されているのではないでしょうか。

投稿2021/07/05 00:42

sakura_hana

総合スコア11427

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

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

退会済みユーザー

退会済みユーザー

2021/07/05 12:32

ご回答ありがとうございます。 ご教示いただいた内容、とてもわかりやすかったです。理解できました。 ご教示いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問