🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

Q&A

解決済

2回答

6055閲覧

Unity インスペクターとスクリプトでRotationの値が違う

groggy_egg

総合スコア24

C#

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Unity

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

0グッド

0クリップ

投稿2021/01/07 06:30

Unity2020.2.1f1
オブジェクトの回転(Rotation)を取得したいのですが
インスペクター上では(100,0,0)となっているのに
Vector3 localAngle = obj.transform.localEulerAngles;
をDebug.Logしてみると(80,180,180)となります。

回転を制御する処理をしたいのですが
表示と取得した値が違うため正しく処理ができません。

例えば

if(Rotaion.xが100になっているか) { //100になっていなければ Rotaion.x = 100 }

という処理をするのに
Rotation.xをすでに100にしているにもかかわらず
100になっていると判定されないため
延々と100にする処理を行ってしまいます。

angleBefore:(0.0, 0.0, 0.0) clamp:100 angleAfter:(80.0, 180.0, 180.0) angleBefore:(80.0, 180.0, 180.0) clamp:100 angleAfter:(60.0, 180.0, 180.0) : :

ローカル座標で取得してもワールド座標で取得しても同じ座標です。

C#

1 Vector3 localAngle = obj.transform.localEulerAngles; 2 //Vector3 localAngle = obj.transform.eulerAngles;

インスペクターで表示されている値と同じ値を取得することはできないのでしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

インスペクター上では(100,0,0)となっているのに
Vector3 localAngle = obj.transform.localEulerAngles;
をDebug.Logしてみると(80,180,180)となります。

「(80,180,180)」も「(100,0,0)」も同じです。
実際に回してみればいいです。

まわしてみた

基本的にオイラー角(EulerAngle)はsetはしてもgetはすべきではありません。
この事は、マニュアルにも書かれています。

Google翻訳

オイラー角は、個々の軸の周りで3つの別々の回転を実行することにより、3次元の回転を表すことができます。 Unityでは、これらの回転はZ軸、X軸、Y軸の順に実行されます。

このプロパティを設定することでクォータニオンの回転を設定でき、このプロパティを読み取ることでオイラー角の値を読み取ることができます。

.eulerAnglesプロパティを使用して回転を設定する場合、回転を説明するためにX、Y、およびZ回転値を指定しているにもかかわらず、これらの値は回転に格納されないことを理解することが重要です。代わりに、X、Y、Zの値がQuaternionの内部形式に変換されます。

.eulerAnglesプロパティを読み取ると、UnityはQuaternionの回転の内部表現をオイラー角に変換します。**オイラー角を使用して特定の回転を表す方法は複数あるため、読み戻す値は、割り当てた値とはかなり異なる場合があります。**値を徐々にインクリメントしてアニメーションを作成しようとすると、混乱が生じる可能性があります。

この種の問題を回避するために、回転を操作するための推奨される方法は、.eulerAnglesを読み取るときに、特に回転を徐々にインクリメントしてアニメーションを生成しようとするときに、一貫した結果に依存しないようにすることです。これを実現するためのより良い方法については、Quaternion *演算子を参照してください。

次の例は、ユーザーの入力に基づいてeulerAnglesを使用したGameObjectの回転を示しています。この例は、回転をインクリメントするためにQuanternion.eulerAnglesの読み取りに依存することはなく、代わりにVector3currentEulerAnglesを使用して設定することを示しています。すべての回転の変更はcurrentEulerAngles変数で発生し、Quaternionに適用されて、上記の問題を回避します。

マニュアルのサンプルのように、オイラー角は自分で保持して計算し、その結果をlocalEulerAngleに設定するようにすべきです。
(そして判定は、その保持したオイラー角で判定すればよいでしょう)

投稿2021/01/07 12:16

katsuko

総合スコア3536

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

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

groggy_egg

2021/01/08 04:25

Start()で初期値を取得 _currentEulerAngles = _obj.transform.localEulerAngles; Update()で角度を加算 _currentEulerAngles.x += rot; obj.transform.localEulerAngles = _currentEulerAngles; としたところ、できました。 アドバイスありがとうございました。
guest

0

localだからじゃないですかね……?

というか、回転の取得はtransform.rotationでいいのでは?

投稿2021/01/07 10:13

PinoMatcha

総合スコア368

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

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

groggy_egg

2021/01/08 02:30

transform.rotaionだとラジアンで取得します。 ラジアンからオイラーに変換すると同様の値になります。 LocalでもWorldでも同じ値です
groggy_egg

2021/01/08 02:32

間違いました。 ラジアンではなくQuartanionで取得します。 Quartanionから変換すると同じ値です
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問