【Unity】コンストラクタとは?クラスのインスタンス生成時に行う処理

コンストラクタとは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「C#で使えるコンストラクタってなに?」

「コンストラクタはどうやって使うの?」

というお悩みの方に向けた内容となっています。

Unityのプログラミング言語であるC#では、クラスの中でコンストラクタというものを作ることができます。

このコンストラクタとは、クラスのインスタンスが生成された際に、必ず実行したい処理を行うことができる仕組みです。

そして、コンストラクタを使っておくことで、初期値の設定忘れを防ぐことができるので、非常に便利です。

そこで、このページでは、UnityのC#で使うことができるコンストラクタについて、どういうものなのか、また使い方までをまとめていきます。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

コンストラクタとは?

まずは、コンストラクタがどういうものなのかを紹介していきます。

クラスのインスタンス生成時に必ず実行される処理

コンストラクタとは、クラスのインスタンスが生成された時に、実行することができる処理のことです。

そもそもクラスというのは作っただけでは実行されないため、クラス型の変数を作りその中にインスタンスを生成して入れてあげることで、そのクラスを使うことができます。

そして、クラスの中でコンストラクタを作って処理を書いておくことで、このインスタンスを生成した際に、その中の処理が必ず実行されるようになります。

例えば、Playerというクラスを作り、その中で変数hpを100にするというコンストラクタを作っておくことで、Player型のインスタンスを生成した時に、プレイヤーのhpの変数に自動的に100の値を入れて生成することができます。

初期処理の忘れを防ぐことができる

コンストラクタを設定しておくことで、インスタンス生成時に実行しておきたい処理の忘れを防ぐことができるというメリットがあります。

このコンストラクタはメソッドと同じように、引数で値を受け取るという仕組みを作ることができます。

そして、引数付きのコンストラクタを設定した場合、インスタンスを生成する際に指定した引数が記述されていないと、エラーが発生することになります。

例えば、先ほどのPlayerクラスで、変数nameと変数hpを必ず指定したいという場合に、Playerクラスに引数付きのコンストラクタを設定しておくことで、インスタンス生成時にnameとhpを引数で指定しないと、エラーが発生し入力の忘れを防ぐことができます。

MonoBehaviourを継承するクラスでは使わない

ここまでコンストラクタについて紹介していきましたが、Unityで使う際の注意点として、MonoBehaviourを継承しているクラスでは使わないようにしましょう。

Unityでは、MonoBehaviourを継承したクラスは特定のオブジェクトに紐づけて使用することになります。

実は、コンストラクタというのは、newキーワードでインスタンスが生成される際に、実行される仕組みになっていますが、MonoBehaviourを継承したクラスでは、このnewキーワードを使いません。

そのため、MonoBehaviourを継承しているクラスでは、コンストラクタを使うことができなくなっています。

もし、オブジェクト生成時に何かしらの処理を実行したい場合は、MonoBehaviourクラスで定義されているStartメソッドAwakeメソッドを使うようにしましょう。

StartメソッドもAwakeメソッドも、どちらもオブジェクトが生成された際に実行されるメソッドで、Awakeメソッドの方がStartメソッドよりも早く処理が行われます。

コンストラクタの使い方

ここからは、コンストラクタの使い方について紹介していきます。

クラス名と同じ名前でコンストラクタを作る

コンストラクタを作る際は、クラス名と同じ名前を使って以下のように作っていきます。

public class クラス名
{
    public コンストラクタ名()
    {
        // コンストラクタの処理内容を記述 //
    }
}

上記は、クラスの中の3行目でクラス名と同じ名前のコンストラクタを作っていて、このクラスのインスタンスが生成された際は、コンストラクタの中に書かれている処理が必ず実行されることになります。

また、コンストラクタに引数を設定する場合は、以下のように記述します。

public class クラス名
{
    public コンストラクタ名(型名 変数名, 型名 変数名)
    {
        // コンストラクタの処理内容を記述 //
    }
}

