Unityに関連する記事です

 Enumの種類が増えてきた場合に、その都度変換処理を追加するのが大変(面倒)だったので
ジェネリクスを利用して、文字列を<T>に指定したenum に変換するユーティリティクラスを作成しました。

 こちらがソースです。(Githubも同じです)
https://github.com/mitsuruyamaura/ConvertEnumType


using System;

/// <summary>
/// string => enumへの変換用クラス
/// </summary>
public class ConvertEnumType {

    /// <summary>
    /// stringを指定したタイプのEnumに変換する
    /// </summary>
    public static IEnum FromString<IEnum>(string str) where IEnum : struct {
        return (IEnum)Enum.Parse(typeof(IEnum), str, true);
    }
}

ポイントとしましては、
・変換メソッドの呼び出し時、Enum.Parseのように2回同じEnumの種類を指定する必要がないこと。
・文字列の大文字・小文字の区別なくEnumに変換できること。
・文字列をEnumに変換して配列・リストにする場合にはLinqを使うと1行で書けること

 などでしょうか。whereでIEnumを指定していますが、構造体(struct)だと入ってしまうため注意が必要です。
とはいえ、これは戻り値のある処理ですので、左辺の値が戻る値と異なる場合にはコンパイル出来ずにエラーが出ます。使用間違いはないでしょう。

 これを踏まえて、サンプルクラスを作成してみます。

using System.Collections.Generic;
using UnityEngine;
using System.Linq;

public class EnumTest : MonoBehaviour {

  // Test用にEnumを3種類用意
    public enum TIME_TYPE {
        MORNING,
        AFTERNOON,
        EVENING,
        NIGHT,
    }

    public enum DAY_TYPE {
        SUNDAY,
        MANDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY
    }

    public enum SEASON_TYPE {
        SPRING,
        SUMMER,
        AUTUMN,
        WINTER
    }

    // Debug用にpublicで。インスペクター上で確認できるように
    public DAY_TYPE dayType;
    public TIME_TYPE[] timeTypeArray;
    public List<SEASON_TYPE> seasonTypeList = new List<SEASON_TYPE>();

    // 使用例
    void Start() {
        // 文字列を引数で渡した種類のEnumに変換
        string day = "friday";
        dayType = ConvertEnumType.FromString<DAY_TYPE>(day);

        // 配列用に文字列を用意
        string times = "NIGHT,afternoon,Morning";

        // この1行で上記のEnum.Parseと配列化が出来る(Select(x => (x))の引数は省略できます)
        timeTypeArray = times.Split(',').Select(ConvertEnumType.FromString<TIME_TYPE>).ToArray();

        // Listの場合も同じ
        // List用に文字列を用意して、変換
        string seasons = "summer,Winter,spring,AUTUMN";
        seasonTypeList = seasons.Split(',').Select(ConvertEnumType.FromString<SEASON_TYPE>).ToList();
    }
}

こちらが実行前。


こちらが実行後です。


 いままでJsonで取得した文字列をEnum化して配列にする際は、以下のように書いていましたので、今回のメソッドを用意することで、処理も非常にすっきりしました。

    // 配列用に文字列を用意
    string times = "NIGHT,afternoon,Morning";

    // 文字列を分割して、stringの配列を作成
    string[] strArray = timeArray.Split(',').ToArray();

    // Enum用の配列を初期化
    timeTypeArray = new TIME_TYPE[strArray.Length];

    // stringの配列をEnumに変換して配列に(Linq使わない場合)
    for (int i = 0; i < strArray.Length; i++) {
        timeTypeArray[i] = (TIME_TYPE)Enum.Parse(typeof(TIME_TYPE), strArray[i]);
    }

 以上になります。

なおこちらは、teratailにて私が質問・作成させて頂いたものを、改めて作りなおしたものです。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Menu



技術/知識(実装例)

2Dおはじきゲーム(発展編)

2D強制横スクロールアクション(発展編)

3Dダイビングアクション(発展編)

2Dタップシューティング(拡張編)

レースゲーム(抜粋)

2D放置ゲーム(発展編)

3Dレールガンシューティング(応用編)

3D脱出ゲーム(抜粋)

2Dリアルタイムストラテジー

2Dトップビューアドベンチャー(宴アセット使用)

3Dタップアクション(NavMeshAgent 使用)

2Dトップビューアクション(カエルの為に〜、ボコスカウォーズ風)

VideoPlayer イベント連動の実装例

VideoPlayer リスト内からムービー再生の実装例(発展)

AR 画像付きオブジェクト生成の実装例

AR リスト内から生成の実装例(発展)

private



このサイト内の作品はユニティちゃんライセンス条項の元に提供されています。

管理人/副管理人のみ編集できます