今回はUnityでC#スクリプトでEnumの有用性やEnum要素でループ処理する方法を紹介したいと思います。プログラミングのコツやバグの少ないコードを書きたい方はぜひ参考にしてみてください。
Enum(イーナム)とは
C#でスクリプトを書くときに「Enum」という機能を使うことがあります。
日本語では列挙型と呼ばれるデータ型の一つで関連性の高いものをまとめて定義できるものとなります。
別スクリプトにするほどでもないけど
かんたんに種類分けする時に利用することが多いです
ゲームのキャラクターで定義してみる
例えばゲームのキャラクターの種類を分類するEnumを用意すると
enum Character { Player, // プレイヤー Enemy, // 敵 Boss // ボス }
if(characterType == Character.Boss) { // ボス場合の処理 }
このようにソースコードを見た瞬間に何をしているかわかりやすいのがEnumを利用するメリットの一つです
内部的には数値型
実はEnumは内部的には数値として持っています。
さきほどの例の場合は下記のようになります。
Character.Player・・・0Character.Enemy・・・1Character.Boss・・・2
if((int)characterType == 2) { // ボスの処理 }
「じゃあ別にEnumなんていらないじゃん」という人も多いかもしれませんがバグの温床になりやすいマジックナンバーを防ぐために必要だったりします
メリット:マジックナンバーを防げる
プログラムではよく下記のように言われることがあります。
マジックナンバーは絶対ダメ
マジックナンバーとは「何かしらの意味のある数値をそのままソースコードに書き込む」ことを言います。
「魔法の数字」と可愛らしい名前をしていますが、開発ではバグを大量発生させる悪魔といっても過言ではないです笑
マジックナンバーある・なしで比較
さきほどお伝えした通りなのですが
先述の2つのソースコードをコメントを消して比較してみましょう。
// パターン1 if((int)characterType == 2) { } // パターン2 if(characterType == Character.Boss) { }
いかがでしょうか?
この場合、パターン2はコメントがなくても読みやすいですね。
ソースコードが少ないとそこまで恩恵を感じられませんが、これが開発終盤になってくるとかなり効果を発揮します!
私は普段からコメントがなくても読めるコードを推進しているのですが、これがまさに良い例ですね。
Enumをループ処理をする方法
ほんとたまーに使います
foreach (Character character in Enum.GetValues(typeof(Character))) { // 各キャラ種への処理 }
処理的にはEnum.GetValues()メソッドを使うことで、enum一覧を配列として取得することができます。
受け取った配列で「foreach」をかけてるということですね!
「foreach」で処理するメリット
Enumをループ処理にすると何が便利かというと
例えば先程の定義に「Friend(仲間)」という種類を追加した場合に処理を追記せずに実行することができます。
ゲーム開発は流動的(仕様が変わる)なので
こういう実装をしておくと後々楽をすることができますね
活動内容のPR
下記が本サイトでの活動内容となります。
終わりに
いかがでしたでしょうか。
今回はC#スクリプトでよく使う「Enum」と「Enumでループ処理」をする方法を紹介してみました。
特にEnumを使う意義についてはプログラム初学者が失敗するケースを多く見てきたのでぜひ使うことを癖付けるようにすると良いかと思います。
みんなで開発するプロジェクトでは迷惑をかけてしまうので注意したいところ!
では今回はここまでとなります。
ここまでお読みいただきありがとうございました。
また本サイトではゲーム開発や日常で気になったことや英語学習などゲーム開発者である私が発信しているサイトとなります。もし興味がありましたら画面左下のベルマークから購読していただけますと幸いです。
コメント