【Unity】自作クラスの配列を作って使う(インスペクタでシリアライズ)

Unityでは、new演算子で自作クラスは作れない?作らない方がいいのでしょうか?
決してそんなことはありません
確かにシーンに表示されるオブジェクトはUnityエンジンに任せた方がいいですが、情報管理と処理についてはPureC#で作成した方がいいです

今回は、クラスのインスタンスをインスペクターで実現する方法を学びましょう

C#などコードを学んできた方はどんどんスキルを活かしていきましょう

シーン

  1. 空のゲームオブジェクトを作成します
  2. ClassSampleをアタッチします
  3. Playerクラスはプロジェクトウィンドウに作成したままにします
  4. インスペクターで複数の初期値を代入できます

この値は、シーンファイル(SampleScene.unityファイル)に保存されます

実行結果

太郎 10
二郎 1000

コード

ClassSample

using UnityEngine;

public class ClassSample : MonoBehaviour
{
    public Player[] players;

    void Start()
    {
        for (int i = 0; i < players.Length; i++)
        {
            Debug.Log($"{players[i].name} {players[i].hp}");
        }
    }
}

public Player[] players;は、Playerという型の配列を宣言します。この配列は、ClassSampleクラスの外部からアクセスできるようにパブリックに宣言されています。

Start()は、Unityエンジンがゲームオブジェクトを有効にしたときに呼び出されるメソッドです。このメソッドは、配列players内の各Playerオブジェクトの名前とHPをデバッグログに出力するループを含んでいます。

for (int i = 0; i < players.Length; i++)は、players配列の各要素にアクセスするためのforループを開始します。i変数は、ループ中にカウンターとして使用されます。

Debug.Log($"{players[i].name} {players[i].hp}");は、現在のPlayerオブジェクトの名前とHPを含む文字列をデバッグログに出力します。players[i]は、players配列内の現在の要素を参照します。namehpは、Playerオブジェクトのパブリックフィールドであり、名前とHPの値を含みます。

このスクリプトは、複数のPlayerオブジェクトの情報をデバッグログに表示するために使用されます。

Player

[Serializable]
public class Player
{
    public string name;
    public int hp;
}

[Serializable]属性は、このクラスのインスタンスがシリアル化できることを示しています。シリアル化は、オブジェクトの状態をバイトストリームに変換し、データを永続化することができます。これにより、ゲームのセーブデータを保存することができます。

public class Playerは、Playerクラスを定義しています。このクラスには、namehpという2つのメンバ変数があります。

public string nameは、Playerクラスのインスタンスが持つ名前を表します。文字列型のname変数は、publicキーワードによってアクセス可能になっています。これにより、この変数に外部からアクセスできます。

public int hpは、Playerクラスのインスタンスが持つ体力ポイントを表します。整数型のhp変数も、publicキーワードによってアクセス可能になっています。これにより、外部からこの変数にアクセスでき、体力ポイントを変更できます。

このクラスを使用することで、ゲーム内のプレイヤーの情報を管理することができます。例えば、プレイヤーの名前と体力ポイントを保存することができます。

[Serializable]属性とすることで、インスペクターでの値の代入が可能になります

インスペクターへ表示をしない場合

C#

Posted by hidepon