UpdateではなくCoroutineで処理を行ってみる


初めに

この記事を書いた理由は前回の記事で頂いたコメントを参考にちょっと処理を変えてみたからです。

前回の記事で頂いたコメントの内容は「Update関数内でfadeの判定をしてしまうとfadeを望まないタイミングでもずっと判定してしまうので無駄が発生してしまうから別の処理に変えた方がいいよ!」という内容でした。

改善してみた

Updete内で行っていた処理を全てコルーチンに置き換えてみました
以下プログラム

SceneFadeManager.cs

public class SceneFadeManager : MonoBehaviour
{
    //透明度が変わるスピード
    float fadeSpeed = 0.75f;
    //画面をフェードさせるための画像をパブリックで取得
    public Image fadeImage;
    //画像のRGBA値設定用
    float red, green, blue, alfa;
    //シーン遷移のための型
    string afterScene;
    //フェードイン用のコルーチン
    IEnumerator fadeInCoroutine;
    //フェードアウト用のコルーチン
    IEnumerator fadeOutCoroutine;
    // Start is called before the first frame update
    void Start()
    {
        fadeInCoroutine = FadeIn();
        fadeOutCoroutine = FadeOut();
        DontDestroyOnLoad(this);
        SetRGBA(0, 0, 0, 1);
        StartCoroutine(fadeInCoroutine);
        //シーン遷移が完了した際にフェードインを開始するように設定
        SceneManager.sceneLoaded += fadeInStart;
    }
    //シーン遷移が完了した際にフェードインを開始するように設定
    void fadeInStart(Scene scene,LoadSceneMode mode)
    {
        fadeInCoroutine = FadeIn();
        StartCoroutine(fadeInCoroutine);
    }
    /// <summary>
    /// フェードアウト開始時の画像のRGBA値と次のシーン名を指定
    /// </summary>
    /// <param name="red">画像の赤成分</param>
    /// <param name="green">画像の緑成分</param>
    /// <param name="blue">画像の青成分</param>
    /// <param name="alfa">画像の透明度</param>
    /// <param name="nextScene">遷移先のシーン名</param>
    public void fadeOutStart(int red,int green,int blue,int alfa,string nextScene)
    {
        SetRGBA(red, green, blue, alfa);
        SetColor();
        afterScene = nextScene;
        fadeOutCoroutine = FadeOut();
        StartCoroutine(fadeOutCoroutine);
    }
    IEnumerator FadeIn()
    {
        for (int i = 0; i < 360; i++)
        {
            //不透明度を徐々に下げる
            alfa = Mathf.MoveTowards(alfa, 0f, fadeSpeed * Time.deltaTime);
            //変更した透明度を画像に反映させる関数を呼ぶ
            SetColor();
            yield return null;
            if (alfa <= 0)
                StopCoroutine(fadeInCoroutine);
        }
    }
    IEnumerator FadeOut()
    {
        for (int i = 0; i < 360; i++)
        {
            //不透明度を徐々に上げる
            alfa = Mathf.MoveTowards(alfa, 1f, fadeSpeed * Time.deltaTime);
            //変更した透明度を画像に反映させる関数を呼ぶ
            SetColor();
            yield return null;
            if (alfa >= 1)
            {
                SceneManager.LoadScene(afterScene);
                StopCoroutine(fadeOutCoroutine);
            }
        }
    }
    //画像に色を代入する関数
    void SetColor()
    {
        fadeImage.color = new Color(red, green, blue, alfa);
    }
    //色の値を設定するための関数
    public void SetRGBA(int r, int g, int b, int a)
    {
        red = r;
        green = g;
        blue = b;
        alfa = a;
    }
}

感想

実際に処理を変えてみるとシーン内に余り物を置いていないので劇的に変わったとまではいきませんが、
シーンを切り替えたときにFPS値の減少が少なくなっていました。
ほぼ何も置いていないシーンで変化が起きたということは、もっと大きなゲームになると、とてつもない影響が出るのではないかと思いました。
これからゲームを作るときには処理をすぐにプログラムしてこれでいいやとするのではなく、もっといい処理方法がないか考えてプログラムしていこうと思います。