Tsuの雑記¯\_(ツ)_/¯

主に製作メモ・備忘録として使用。製作したアプリのリンクもあります。

【Unity】列挙型で条件分岐を明解かつ高速に【C#】

if 文や switch 文の条件には,文字列stringではなく列挙型enumを使用しましょう。

以下,実例を挙げて御説明いたします。

(本稿は,過去記事の補足です)

(Unity 2018.3.0f2)

tsu-games.hatenablog.com

上に挙げた記事では,文字列を定義する事によってミスを減らせると御説明いたしました。

しかし,例として掲載したコードには改善点があります。

まずは,当該記事中のコードを御覧ください。

文字列がswanならwhite,crowならblackと返すプログラムです。

文字列で条件分岐する場合

string swan = "swan";
string crow = "crow";

void Start()
{
    Color(swan);
    Color(crow);
}

void Color(string bird)
{
    if (bird == swan) {
        Debug.Log("white");
    }
    else
    {
        Debug.Log("black");
    }
}

初めに文字列を定義しておくことで,打ち間違いによるエラーに気付けるという利点があります。

しかし,文字列による条件分岐自体に難点もあります。

それは,「数値による条件分岐よりも処理速度が遅い」という事です。

今回はその欠点を,列挙型enumによって解消します。

それでは,改良後のコードを見ていきましょう。

列挙型で条件分岐する場合

enum Bird
{// 鳥の種類
    swan,
    crow
}

void Start()
{
    Color(Bird.swan);
    Color(Bird.crow);
}

void Color(Bird bird)
{
    if (bird == Bird.swan) {
        Debug.Log("white");
    }
    else
    {
        Debug.Log("black");
    }
}

列挙型内の各要素(列挙子)は文字列に見えますが,内部的には整数として扱われています。

IDEで「Bird.swan = 0」とポップアップ表示されている画像
要素ごとに数値を設定しなければ,0 から順に割り振られる

そのため,文字列での比較よりも速く処理できるのです。

(例えば名簿から「田中太郎」を探すより,「出席番号10番」で探す方が早いのと同じでしょうか。)

以上,過去記事に関する補足でした。

列挙型enumの応用として,以下の記事もお読みいただけると幸いです。

tsu-games.hatenablog.com