はじめに
いまさらながらクラスについて勉強をしたのでその備忘録として残しておきたいと思います。
また、なるべくUnityでも使いそうな感じを意識して書いていきます。
基本的なクラス
たとえばこのようなクラスがあったとします。
public class Enemy { public string firstName; public string familyName; public int hp; public int exp; }
ただ他クラスから参照される場合は一般的にプロパティを使って記述した方が良いとされています。
なので、少しだけ書き換えちゃいましょう。
public class Enemy { public string FirstName { get; set; } public string FamilyName { get; set; } public int Hp { get; set; } public int Exp { get; set; } }
またクラスの中にはメソッドを追加することもできます。
public class Enemy { public string FirstName { get; set; } public string FamilyName { get; set; } public int Hp { get; set; } public int Exp { get; set; } public string GetName() { return FamilyName + FirstName; } }
クラスのインスタンスを作成したときに初期化できるようにコンストラクタを追加します。
さらに、setをprivateに変更することで、コンストラクタ以外でプロパティを変更できなくなりました。
public class Enemy { public string FirstName { get; private set; } public string FamilyName { get; private set; } public int Hp { get; private set; } public int Exp { get; private set; } //コンストラクタ public Enemy(string firstName,string familyName,int hp,int exp) { this.FirstName = firstName; this.FamilyName = familyName; this.Hp = hp; this.Exp = exp; } public string GetName() { return FirstName + FamilyName; } }
実際にクラスのインスタンスを生成する
先程作成したクラスのインスタンスを作成しましょう。
using UnityEngine; //プレイヤークラス public class Enemy { public string FirstName { get; private set; } public string FamilyName { get; private set; } public int Hp { get; private set; } public int Exp { get; private set; } //コンストラクタ public Enemy(string firstName,string familyName,int hp,int exp) { this.FirstName = firstName; this.FamilyName = familyName; this.Hp = hp; this.Exp = exp; } public string GetName() { return FirstName + FamilyName; } } public class Hoge : MonoBehaviour { private void Start() { Enemy slime = new Enemy("メタル", "スライム", 15, 50); } }
こちらがどうなっているかを簡単に図示すると、このようになっています。
これは余談なのですが、クラスは参照型で構造体は値型を取ります。
今回はクラスなので、変数slimeは参照が格納されているというわけですね。
また実際にスライムオブジェクトを利用してみます。
Hogeクラスの中身に少し付け加えてみました。
public class Hoge : MonoBehaviour { private void Start() { Enemy slime = new Enemy("メタル", "スライム", 15, 50); int hp = slime.Hp; Debug.Log("hp: " + hp); string name = slime.GetName(); Debug.Log("name: " + name); } }
これでちゃんとDebugコンソールに文字が表示されたと思います。
インスペクター上でいじれるようにする
ただ上記の方法はC#的には良いのですが、Unityのインスペクターではいじれません。
ここが少し辛いところで、インスペクターから値をいじる必要があるならもう少し変えてあげる必要があります。
実際にインスペクターでいじれるように書き換えてみました。
using UnityEngine; [System.Serializable] public class Enemy { [SerializeField] private string firstName; public string FirstName { get { return firstName; } set { firstName = value; } } [SerializeField] private string familyName; public string FamilyName { get { return familyName; } set { familyName = value; } } [SerializeField] private int hp; public int Hp { get { return hp; } set { hp = value; } } [SerializeField] private int exp; public int Exp { get { return exp; } set { exp = value; } } public string GetName() { return FirstName + FamilyName; } } public class Hoge : MonoBehaviour { [SerializeField] private Enemy slime; private void Start() { int hp = slime.Hp; Debug.Log("hp: " + hp); string name = slime.GetName(); Debug.Log("name: " + name); } }
クラスには[System.Serializable]を付け、変数には[SerializeField]を付けます。
さらに自動実装プロパティではインスペクター上に表示できないので、ちゃんとプロパティをかかなければなりません。
さいごに
お疲れ様でした。
思ったよりも長くなってしまったのでいったんここで終わりにしたいと思います。
ただもう少し紹介したいことがあるので、また別記事にて!