MENU

Unityスクリプトに学ぶC#クラスの構成要素【初心者向け】

C#の「クラス」とは、データとそれを操作する処理をまとめた設計図のことです。

UnityのC#スクリプトもこのクラスから作られますが、Unityならではのルールも存在します。

Unityの視点から、C#クラスの基本的な構成要素(メンバー)をUnity初心者向けに解説します。

もくじ

Unityスクリプトを構成する主な要素(メンバー)

UnityのC#スクリプトは、主に以下の要素で構成されます。これらのクラスに含まれる要素は、総称してメンバーと呼ばれます。

メンバー説明
フィールドHPや攻撃力などの「データ」=変数
プロパティフィールドの値を安全に扱うための特別なメソッド
メソッド特定の処理を実行するコードの集まり=関数
コンストラクターMonoBehaviourではない通常のC#クラスで使う初期化メソッド
クラス内の主な要素
簡易的な例

では、一つずつ見ていきましょう。

1. フィールド

フィールドは、クラスが持つデータを保存するための変数です。キャラクターのHP、移動速度などを保持します。

フィールドは、クラスの { } の直下で、メソッドの外側に記述します。ここに記述することで、クラス内のどのメソッドからでもその変数にアクセスできるようになります。

publicにするか[SerializeField]属性を付けることで、Unityエディタのインスペクターに表示され、そこから値を調整できるようになります。

using UnityEngine;

public class Player : MonoBehaviour
{
    // ★★★ 正しい場所はここです (メソッドの外、クラスの直下) ★★★
    public string playerName = "勇者";
    public int health = 100;

    [SerializeField]
    private float moveSpeed = 5.0f;

    void Start()
    {
        // クラスの直下に書いたフィールドには、どのメソッドからでもアクセスできる
        Debug.Log(playerName + "のHPは" + health);
    }
}

>実行結果

コンソール
インスペクター

補足ポイント:フィールドとローカル変数(スコープの違い)

メソッドの内側で宣言される変数は「ローカル変数」と呼ばれ、フィールドとは明確に区別されます。この違いを理解する鍵が「スコープ」(変数が有効な範囲)です。

  • フィールドのスコープ
    クラス全体です。クラス内のどのメソッドからでもアクセスできます。
  • ローカル変数のスコープ
    宣言されたメソッドの中だけです。そのメソッドの処理が終わると変数は消えてしまいます。

そのため、ローカル変数には外部からのアクセスを制御するpublicやprivateといった修飾子は付けません。

using UnityEngine;

public class Player : MonoBehaviour
{
    // フィールド (クラススコープ)
    public int health = 100;

    public void TakeDamage(int damageAmount)
    {
        // ローカル変数 (TakeDamageメソッド内だけのスコープ)
        int calculatedDamage = damageAmount; 

        health -= calculatedDamage; // フィールドにはアクセスできる
    }

    void Update()
    {
        // OK: healthはフィールドなのでアクセスできる
        Debug.Log("現在のHP: " + health);

        // エラー!: calculatedDamageはTakeDamageメソッドのローカル変数なので、
        // Updateメソッドからはアクセスできない
        Debug.Log(calculatedDamage);
    }
}

>Visual Studio Code

CS0103コンパイルエラー:使用しようとした変数やメソッドが存在しない

2. プロパティ

プロパティは、フィールドの値を安全に読み書きするための仕組みです。

フィールドへのアクセスを制御し、値の取得(get)や設定(set)の際にロジックを挟むことができます。

using UnityEngine;

public class Player : MonoBehaviour
{
    private int _health; // HPの実データを保持する非公開フィールド

    // Healthプロパティ
    public int Health
    {
        get { return _health; }
        set
        {
            // HPが0未満にならないように値を制御
            _health = (value < 0) ? 0 : value;
        }
    }

    // 経験値。外部からは値の取得のみ可能。
    // 変更はこのクラスのメソッドからのみのプロパティ。
    public int Experience { get; private set; }

    void Start()
    {
        // 初期HPを設定
        Health = 100;
        Debug.Log("Initial Health: " + Health);
        
        // HPをさらに減少させて0未満にしようとする
        Health -= 120;
        Debug.Log("After taking more damage, Health: " + Health);
    }
}

>実行結果

コンソール

補足ポイント:プロパティとインスペクター

注意点として、プロパティはインスペクターに表示されません。

インスペクターで調整したい値は、publicまたは[SerializeField]を付けたフィールドとして定義しましょう。

3. メソッド

メソッドは、クラスが持つ「振る舞い」や「操作」を定義するものです。特定の処理を実行するコードの塊です。関数とも言います。

