そらい研究室

関心のある物事について、少し深堀りして解説しています。

MENU

Unity RPGでのステータスを列挙型(enum)で作る

ここでは、列挙型変数を使って「状態異常」や「キャラクターの職業別パラメータ」をつくるプログラムを紹介する。

列挙型変数は、RPGのステータスやパラメーター、種類などのような複数の要素をまとめて管理するときに使える変数で、インスタンスとして作成するオブジェクトを区別するのにも使える。

ちなみに列挙型変数として作成した変数はインスペクタからドロップダウンリストで選択できるので、複数のゲームオブジェクトにまとめて同じスクリプトを割り当てておけば、Unityエディタのインスペクター上で簡単に「ゲームオブジェクトごとに違うパラメータを割り当てる」ことができる。

状態異常のステータスをつくるサンプル

ゲームでよくある「キャラクターの状態異常ステータス」も、列挙型変数でつくることができる。

f:id:kakeru-log:20211216163523p:plain

下のUnityC#用のプログラムでは、「異常なし、どく、まひ、やけど」の4つから一つがキャラクターに適用され、そのステータスが現在のステータスとしてが表示される。

public enum CharactorStatus //列挙型変数CharactorStatusを作成
{   
//NONE(なし)、POISON(どく)、PARALYSIS(まひ)、BURN(やけど)の4つを登録
    NONE,
    POISON,
    PARALYSIS,
    BURN,    

}

//各列挙型変数を利用するための「変数」を宣言
//列挙型変数を型とし、新しく変数を作っている

public CharactorStatus charactorStatus;

void Start()
{
    //ここでは、仮として「どく状態」に設定
    charactorStatus = CharactorStatus.POISON; 

    //ここからは新しく作った変数charactorStatusの値と
    //列挙型変数CharactorStatus内の値の一致をチェック

    if (charactorStatus==CharactorStatus.NONE) { 
        Debug.Log("現在のステータス:「状態異常なし」");
    }
    else if (charactorStatus == CharactorStatus.POISON)
    {
        Debug.Log("現在のステータス:「どく」");
    }
    else if(charactorStatus == CharactorStatus.PARALYSIS)
    {
        Debug.Log("現在のステータス:「まひ」");
    }
    else if(charactorStatus == CharactorStatus.BURN)
    {
        Debug.Log("現在のステータス:「やけど」");
    }
}

f:id:kakeru-log:20211216162804p:plain

キャラクターのパラメータ設定を行うサンプル

勇者、魔法使いのに種類のキャラクターのパラメータを作成している。サンプルでは勇者のパラメータが適用されるようにしているが、「charactorSelect = CharactorSelect.HERO;」の行を取り除けばインスペクターウィンドウでキャラクターを選択し、パラメータを適用できるので、便利。

public enum CharactorSelect//列挙型変数CharactorSelect(キャラセレ)を作成
{

    HERO,//勇者
    MAGE,//魔法使い
}

public enum HeroStatus //列挙型変数HeroStatus(勇者)を作成
{
    HP = 12,
    MP = 12,
    ATK = 8,
    DF = 4,
}
public enum MageStatus //列挙型変数MageStatu(魔法使い)を作成
{
    HP = 10,
    MP = 20,
    ATK = 6,
    DF = 3,
}

//各列挙型変数を利用するための「変数」を宣言

public CharactorSelect charactorSelect;
HeroStatus heroStatus;
MageStatus mageStatus;

//キャラクター別パラメータのロード先変数を宣言
string job;
int hp,mp,atk,df = 0;

void Start()
{
    charactorSelect = CharactorSelect.HERO;//サンプルでは、勇者を選択
   //勇者が選ばれた場合のステータス読み込み
    if (charactorSelect == CharactorSelect.HERO) 
    {
        job = "勇者";
        //列挙型変数に設定した数値は、int型にキャスト変換する必要がある
        hp = (int)HeroStatus.HP; 
        mp = (int)HeroStatus.MP;
        atk = (int)HeroStatus.ATK;
        df = (int)HeroStatus.DF;
    }

    if (charactorSelect == CharactorSelect.MAGE) 
    //魔法使いが選ばれた場合のステータス読み込み
    {
        job = "魔法使い";
        hp = (int)MageStatus.HP;
        mp = (int)MageStatus.MP;
        atk = (int)MageStatus.ATK;
        df = (int)MageStatus.DF;
    }

    //各ステータス表示
    Debug.Log
    (
        "職業:" + job +
        "HP:" + hp + "\n" +
        "MP:" + mp + "\n" +
        "ATK:" + atk + "\n" +
        "DF:" + df + "\n"
    ); //Unityの仕様でコンソールのログでは一部見切れるかも
}