コンストラクタの引数に、受け取りたい型と変数名を指定して、そしてコンストラクタの中の処理で、メンバ変数に受け取ったローカル変数の値を代入してあげることで、インスタンス時に値の指定忘れを防ぐことができます。

例えば、Playerクラスでプレイヤーの名前生年月日を指定したい場合、以下のように7行目のコンストラクタに引数を指定し、その中で値を受け取る処理を記述しておきます。

public class Player
{
    string name;
    int birthDay;

    // コンストラクタを作成
    public Player(string name, int birthDay)
    {
        this.name = name;
        this.birthDay = birthDay;
    }
}

そして、別のクラスからPlayer型のインスタンスを生成してあげる際に、引数で名前と生年月日を指定しないとエラーが表示されるようになります。

using UnityEngine;

public class Test : MonoBehaviour
{
    Player player = new Player("ともや", 0101);

    void Start()
    {
        Debug.Log(player.name + "の誕生日は" + player.birthDay);
    }
}

回復アイテムを管理するクラスのコンストラクタ

ここからは、Unityで回復アイテムを管理するクラスを作って、そこでコンストラクタを使ってみます。

空オブジェクトを作成して、以下のスクリプトをアタッチしておきます。

using UnityEngine;

public class ItemModel
{
    public string itemName;     // アイテムの名前
    public int recoveryAmount;  // アイテムの回復量

    // コンストラクタを作成
    public ItemModel(string itemName, int recoveryAmount)
    {
        this.itemName = itemName;
        this.recoveryAmount = recoveryAmount;
    }

    public void Use()
    {
        Debug.Log(itemName + "を使用して" + recoveryAmount + "回復した。");
    }
}

まずは、アイテム型を作るItemModelというMonoBehaviourを継承していないクラスを作り、その中の9行目でコンストラクタを作成して、「アイテムの名前」「アイテムの回復量」を引数で受け取るようにしておきます。

そして、15行目でアイテムを使用した際のUseというメソッドを作り、コンソールウィンドウにアイテム名と回復量が表示される処理を作っています。

あとは、ゲーム内にアイテムを配置しておき、アイテムをクリックしたらそのアイテムが使用されるようにしていきます。

ここでは、アイテムのベースとなる以下のスクリプトを先に作成しています。

using UnityEngine;

public class Item : MonoBehaviour
{
    public ItemModel itemModel;

    // アイテムをクリックした場合
    void OnMouseDown()
    {
        itemModel.Use();
        Destroy(gameObject);
    }
}

5行目でItemModel型の変数をpublicを付けて宣言しておき、あとでこのクラスを継承してそれぞれのアイテム毎のクラスでインスタンスを生成していきます。

アイテムをクリックしたかどうかは、9行目のOnMouseDownメソッドを使って判定していて、クリックした場合はItemModelのUseメソッドが実行されて、アイテムを消去する処理を作っています。

それぞれのアイテムに対しては、以下のスクリプトをアタッチしています。

using UnityEngine;

public class PosionA : Item     // Itemクラスを継承している
{
    void Start()
    {
        itemModel = new ItemModel("ポーションA", 50);    // アイテム名と回復量を引数で指定してインスタンスを生成する
    }
}

3行目で先ほど作成したItemクラスを継承しています。

そして、Startメソッドの中で、ItemModel型のインスタンスを生成していて、引数でアイテム名と回復量を指定しています。

今回は他に2つのアイテムがあるので、上記のスクリプトを名前と回復量だけを変更して準備しています。

これでゲームを実行してみると、

それぞれのアイテムをクリックすると、アイテム名と回復量がコンソールウィンドウに表示されるようになりました。

まとめ

このページでは、UnityのC#で使えるコンストラクタについて、どういうものなのか、使い方までをまとめていきましたが、いかがでしたでしょうか?

コンストラクタとは、クラスのインスタンスを生成した際に必ず実行される処理のことで、初期設定の忘れを防ぐことができます。

特に、引数付きのコンストラクタを作っておくことで、値の代入忘れを防ぐことができるので便利です。

ただし、UnityでMonoBehaviourを継承しているクラスでは、コンストラクタを使うことができないため、注意しておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント