【Unity小技集 Vol.002】Class間でenum型(列挙型)変数を活用する方法

【Unity小技集 Vol.002】Class間でenum型(列挙型)変数を活用する方法

 enum型(列挙型)変数とは、事前に代入される値が特定される変数を扱う際に、その値を指定し活用する変数です。
例えば信号{赤,黄,青}、移動方向{上,下,左,右}などのようなものです。

 Unityでは通常class間で変数を活用する際、アクセス修飾子に「Public」を指定します。
使用するClass(Script)側では、まずFind関数やGetConponent関数を使ってこの変数をもつClassを取得、そこでようやく対象の変数を使うことができます。
 しかしenum型の変数については若干挙動が違います。

今回はこのenmu型の変数をUnityのClass間、つまりScript間で使用する方法について、サンプルを交えて説明します。
Unityで新たなプロジェクトを立ち上げ、事前準備として以下のものを用意します。

  1. GemeObject「Cube」  移動するゲームオブジェクトとなります
  2. GemeObject「Manager」 CreateEmptyでからのオブジェクトを生成
  3. Script「CubeController」 Cubeの動きを管理するスクリプトファイル
  4. Script「GameMangager」 enum型の変数を持たせるスクリプトファイル

3,のスクリプトファイル「CubeController」を1,のCubeに、4,のスクリプトファイル「GameMangager」を2,のManager にアタッチします。

【Unity小技集 Vol.002】Class間でenum型(列挙型)変数を活用する方法

今回はGameMangagerに「Mode」というenum型変数を持たせ、その値に応じCubeControllerに作成する変数「speed」の値を変更させたいと思います。対応表は以下の通りです。

まずは「GameMangager」に以下のコードを記述します。

public class GameManager : MonoBehaviour
{
public enum Mode  { HI, MIDDLE, LOW }  //① enum型変数を宣言
public Mode speedMode;                 //②Modeを使うための変数

void ModeChange()                      //③Modeの値を変更する関数 
{
    if (Input.GetKeyDown(KeyCode.H))
        speedMode = Mode.HI;
    if (Input.GetKeyDown(KeyCode.M)) 
        speedMode = Mode.MIDDLE; 
    if (Input.GetKeyDown(KeyCode.L))
        speedMode = Mode.LOW; 
}
void Update() //④ 
{
    ModeChange(); 
}
}

このスクリプトファイルの内容は

① enum型の変数「Mode」の宣言と要素登録

②変数「Mode」を使うための変数「speedMode」を宣言

③関数「ModeChange()」を宣言。 
 これはキーを押すことによって、変数「speedMode」の値を変更するも関数

④Update()関数 の中で③で作った関数を呼び出す

この段階で、GameManager のInspectorには以下のように、SpeedModeの要素がドロップダウンリストとして表示されます。

【Unity小技集 Vol.002】Class間でenum型(列挙型)変数を活用する方法

続いて「CubeController」に次のコードを記述します。

public class CubeController : MonoBehaviour
{
float speed;                //①移動速度を管理する変数 
GameManager gameManager;    //②GameManager を代入する関数

void Move()                 //③Cubeを移動させる関数 
{
    if (Input.GetKey(KeyCode.RightArrow))
        transform.position += new Vector3(speed*0.01f, 0, 0);
    if (Input.GetKey(KeyCode.LeftArrow))
        transform.position += new Vector3(-speed*0.01f, 0, 0); 
}

void ChangeSpeed()           //④speedMode に応じてspeedを変える関数 
{
    if (gameManager.speedMode == GameManager.Mode.HI)
        speed = 10;
    if (gameManager.speedMode == GameManager.Mode.MIDDLE)
        speed = 5;
    if (gameManager.speedMode == GameManager.Mode.LOW)
        speed = 1; 
}

void Start() //⑤ 
{
    gameManager = GameObject.Find("Manager").GetComponent<GameManager>(); 
    gameManager.speedMode = GameManager.Mode.MIDDLE;
}
void Update() //⑥ 
{
    Move(); ChangeSpeed();
}
}

このスクリプトファイルでは

①Cubeの速度を管理する変数「speed」を宣言

②スクリプトファイル「GameManager(クラス)」を代入する変数「gameManager」を宣言

③Cubeの移動を管理する関数「Move()」を宣言
右キーを押すと、スピード×0.01ずつ X座標方向(右へ)へ移動
左キーを押すと、ースピード×0.01ずつ X座標方向(左へ)へ移動

④関数「ChangeSpeed()」を宣言、gameManagerのspeedModeを参照し、Modeが HI なら変数「speed」を10に変更。
ここでポイントとなるのが、Modeを呼び出す際に「GameMangager」クラスを指定すること。
変数「gameManager」ではないですよ。
「Static」の使い方に似ていますね。
同様にModeが「MIDDOLE、LOW」の時の動きを指定します。

⑤Start()関数では、Find()関数,GetConponent()関数を使って、GameMangager を取得。
 さらに変数「speedMode」の初期値を指定しています。

⑥Update()関数ではMove()関数、 ChangeSpeed()関数を発動しています。

これでサンプルは完成です。起動させ、左右矢印キーを押して移動、さらにHキー、Mキー、Lキーを押したときに速度が変更されることを確認してみましょう。

教室では実際に通って頂いての授業の他、Unityのオンライン授業やオンラインサポートも行っております。お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。
お問い合わせは こちら から。
体験授業のお申込みは こちら から。

無料体験授業 いつでも受け付けています!

体験授業を受ける子供

スクラッチ、Unityでちょっとしたゲームを作ってみる

HTMLやCSSでWebサイト作成体験

初めてパソコンやタブレットに触れてみる

エクセルやワード、パワーポイントの学習をちょっと体験

まずは1時間程度の無料体験授業を受けて、教室の雰囲気や講師の人柄に触れて頂き、ご自身、お子様に合うのかどうかご確認ください!