[第15回] 列挙型(Enum)の使い方を学ぶ|Unityで学ぶC#入門
「Unityで学ぶC#入門」の連載第14回は「抽象クラス(abstract)の使い方を学ぶ」でした。
第15回の今回は列挙型(Enum)の使い方を学びます。
列挙型を扱えるようになるとシンプルかつわかりやすいプログラムを記述できるようになります。
使い方が簡単な割に効果は絶大ですのでぜひご参考ください。
列挙型とは
列挙型とは、名前付きの固有の定数で構成される型のことで、簡単にいうとグループ化された定数のことです。
よく列挙型を説明するときに用いられる例が曜日です。
曜日は日〜土までの7つの定数で構成されています。曜日を扱う変数を「day」としたとすると、この変数に入る可能性がある文字列もしくは数字はどのようなものが考えられるでしょうか。この変数dayに日曜日の情報を持たせたいと考えたときを例に考えてみましょう。
「Sun」と格納するかもしれませんし、一方では「日」と日本語で格納するかもしれません。
変数dayを条件にして処理をさせたいときに、これでは困ってしまいます。if文の条件を「Sun」にするべきか「日」にするべきなのか毎回悩んでいたらキリがありません。そこで登場するのが列挙型です。
あらかじめ曜日をまとめた列挙型「Day」を準備します。
これによって変数dayに入ることのできる値をSun~Satの形に限定することができます。
if文での比較もDay型で比較することができるので大変便利です。
列挙型(Enum)の使い方(RPG編)
列挙型(Enum)の使い方をRPGの職業を例に学んでいきましょう。
列挙型のJobを作成して、各プレーヤーが名前と職業の情報を持っているという状況を作成していきます。
イメージは以下の通りです。
まずは職業の情報をまとめた列挙型変数を持つクラス「Job.cs」を作成します。
列挙型を一つのファイルとしてまとめておくことでほかのクラスに影響を及ぼさずに列挙型を使用することができます。
1 2 3 4 5 6 7 |
public enum Job { Brave, Mage, Monk, Warrior } |
これで列挙型のJobを作成することができました。
列挙型は「class」の代わりに「enum」とすることで作成することができます。
次にJobの情報をもつクラス「Person.cs」を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Person { private string name; private Job job; public Person(string name, Job job) { this.name = name; this.job = job; switch (this.job) { case Job.Brave: Debug.Log("職業が勇者の" + this.name + "が誕生した!"); break; case Job.Mage: Debug.Log("職業が魔法使いの" + this.name + "が誕生した!"); break; case Job.Monk: Debug.Log("職業が僧侶の" + this.name + "が誕生した!"); break; case Job.Warrior: Debug.Log("職業が戦士の" + this.name + "が誕生した!"); break; default: Debug.Log("職業が存在しません"); break; } } } |
これで名前と職業をもつPersonを作成することができます。
列挙型は「列挙型 変数名」で作成することができるのでとても簡単に使用することができます。
最後に例に挙げたキャラクターを作成する「GameController.cs」を作成します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameController : MonoBehaviour { private Person person1; private Person person2; private Person person3; private Person person4; private void Awake() { person1 = new Person("Hanako", Job.Brave); person2 = new Person("Nadeshiko", Job.Mage); person3 = new Person("Taro", Job.Monk); person4 = new Person("Yamato", Job.Warrior); } } |
これで4人のキャラクターを生み出すことができます。
任意のオブジェクトにGameController.csをアタッチして実行してみましょう。
この例を用いて列挙型の特徴をみていきましょう。
enumでは定義した値以外を使用することができません。
クラスPersonのもつ変数jobに列挙型に登録されていない職業を入れるとどうなるのでしょうか。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class GameController : MonoBehaviour { private Person person1; private Person person2; private Person person3; private Person person4; private Person person5; private void Awake() { person1 = new Person("Hanako", Job.Brave); person2 = new Person("Nadeshiko", Job.Mage); person3 = new Person("Taro", Job.Monk); person4 = new Person("Yamato", Job.Warrior); // 職業ProgrammerのFuruiを入れてみる person5 = new Person("Furui", Job.Programmer); } } |
上記のようにJobに存在しない職業「Programmer」をPersonのコンストラクタに投げると以下のようなエラーが発生します。
1 |
'Job' does not contain a definition for 'Programmer' |
RPGの世界に存在しない職業「Programmer」を持つキャラクターのインスタンスを生成することができません。
これによって想定外の値が入力されることを防ぐことができます。
また、クラスPersonのなかで使用しているようにSwitch文を使用することで分岐をシンプルかつわかりやすく記述することができます。
さらに、列挙型Jobの中身が変更されるとクラスPersonでエラーが発生するのですぐに対応することができ、保守性も上がります。
列挙型のそのほかの使用方法
列挙型は数値で管理することもできます。以下のようにプログラムを書き換えてみましょう。
1 2 3 4 5 6 7 8 9 |
public enum Job { // 1~10は職業A Brave = 1, Mage = 2, // 11~20は職業B Monk = 11, Warrior = 12 } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Person { private string name; private Job job; public Person(string name, Job job) { this.name = name; this.job = job; switch (this.job) { case Job.Brave: Debug.Log("職業が勇者の" + this.name + "が誕生した!"); break; case Job.Mage: Debug.Log("職業が魔法使いの" + this.name + "が誕生した!"); break; case Job.Monk: Debug.Log("職業が僧侶の" + this.name + "が誕生した!"); break; case Job.Warrior: Debug.Log("職業が戦士の" + this.name + "が誕生した!"); break; default: Debug.Log("職業が存在しません"); break; } if ((int)this.job < 11) { Debug.Log("職業分類はAです"); } else if((int)this.job < 21) { Debug.Log("職業分類はBです"); } } } |
以上のように数値を定義することもできるので、列挙型の中でも分類をすることができるという特徴を持っています。
また、列挙型の値をそのまま文字列として出力することもできます。
クラスPersonを以下のように書き換えてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Person { private string name; private Job job; public Person(string name, Job job) { this.name = name; this.job = job; Debug.Log("職業が" + this.job.ToString() + "の" + this.name + "が誕生した!"); } } |
「ToString()」を利用することでenumで登録した文字列をそのまま使用することができます。
まとめ
いかがでしたでしょうか。
今回は列挙型について学んできました。
使用方法が簡単な割に効果が大きいことがおわかりいただけだでしょうか。
他の回の記事について気になる方はこちらをクリック
そのほかの参考記事)enum (C# リファレンス)(Microsoft公式)
この記事はいかがでしたか?
もし「参考になった」「面白かった」という場合は、応援シェアお願いします!