top of page

【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のスクリプトファイルを1,Cubeに、4のスクリプトファイルを2,Manager にアタッチします。

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

対応表は以下の通りです。

enam型変数、class間の活用方法

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

 

public class GameManager : MonoBehaviour

{

public enum Mode //①

{

HI,

MIDDLE,

LOW

}

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の要素がドロップダウンリストとして表示されます。

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

 

public class CubeController : MonoBehaviour

{

float speed; //①移動速度を管理する変数

GameManager gameManager; //②GameManager を代入する関数


private 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のオンライン授業やオンラインサポートも行っております。

お困りごとのある方、ご興味がある方は、ぜひお問い合わせください。


お問い合わせは こちら から。

体験授業のお申込みは こちら から。

Kommentare


bottom of page