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

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

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

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

Q&A

解決済

2回答

1797閲覧

[Unity2D] transform.Rotateがカクつきます。直す方法はありますか?

Tsugume

総合スコア6

Unity

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

0グッド

0クリップ

投稿2019/08/23 11:44

やりたいこと・前提

回転というより角度(deg)を基にその方向へゲームオブジェクトを向かせたいのですが、
ちょうどいい機能が見つからずtransform.Rotateで一応のこと間に合わせています。
しかしこれを処理するゲームオブジェクトのみ20~30fps程度のカクつきを見せ、
直す方法を探しています。

ゲームオブジェクトの進行は角度と速度で管理しており、常に運動しています。
(角度を単位ベクトルに直したものと速度をRigidbody.velocityに代入して動かしています)
また、System.Reflectionを用いて名前不定義のクラスのメソッドへ毎フレームアクセスしています。

ソースコードの該当部分

C#

1public float add = 0; 2 3void Update(){ 4 transform.Rotate(0,0,add); 5 add = 0; 6}

必要な際このaddに回転分を代入しています。

試したこと

原因を探してみたのですが……

該当するゲームオブジェクトが画面上に20個程度あっても、CPUは10ms(100fps)、GPUは16ms(60fps)を保ち、マシンのスペックが悪いためではないようです。
System.Reflectionを用いた部分をコメントアウトしたところ解決する気がしないため、これも原因ではないようです。
上記のコードにおいてaddを使わず、たんにtransform.Rotate(0,0,1);のようにしても、同じ挙動を見せました。
UpdateをFixedUpdateにしても変わりませんでした。

ただ、運動していないゲームオブジェクトではスムーズに回転するようです。

運動中のゲームオブジェクトにtransform.Rotateを使うのはカクついてしまうのでしょうか。
もしそうであればいかにして向きを変えれば良いでしょうか。
分かる方教えて下さい、お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Rigidbodyをアタッチしたオブジェクトに対してTransform経由で回転、移動等の操作を加えた場合、物理的な力の伝搬などが一切考慮されないため、ありとあらゆる不具合の原因になります。

Rigidbody.MoveRotationを使うのが良いでしょう。

C#

1public float add = 0; 2[SerializeField] 3Rigidbody rb; 4void Update(){ 5 var addRotation = Quaternion.Euler(0,0,add); 6 rb.MoveRotation(rb.rotation * addRotation ); 7 add = 0; 8}

また、addの値を経由して回転を行うこの実装はあまり良いパターンとは言えません。
1フレームに複数回addを弄ったら何回か反応しなかった、物理的な操作を行うのに好ましいFixedUpdateにしたら反応しない場合が出てきた、とかが間違いなく起こるでしょう。

C#

1[SerializeField] 2Rigidbody rb; 3public void AddRotation(float add) 4{ 5 var addRotation = Quaternion.Euler(0,0,add); 6 rb.MoveRotation(rb.rotation * addRotation); 7}

このようなメソッドを呼び出す実装パターンにするべきでしょう。

投稿2019/08/23 14:17

Ram.Type-0

総合スコア424

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

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

Tsugume

2019/08/23 16:46

皆様回答ありがとうございました。 カクつく原因は仰る通りTransform経由で回転させていたからのようです。 恥ずかしながらMoveRotationを知らないがために陥った問題でもあり、非常に勉強になりました。 ただ、誤情報の記載申し訳ありません、RigidbodyではなくRigidbody2Dを使っていたので、進行方向の角度(float)をMoveRotationに入れることで無事解決しました。 Rigidbodyを使った回転の際、ベストアンサー様のコードを是非参考にさせていただきたいと思います。
guest

0

質問頂きありがとうございます。
Unityは可変フレームレートで動いているので
前フレームからの時間から変化量を算出する必要があります。
角速度がωの時は変化量はωΔtなので
transform.Rotate(0,0,add*Time.deltaTime);
とすればかくつかなくなります。

投稿2019/08/23 14:11

bochan2

総合スコア2050

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

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

Ram.Type-0

2019/08/23 14:20

・FixedUpdateにしても変わらなかった ・この実装だとaddが更新された最初のフレームしか回転しない ・運動してないやつだと普通に動く らしいので、多分その問題ではないと思います。 普通Updateでやるって言ったら毎フレーム回転だと思いますが・・・
bochan2

2019/08/24 15:26

FixedUpdateは可変フレームレートですよ
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問