はなちるのマイノート

Unityをメインとした技術ブログ。自分らしくまったりやっていきたいと思いますー!

【Unity】delegateを使ってswitch文によるごちゃごちゃをなくす

はじめに

Unityでプログラムをしていて、このようになるケースは多々あるのではないでしょうか?

using UnityEngine;

public class Hoge : MonoBehaviour {

    public void Fuga(int number)
    {
        switch (number)
        {
            case 0:
                func0();
                break;
            case 1:
                func1();
                break;
            case 2:
                func2();
                break;
            case 3:
                func3();
                break;
        }
    }

    private void func0()
    {
        Debug.Log("func0");
    }

    private void func1()
    {
        Debug.Log("func1");
    }

    private void func2()
    {
        Debug.Log("func2");
    }

    private void func3()
    {
        Debug.Log("func3");
    }

}


こうなってしまう対策をUnityの公式が紹介してくださっていました。
https://www.youtube.com/watch?v=HwD7npYb9_k

f:id:hanaaaaaachiru:20190312180140p:plain

この画像のようにdelegateを用いて実現してみたいと思います!

そもそもdelegateって?

delegate関数を入れられる変数と表現される事が多いようです。

先人の方々が分かりやすく説明をしてくれているのでそちらを参照してみてください。
デリゲート(Delegate)やイベント(Event)とは【C#】 - (:3[kanのメモ帳]
[C#] デリゲート(delegate)とはなんぞや – gomokulog

実際に試してみる

今回はActionデリゲートを用いて実現していきます。
最初にコードをこのように書き換えてみました。

using UnityEngine;
using System;       //これを忘れずに書く

public class Hoge : MonoBehaviour {

    private Action[] _action;

    private void Start()
    {
        _action = new Action[4] { func0, func1, func2, func3 };

    }

    private void Fuga(int number)
    {
        _action[number]();
    }

    private void func0()
    {
        Debug.Log("func0");
    }

    private void func1()
    {
        Debug.Log("func1");
    }

    private void func2()
    {
        Debug.Log("func2");
    }

    private void func3()
    {
        Debug.Log("func3");
    }

}

これでかなりスッキリしたのではないのでしょうか。

注意点

気にする必要はない場合がほとんどだと思いますが、Actionデリゲートでは余計なGCを発生させてしまうようです。
baba-s.hatenablog.com

一応参考程度になれば幸いです。

さいごに

今回はここまで!