【Unity C#】関数を1回だけ呼ぶ方法

  • 3
    Like
  • 1
    Comment
More than 1 year has passed since last update.

はじめに

ある関数を1回だけ実行させたい。こういう時どうすれば良いかをまとめてみました。

1. Start()で呼ぶ

おそらく最もシンプルな方法。 Awake()に書いても良い

NewBehaviourScript.cs
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        // Hoge()を実行
        Hoge();
    }

    void Hoge()
    {
        Debug.Log("ほげ");
    }
}

ただ、この方法だと開始時に呼ばれてしまう。 任意のタイミングで実行させたい場合には使えない

2. 変数を用意する

変数を使って過去に呼ばれたかどうかを素直に判定させる。
シンプルだがスマートではないようにも思える。

NewBehaviourScript.cs
using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
    bool isCalled = false;

    void Update()
    {
        // Time.time > 1.5f の場合に1回だけHoge()を実行
        if (Time.time > 1.5f)
        {
            if (isCalled == false)
            {
                isCalled = true;
                Hoge();
            }
        }   
    }

    void Hoge()
    {
        Debug.Log("ほげ");
    }
}

3. UniRxを使う

UniRx - Reactive Extensions for Unity を使うとシンプル、そしてスマートに書ける。
UniRxについてはググるとわかりやすい記事がたくさん出てくるので調べてみるといいかもしれない。

NewBehaviourScript.cs
using UnityEngine;
using UniRx;
using UniRx.Triggers;

public class NewBehaviourScript : MonoBehaviour 
{
    void Start ()
    {
        // Time.time > 1.5f の場合に1回だけHoge()を実行
        this.UpdateAsObservable()
            .First(x => Time.time > 1.5f)
            .Subscribe(x => Hoge());
    }

    void Hoge()
    {
        Debug.Log("ほげ");
    }
}

参考URL

未来のプログラミング技術をUnityで -UniRx-
http://www.slideshare.net/torisoup/unity-unirx

UniRxについて書いた記事をまとめてみた
http://qiita.com/toRisouP/items/48b9fa25df64d3c6a392

UniRxのシンプルなサンプル その3(FirstとTake)
http://qiita.com/Marimoiro/items/b24510b0ffd273f69f8a