Unityで扱うメソッドは、大きく分けていくつかの種類があります。

一つは、以下のコードのTakeDamageのように、自分で好きな名前を付けて作るメソッドがあります。特定の機能(ダメージ計算など)をまとめ、他の場所から呼び出して使います。

using UnityEngine;

public class Player : MonoBehaviour
{
    public int health = 100;

    // ダメージを受ける処理
    public void TakeDamage(int damage)
    {
        health -= damage;
        if (health <= 0)
        {
            Die();
        }
    }

    // このクラス内からのみ呼び出せるprivateメソッド
    private void Die()
    {
        Debug.Log("力尽きた...");
        // ここに死亡した時の処理を書く
    }
}

>実行結果:外部からTakeDamage(200);を実行

コンソール

Unityが自動で呼び出す特別なメソッド(ライフサイクルメソッド)

StartやAwakeのように、Unityが決まったタイミングで自動的に呼び出す特別なメソッドがあります。これらはライフサイクルメソッドと呼ばれ、特に初期化処理で重要な役割を果たします。

  • Awake()
    スクリプトが有効化された直後に一度だけ呼ばれます。主に、自分自身のコンポーネントの取得など、他のスクリプトに依存しない初期化に使います。
  • Start()
    最初のフレームの更新前に一度だけ呼ばれます。Awake()の後に呼ばれるため、他のオブジェクトの初期化が終わっていることが期待できます。
using UnityEngine;

public class Player : MonoBehaviour
{
    public int health;
    private Rigidbody rb;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void Start()
    {
        health = 100;
    }
}

>実行結果:Awake>Startの順で呼ばれる

補足ポイント:ライフサイクルメソッドの全体像

AwakeやStart以外にも、フレームごとに呼ばれるUpdate、一定間隔で物理演算用に呼ばれるFixedUpdate、オブジェクトが破棄されるときに呼ばれるOnDestroyなど、多くのライフサイクルメソッドが存在します。

その他の主要なメソッド

他にもさまざまなメソッドがあります。初心者が使うようなメソッドをいくつか紹介します。

  • オブジェクトの操作
    • GetComponent():同じゲームオブジェクトにアタッチされている、別のコンポーネントを取得します。
    • Instantiate():プレハブ(オブジェクトの雛形)から、新しいゲームオブジェクトをシーン上に生成します。
    • Destroy():ゲームオブジェクトをシーンから削除します。
  • 時間のかかる処理や待機処理(コルーチン)
    • StartCoroutine():「1秒後に敵を出現させる」「徐々に画面を暗くする」など、数フレームにまたがる処理や待機処理を実現するためのUnityの機能です。IEnumeratorを返す特殊なメソッド(コルーチン)を開始します。
  • UIイベントへの応答
    • OnButtonClick():UIボタンがクリックされた時に呼び出されるように、Unityエディタ上で設定するメソッドです。

4. コンストラクター

コンストラクターは、オブジェクトがnewキーワードで作成されるときに呼ばれる初期化用の特別なメソッドです。

MonoBehaviourを継承したクラスでは、このコンストラクターを使いません。

その代わり、MonoBehaviourを継承しない、データ管理用の通常のC#クラスでは非常に役立ちます。

using UnityEngine;

// Playerクラス内でItemDataクラスを使う例
public class Player : MonoBehaviour
{
    void Start()
    {
        // newを使ってItemDataオブジェクトを生成。コンストラクターが呼ばれる。
        ItemData potion = new ItemData("ポーション", 50);
        Debug.Log($"アイテム: {potion.itemName}, 価格: {potion.price}G");
    }
}
// アイテムデータを管理する、MonoBehaviourを継承しないクラス
public class ItemData
{
    public string itemName;
    public int price;

    // コンストラクターで初期値を設定
    public ItemData(string name, int p)
    {
        itemName = name;
        price = p;
    }
}

>実行結果

コンソール

まとめ

  • フィールド
    HPや移動速度など、オブジェクトのデータを保持する。クラス全体で使える変数。
  • プロパティ
    フィールドの値を安全に扱うための窓口。HPがマイナスにならない等のルールを設けられる。
  • メソッド
    攻撃やジャンプなど、オブジェクトの振る舞いを定義する。Unityが自動で呼び出すライフサイクルメソッドもこれに含まれる。
  • コンストラクター
    MonoBehaviourではない、データ管理用クラスなどをnewで生成する際の初期化に使う。

というわけで、Unity初心者向けの解説でした。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
もくじ