【Unity】自作クラスを使ってみよう【C#】

この記事は約5分で読めます。

Unityにも慣れてきたし、そろそろオブジェクト指向に足を踏み入れてみようかな?

そんな人向けの記事です。

クラスを作るメリットは?

機能を小さく切り分けると、バグが発生しにくくなったり、もしバグが発生しても見つけやすくなったりします。

機能を「クラス」という単位にまとめる事で、外部の干渉を防げたり、機能を再利用するのが簡単になったりします。これが通称「カプセル化」ですね。

インスタンスとは

設計図で有る「クラス」を実際に生成すること

つまり new すること

コンストラクタとは

インスタンスが生成された際に、最初に実行されるメソッドです。

なぜ最初に呼ばれるかというと、このコンストラクタ君が生成したクラスへ初期値を与えてくれるんですね。

引数が無いクラスの場合は、コンストラクタで初期値を与えますし、

引数が有るクラスの場合は、コンストラクタで引数を好きなようにできます。

ちなみに複数のコンストラクタを設定することができ、複数の引数パターンを実装しておくとインスタンス時の引数に対応したコンストラクタが呼び出される。

例)複数のコンストラクタを実装してみる

コンストラクタは複数実装することができます。

でも、条件が違うのにインスタンスは正しく処理されるのでしょうか?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour
{
    class Enemy // 動物クラス
    {
        public int hitPoint;
        public int attack;
        public int defence;

        // ●●● 引数なし初期化のみのコンストラクタ
        public Enemy()
        {
            hitPoint  = 1;
            attack    = 1;
            defence   = 1;
        }

        // ★★★ 引数ありのコンストラクタ
        public Enemy(int hp, int atk, int def)
        {
            hitPoint = hp;
            attack   = atk;
            defence  = def;
        }
    }


    // ●●● インスタンス生成(引数なしなので全ステータス1)
    Enemy enemy_Dragon = new Enemy();

    // ★★★ インスタンス生成(引数あり)
    Enemy enemy_big_Dragon = new Enemy(100, 10, 10);



    private void Start()
    {
        Debug.Log("初期化ドラゴンのHPは " + enemy_Dragon.hitPoint);
        Debug.Log("引数有ドラゴンのHPは " + enemy_big_Dragon.hitPoint);
    }
}

実行するとコンソールにこう表示されます。

複数のコンストラクタを実装した場合でも、インスタンス生成方法に対応したコンストラクタが自動で選択されることがわかります。

誰でもすぐに使える 静的クラス(Static)

ドラゴンボールでは誰でも使える基本能力として「気を感じる」というものがあります。

こういった機能はクラスの前にStaticを付ける事で実装することができます。

Staticを付けたクラスは「静的クラス」と呼ばれ、インスタンスを生成せずにどこからでも呼び出すことができます。

では作ってみましょう。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public static class SampleStatic
{
    // 感じた気の大きさによって態度を変える
    public static string Feel_A_Sign(int i)
    {
        if(i <= 5)
        {
            return "戦闘力たったの5か。ゴミめ!";
        }
        else
        {
            return "えれーでけえ気が近づいてっぞ";
        }
    }
}

別のスクリプトから、引数として戦闘力10を渡して呼び出していますが、ビビっているコメントが表示されますね。

以下が静的クラスの静的メソッドを使用した例です。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class AnotherTest : MonoBehaviour
{
    void Start()
    {
        Debug.Log(SampleStatic.Feel_A_Sign(10));
    }
}

static(静的クラス)はどこからでもアクセスできるのがメリットですが、それがデメリットでもあります。どこかで値を変更するとそれが全てに反映されますので取り扱いには注意が必要です。

コメント

タイトルとURLをコピーしました