この記事は約7分35秒で読むことができます。

Unity Update内で1回だけ処理をする方法

Unityを使っていると「Update」内に処理を書くことが多いかと思います。

「Update」はこの中に「書いた処理を何回も呼び出す」というものなのですが、Update内に書いた処理を1回だけ呼び出すにはどのような書き方をすれば良いか紹介します。

はじめに

Unityでスクリプトを作る時、デフォルトではMonoDevelopを使いますよね。コードを書くアプリケーションを変更することもできるのですが、特に不便ではないので私はこのまま使っています。

Unityで新規作成したスクリプトを開くと、以下のようなコードが初期状態で書かれています。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
	
	}
}

ここに書かれている「Update」が何回も呼び出されるので、連続した処理をしたい時はここに書いてください。

では、Updateに書いた処理を1回だけ呼び出したい時はどのようにすれば良いか説明します。


※ 追記:

コメントにて、今回の記事に指摘いただきました。

Update内で1回だけ処理をする必要性は無いです。

オブジェクト生成時のみ呼びたい処理があるならAwake()かStart()、オブジェクトをSetActiveで表示、非表示を繰り返す度に呼びたいならOnEnable()で足りるので安いからといって条件分岐にコストを払う必要性を感じません。


一回だけ処理しよう

ではまず一回だけ処理をしたい時とはどのような時があるのか、以下のコードがわかりやすいかと思います。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	// Use this for initialization
	void Start () {
	
	}
	
	// Update is called once per frame
	void Update () {
		Debug.Log ("Play!!");
	}
}

このコードは、ゲームが起動している時はコンソールに「Play!!」が呼ばれた回数が表示されるというものです。

スクリーンショット 2016-03-07 16.13.01

起動後少ししただけで「196」回も呼び出されました。例えばこの処理が爆発を起こすものだったとしたら、一瞬で196回の爆発が発生することになってしまいます。

ではこのような処理を1回だけ呼び出すようにしてみましょう。先ほどのコードを以下のように書き換えてください。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {

	bool One;
	// Use this for initialization
	void Start () {
		One = true;
	}
	
	// Update is called once per frame
	void Update () {
		if (One) {
			Debug.Log ("Play!!");
			One = false;
		}
	}
}

このようにすることで、ゲームが開始された後どれだけの時間がかかっても「Play!!」は1回しかカウントされないようになります。

(シーンをロードし直したら、再度呼ばれるようになっています)

スクリーンショット 2016-03-07 16.17.54

先ほど例に出した「爆発を起こす処理」を追加したい時はDebug.Log(“Play!!”);を爆発の処理に変更すれば1度だけ爆発を起こすことができます。

任意のタイミングで呼ぶ

このコードで爆発を起こそうとした場合、起動直後に1回だけ爆発を起こすことができたのですが、任意のタイミングで何回でも爆発を起こす場合はどのようにすれば良いか説明していきます。

ここでは「スペースキーを押したら爆発させる」というコードにします。

※「スペースキーを押したら」を判定するコードは別にあるのですが、ここではわかりやすいように別々にしています。

using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour {
	bool One;
	// Use this for initialization
	void Start () {
		One = true;
	}
	
	// Update is called once per frame
	void Update () {
		if (One) {
			Debug.Log ("Play!!");
			One = false;
		}
		if(Input.GetButtonDown("Jump"){
			One = true;
		}
	}
}

if(Input.GetButtonDown(“Jump”)){ は「スペースキーを押したら…」というコードです。爆発を起こす場合は「プレイヤーが敵にぶつかったら…」のようなコードに変更してください。

このようにすることで「One」がtrueになるたびに「Play!!」がカウントされていきます。

同じようにして応用していけば、Updateの中であっても「1回だけ呼び出す」処理を作成することができるようになりました。

まとめ

今回の方法を使えば「Update」で1回だけ処理をするコードが作成できました。

Updateはとても便利なコードなのでぜひ活用していきましょう。

ではまた。

0

コメント

  1. とおりすがり より:

    Update内で1回だけ処理をする必要性は無いです。オブジェクト生成時のみ呼びたい処理があるならAwake()かStart()、オブジェクトをSetActiveで表示、非表示を繰り返す度に呼びたいならOnEnable()で足りるので安いからといって条件分岐にコストを払う必要性を感じません。初心者さんが見たら勘違いするので冒頭に追記希望です。

    ▽ Unityイベント関数実行順
    http://docs.unity3d.com/ja/current/Manual/ExecutionOrder.html

    • Unity_Kaihatsu より:

      コメントありがとうございます。
      ご指摘いただいた点、追記させていただきました。
      ありがとうございました。