Unity UpdateとFixedUpdateの使い分け

Unityを使っているとUpdate()やFixedUpdate()を使うことが頻繁にあると思います。

 

その中でUpdate()に書かないほうが良いコードや、FixedUpdateに書かないほうが良いコードなどがあります。

今回はその主な使い分けの方法を紹介します。

はじめに

 

今回は、Input関数RigidBodyをどちらに書いたほうが良いのかなどを紹介していきます。

また、これらのコードを同時に使いたいという時に、どのように書けば良いかという説明します。

 

blank

Update( ) と FixedUpdate( )の使い分けについて紹介するよ!

 

Update()とFixedUpdate()の違い

 

まず、Update()とFixedUpdate()の違いについて説明します。

Updateを使うと1秒間に数十回呼び出されます。

 

ですが、この回数が毎回同じ回数呼ばれるというわけではありません。

そこで使われるのが、FixedUpdate()です。FixedUpdate()は、秒間に呼ばれる回数が一定になります。

 

Point
FixedUpdateは一定で呼び出される

 

つまり、一言で使い分けというと「不規則に呼ばれる」か「一定で呼ばれる」かで使い分けることになります。

では一定で呼ばれるとどのような利点や、欠点があるかを説明していきます。

 

Update()で使えないもの

 

blank

Update( )で使わない方が良いコードもあるっぽい

 

Update内で使わないほうが良いものを紹介します。

それは「RigidBody」を使うコードです。

 

Unityでアクションゲームを作る時などに、移動処理で以下のようなコードを使うと思います。

 

GetComponent<RigidBody2D>().velocity or AddForce

 

このようなコードはUpdate()内ではなくFixedUpdate()に入れるようにしましょう。

 

Point
RigidBody2DとかはFixedUpdateに記述する

 

先ほどもお話しした通り、Update()の呼び出し回数にはばらつきがあります。

ですのでこのコードをUpdate()に書いてしまうと、Update()がたくさん呼ばれる時とあまり呼ばれない時ができてしまい、移動が安定しません。

 

そのままにしておくと、「移動がガタガタ」になってしまったり、「瞬間移動」したように見えたりしてしまいます。

こういった理由から、RigidBodyなどを使う時はFixedUpdate()に書くようにしましょう。

 

blank

キャラクターの移動で挙動がおかしかったらFixedUpdateを疑ってみるのも良いかも

 

FixedUpdate()で使えないもの

 

では、FixedUpdate()に全て書いておけば良いのかというと、そういうわけではありません。

FixedUpdate()にも書かないほうが良いコードがあります。

 

そのコードとは「Input.〜」です。

Input.GetMouseButtonDown(0)

 

Point
Input.GetMouseButtonDownなどはUpdate( )に書いた方が良い

 

などはFixedUpdate()に書いてはいけません。

先ほどお話しした通り、FixedUpdate()は一定ごとに呼び出されます。

 

もし、Input.GetMouseButton(0)を一定ごとに呼び出してしまうと、Inputの入力回数に対して一定時間が間に合わなくなる可能性が有ります。

そうなってしまうと、その時に書かれていた処理を呼び出せなくなってしまいます。

 

blank

処理が飛んで正確に計測できないかも

 

Update()ではInputを毎フレームごとに呼び出してくれるので、処理を飛ばすことはありません。

このようなことからInput系はUpdate()に記述したほうが良いということがわかりました。

 

ですが、もし同時に使いたいという時にはどのようにすれば良いかという問題があります。

以下から説明していきます。

 

Update()とFixedUpdate()を同時に使うには

 

blank

それぞれの向き不向きがあるみたい
じゃあ、それぞれを書き分けた例を見てみよう

 

例えば、キーボードで「→」を押したら右に移動するという時には、Input.GetKeyとGetComponent<RigidBody2D>の両方を使います。

こういった処理をしたい時、両方ともUpdate()内や両方ともFixedUpdate()に書いたりできないので、以下のように書き換えてみましょう。

 

using UnityEngine;
using System.Collections;

public class PlayerController : MonoBehaviour {

    GameObject Player;
    bool Move;

    void Start () {

        Player = GameObject.Find ("Player");
    }
    void Update () {

        if (Input.GetKey (KeyCode.RightArrow)) {
            Move = true;
        } else {
            Move = false;
        }
    }
    void FixedUpdate(){

        if(Move){
            Player.GetComponent ().velocity = (Vector3.right*2.0f);
        }else if(!Move){
            Player.GetComponent ().velocity = (Vector3.zero);
        }
    }
}

 

このようにbool型を経由することでも同時に使えるようになります。

 

Point
処理や挙動の向き不向きに合わせてUpdateやFixedUpdateを使う

 

まとめ

 

アクションゲームを作っていると、動作の安定性はとても重要な要素です。

Update()とFixedUpdate()の違いを理解しておくことでおかしな動作をすることなく、プレイヤーの移動処理をすることができます。

 

ちなみに、LateUpdate()というのもあります。

これはUpdateが呼ばれた後に呼び出されるというものなのですが、興味がある人は調べてみてください。

 

Point
Update( )が呼ばれた後に呼び出される【LateUpdate( )】も存在する

 

Updateを使い分けて安定した動作をするゲームを作っていきましょう。

 

 

ではまた。

過去にレビューしたアイテム