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

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

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

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

Q&A

解決済

2回答

3482閲覧

transformの移動とrigitbodyの移動について

kszk

総合スコア13

Unity

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

0グッド

0クリップ

投稿2018/08/05 23:19

お世話になります。
当方初心者の為、無作法ご容赦ください。

掲題の質問についてですか、rigitbodyに対して、力を与えた場合見た目スムーズな移動にみえます。
対してtransformを直接移動させると、例え、linearな動きだとしても、カクカク動きます。
カメラの移動は特に顕著です。
動かしているのは3dです。
transformの移動では正しい動きが得られないのでしょうか?
はたまた更新のタイミングがupdateを利用すべきでは無いのでしょうか?
又、数値は例えlinearだとしても、lerp等の補完関数を使うべきでしょうか?

文書は多いですが、質問内容は一つでいかにしたらtransformを用いてスムーズに動かせるか?という事を聞きたいです。
御教示の程宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

ベストアンサー

transformでの移動方法が間違っていると思われます。

C#

1void Update () { 2 transform.position += new Vector3(1f, 0f, 0f); 3}

例えば上記のコード、ゲームによってはカクカクします。

Update関数は「1フレームに1回」呼ばれます。
そしてフレームレート(=1秒間に何回Updateが呼ばれるか)は負荷によって都度都度変わります。

例えば(極端な例ですが)上記のコードを使って、フレームレートが以下のように推移した場合。
0フレーム目:ゲーム開始後0秒目
1フレーム目:0.01秒目
2フレーム目:0.03秒目
3フレーム目:0.035秒目

各フレーム間の時間が0.01→0.02→0.005秒とバラバラなのに移動量は同じなのでガタついて見えます。
(カメラの移動だと描画に直結する為分かりやすいかと)

なので「Time.deltaTime=各フレーム間に掛かった時間」を掛け算することで、各フレームにおける移動距離を同じにすることが出来ます。

C#

1void Update () { 2 transform.position += new Vector3(1f, 0f, 0f) * Time.deltaTime; 3}

これだけでも大分滑らかになるはずですが、必要と好みに応じてlerp等を使うと良いかと。


ちなみに何故rigitbodyだと元から滑らかなのかというと、
物理演算の場合Unityが内部で上手いこと調整してくれているのと、
「フレームレート依存」ではなく「現実世界の"時間"依存」で動いている為です。

Updateの代わりにFixedUpdateを使うと、フレームレートに依存せず常に同じ間隔(デフォ値だと0.02秒。Edit > Player Settings > Time から変更可)で移動するようになると思います。
「物理的な操作はUpdateではなくFixedUpdateで行え」というのはこれが理由です。
(Updateを使うとFixedUpdateの合間にUnityが意図しない操作が入ってしまい、物理演算が破綻する可能性がある)

逆に何故常にFixedUpdateを使わないかというと、負荷を最小限にする為にわざわざフレームレート落としてる(=Updateの回数を減らしている=計算回数を減らしている)のに、それを無視して一定間隔で計算し続けてたら無駄だよね、ということかと。


ちなみにちなみに、画面の描画自体はフレームレート単位なので、
フレームレートがガタ落ちしている場合(10fpsとか)の場合はtransformだろうがrigidbodyだろうがカクついて見えます。
この場合は全体の負荷を下げる等して、まずフレームレートを上げることを目標にしてください。
(今回はrigidbodyは滑らかとのことなので候補から外しましたが)

投稿2018/08/06 01:19

sakura_hana

総合スコア11427

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

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

0

とても分かりやすい回答ありがとうございました。
早速、差動時間を掛けてみます。
どうもありがとうございました。

投稿2018/08/06 01:49

kszk

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問