【Unity / プログラミング】Enumの拡張機能を使おう!

Enum拡張機能を使ってみよう! Unity
スポンサーリンク

今回はUnityでEnumに拡張機能を持たせることができるらしいので記事を書いてみました。
Enumに関連する処理をまとめて処理することでコードが綺麗になるのでぜひ活用してみてくださいね。

Enum拡張とは

スクリプトを書かれている方にはお馴染みのタイプや種類を定義する時に利用する「Enum」。
実装する時にクラスに関数を用意してそこでタイプごとに処理をすることって多いと思います。

そんな時に知ってると便利な機能「Enum拡張機能」ついて紹介したいと思います!

知ってるとコードの綺麗さが全然違います!

 

キャラクタータイプでのEnum例

例えばキャラクターの種類(タイプ)であれば
人間、鳥、動物などのタイプがあったとすると共通してこんな関数が作りたくなることがあります。

bool IsFlying() // 飛んでいるか

これは文字通り飛行するタイプのキャラクターかを識別するためのクラス内の関数となります。
そしてその関数でタイプ別に「飛行しているか」判定するためには下記のように書くことが多いと思います。

public enum CharacterType{
    Human,
    Bird,
    Animal,
}

public class Character
{
    CharacterType characterType;

    public bool IsFlying()
    {
        switch(characterType)
        {
            case CharacterType.Human:
            case CharacterType.Animal:
                return false;
            case CharacterType.Bird:
                return true;
        }
        return false;
    }
}

処理的にはクラスでキャラクタータイプ(CharacterType)を持っていて、それに応じて「Bird」は「true」を返して、それ以外は「false」を返す形になっています。

ただこの実装には少しあまり良くない点もあります。

 

 

実装の問題点

さきほどの実装だとEnum自体の処理(鳥は飛べる、人は飛べないなど)がCharacterというクラスに依存する形になっていて、Characterクラスがないとこの処理を呼べなくなってしまいます。

ほかにも

  • クラス内がEnumだらけで読みにくいコードになる

といったデメリットがあったりします。

決して綺麗な実装とは言えないかもしれませんね…

そして、それを改善するために今回お伝えする「Enumの拡張機能」がとても便利だったりします。

 

 

Enum拡張機能の実装方法

では実際に拡張機能を実装していきたいと思います。

ここではシンプルな処理を例にお伝えしていきます

 

 

「すでにある関数」を拡張側に移行

ではまず先ほど用意した「IsFlying」という判定処理を拡張機能に移行してみます。

public enum CharacterType{
    Human,
    Bird,
    Animal,
}
public static partial class EnumExtend
{
    public static bool IsFlying( this CharacterType characterType )
    {
        switch(characterType)
        {
            case CharacterType.Human:
            case CharacterType.Animal:
                return false;
            case CharacterType.Bird:
                return true;
        }
        return false;
    }
}

実装方法としては

  • 「public static partial class EnumExtend」を記述
  • 「this 〇〇(enum名)」という引数を持った関数を用意して実装

となります。

これだけでEnum変数さえあれば
どこでもこの関数を呼ぶことができます!

 

Enum拡張した関数を呼ぶ

さっそく拡張した関数を呼んでみたいと思います。
呼び方は非常に簡単で下記のようになります。

characterType.IsFlying()

クラスのメンバ関数や変数のように呼べます!

そして実際に呼び出し処理クラスに仮で入れてみるとこんな感じになります。

public class Character
{
    CharacterType characterType;

    void Update()
    {
        if(characterType.IsFlying())
        {
            // 飛んでいるキャラの処理
        }
        else
        {
            // 飛んでないキャラの処理
        }
    }
}

処理としては「Update」内で飛行タイプのキャラクターとそうでないものを
分けているだけとなります。

最初に比べるとクラス内もすっきりしましたね!

 

活動内容のPR

下記が本サイトでの活動内容となります。

ゲーム開発について発信中!

個人でオンラインゲームを開発しています!

大隕石 - メテオシューティング

大連鎖シューティング! 大隕石リリース!

 

最後に

いかがでしたでしょうか?

今回はEnumの拡張について紹介してみました。
これを使うことによってよりわかりやすくミスの少ないコードを作ることができそうです。

今後は積極的に使っていきたいとおもいます!

では今回は以上となります。
この度はここまでお読みいただきありがとうございました。

 

コメント

スポンサーリンク
タイトルとURLをコピーしました