i-school - const キーワードと ConstData クラスの作成例
 ゲーム内に利用する情報のうち、定数を決めて扱いたい場合には const キーワードを使って表現できます。

 例えば、アイテムの最大所持数、お金の最大値というように、ゲーム全体で共通の値を設定して管理したい場合、
こういったゲーム内の大切な値を別々のクラスに書いてしまうと、どのクラスで設定しているかわかりにくく、管理しにくくなります。

 その場合、よく利用するのが、const キーワードを使い、定数のデータのみを集めた ConstData という形式のクラスを作成して運用する方法です。



 まずはサンプルコードを提示します。

<ConstData.cs>
public static class ConstData
{
    public const int MAX_EXP = 10000;
    public const int MAX_LEVEL = 100;

    public const string ATTACK_PARAMETER  = "Attack";   // アニメーションの Parameter 名用の各変数をこちらで用意
    public const string DOWN_PARAMETER = "Down";

    // TODO 他にもあれば追記する

}



 まず、クラスには static 修飾子をつけておき、インスタンスが自動的に1つだけ作られるようにします。

public static class ConstData

 クラスの継承は不要のため、MonoBehaviour クラスを削除します。また、using の情報も不要なので削除して構いません。
そのためこのクラスは、常に1つしかないので、変数に代入しなくても利用できるクラスになります。



 各変数には所定の書式があります。

public const 

 ここまでが共通の書式です。public 修飾子と const キーワードをセットで最初に記述します。
このようにすることで、次に宣言する変数の値を定数化し、どのクラスからでも同じ値が取り出せるようにします。



 const キーワードに利用できる型には制限があります。
下記は C# マニュアルからの抜粋です。

const キーワードは、定数フィールドまたはローカル定数を宣言するために使用します。
定数フィールドとローカルは変数でないため、変更できません。

定数には、数字、ブール値、文字列、または null 参照が含まれます。 

 以上のことから、数字(int、long、float、double 型など)、ブール値(bool)、文字列(string) が型として利用可能です。


参考サイト
MicroSoft
const (C# リファレンス)



 最後に変数です。
 
 変数の宣言における変数名ですが、const キーワードで利用する変数は慣例として、
すべて大文字で書いて、単語が変わる部分ではアンダーバーを使うという命名規則があります。


public const int MAX_EXP = 10000;
public const string ATTACK_PARAMETER  = "Attack";

 通常の変数と違って、小文字は使いません。単語の区切りで大文字にできないので、代わりにアンダーバーを使います。
この書き方は、すべて大文字である時点で「あ、これは定数が入っている変数だな」と誰もが判断できるようにするための、共通の書式です。
C# 以外でも一般的に利用されています。

 そして、const キーワードは定数値を設定する役目を持っているので、宣言と同時に必ず = を使って値を代入し、初期化を行います
初期化をしないとエラーが出ます。そして、この値は定数値となるため、ゲーム内では一切変更が出来ません。

 readonly キーワードもある意味で定数値を扱えますが、こちらは初期化するタイミングがコンストラクタメソッドでも許可されている部分が違います。
(変数の宣言時に、必ず = で初期化しなくてもいいということになっています)



 このような定数を専用のクラスとして作っておくと、どのクラスからでも【static クラス名.変数名】でアクセスできます。

ConstData.ATTACK_PARAMETER;

 こんな形で ConstData 内の static 変数にアクセスすることが出来ます。
また、変数名がすべて大文字であるため、「ここには定数で設定されている情報が使われているな」と誰もが判断がしやすくなります。



 ConstData クラスは作成しておくと便利なので、今後作るゲームに採用していただいてもいいかもしれません。

 例えばこの例のように、アニメーションの遷移の命令には引数の指定に文字列を使いますが、打ち間違えが怖いので、それを ConstData に登録して事前に用意しておく形です。
そうすれば、毎回 ConstData から情報をもらえるので、文字を打ち間違える心配が無くなります。