
どんなとき便利か
まずクラスとは何かという説明は省く。この記事を最後まで読んでざっくりとした概要は伝わるはずである。
また、その他のUnityに関する記事は【Unity】サイト内Tips記事リンクまとめにまとめてある。
Unityを少し使っているといくつかの変数をセットで扱いたいときがある。例えばゲームのアイテムで言えば「アイテム名」と「耐久値」、敵キャラで言えば「キャラ名」と「HP」や「攻撃力」などがこれに当たる。こういう場面で便利なのがクラスだ。
実はこれ自体にはすでに慣れ親しんでいる場合がある。float型を3つセットで扱えるVector3といえばピンとくるかもしれない。
もっと身近なもので言えば郵便番号などがわかりやすい。1つの枠に入る数字は0~9に限定されているが7つの枠まとめて1つの意味になっている。
最初はこのように”変数をまとめて管理できるもの”と思うとわかりやすいだろう。
作り方
通常のスクリプトの作成と何ら変わらない。オブジェクトに追加するわけではないのでProjectウィンドウから新規作成すればよい。ここでは先に例に取ったアイテムクラスの作成として話を進めていく。
自動生成されたコードの内Setup()関数とUpdate()関数は不要なので消してよい。
インスタンスの生成
クラスを作ったので別のスクリプトからこのクラスを元にインスタンスを生成することができる。
これもVector3などと同じで記述は以下のようになる。
//クラス インスタンス名
Item hoge;
変数の宣言
試しに「アイテム名」と「耐久値」を宣言してみよう。記述は以下のようになる。当然変数名は何でもよい。
string itemName;
int durability;
変数の値の代入と取得
生成したインスタンスの持つ変数の値を書き換えしたいときは普段の代入操作と何ら変わらない。またこれを読み取りたいときもインスタンス名.変数名でアクセスできる。
//Itemクラスのhogeというインスタンスのdurability変数を80に上書きしたいとき
hoge.durability = 80;
メソッド
さて、ここまでが記事の序盤に紹介した複数の変数を束ねて扱えるという特徴だ。
そしてさらにクラスは関数も記述することができる。
名称は重要ではないがこれをメソッドと呼んだりする。
試しにItemクラス内に耐久値を1減らすメソッドを作ってみると以下のようになる。
void UseItem(){
durability--;
}
メソッドの呼び出しも変数のときと扱いはさほど変わらない。
//ItemクラスのインスタンスhogeのUseItemメソッドを呼びたいとき
hoge.UseItem();
コンストラクタ
インスタンス生成時に自動的に1度だけ呼び出されるメソッドを作ることもできる。
これをコンストラクタと呼ぶ。
作り方も簡単でメソッド名をクラス名と合わせるだけ。
注意点としてはpublic属性をつけることと、voidをつけないこと。voidの部分は本来戻り値の型を示しているが、コンストラクタはそもそも値を返さない。
例としてアイテム名と耐久値の初期化をするコンストラクタを作ってみると以下のようになる。
public Item(){
itemName = "";
durability = 100;
}
また、インスタンス生成時に指定した値で初期化したい場合も多い。
この場合コンストラクタに引数を設定するだけで作ることができる。
以下にアイテム名と耐久値を指定できるようにした例を示す。
public Item(string name, int drb){
itemName = name;
durability = drb;
}
この場合インスタンスの生成は以下のようになる。
//アイテム名"木の棒"、耐久値40で生成。
Item hoge = new Item("木の棒",40);
尚、コンストラクタは引数の数、型、順序が違えば同じクラスに何パターンも用意しておくことができる。この場合渡した引数に応じて適切なコンストラクタが呼ばれる。
おまけ
上述の耐久値を1減らすだけの例は見やすいようにシンプルなものを選んだが、変数の操作だけではメソッドのありがたみが伝わりづらいので以下に渡されたダメージと耐久値に応じて反応が変わるメソットも添えておく。
void UseItem(int damage){
if(damage-durability <= 0){
Debug.Log("壊れてしまった");
}else{
durability -= damage;
}
}