クリアメモリ

プログラミングやガジェットレビュー、便利なアプリケーションなど雑多に記録するブログ

【Unity】Update()とFixedUpdate()には使い分けがあった!?

f:id:clrmemory:20171116200530p:plain

こんにちはクリアメモリです!

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

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

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

 

 

はじめに

 

今回は、Input関数RigidBodyをどちらに書いたほうが良いのかなどを紹介していきます。また、これらのコードを同時に使いたいという時に、どのように書けば良いかという説明します。

 

Update()とFixedUpdate()の違い

 

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

Updateを使うと1秒間に数十回呼び出されます。ですが、この回数が毎回同じ回数呼ばれるというわけではありません。

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

 

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

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

 

Update()で使えないもの

 

Update内で使わないほうが良いものを紹介します。それは「RigidBody」を使うコードです。Unityでアクションゲームを作る時などに、移動処理で以下のようなコードを使うと思います。

 

GetComponent<RigidBody2D>().velocity or AddForce

 

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

  

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

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

 

そのままにしておくと、「移動がガタガタ」になってしまったり、「瞬間移動」したように見えたりしてしまいます。こういった理由から、RigidBodyなどを使う時はFixedUpdate()に書くようにしましょう。

 

FixedUpdate()で使えないもの

 

では、FixedUpdate()に全て書いておけば良いのかというと、そういうわけではありません。FixedUpdate()にも書かないほうが良いコードがあります。

 

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

 

Input.GetMouseButtonDown(0)

 

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

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

 

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

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

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

 

このようなことからInput系はUpdate()に記述したほうが良いということがわかりました。ですが、もし同時に使いたいという時にはどのようにすれば良いかという問題があります。

 

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

 

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

 

例えば、キーボードで「→」を押したら右に移動するという時には、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型を経由することでも同時に使えるようになります。

 

まとめ

 

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

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

 

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

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

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

 

www.clrmemory.com

  

ではまた。

 

新着記事