プロパティって何?
プロパティとは、関数と変数のハイブリッド のようなものです。
例を挙げて説明します。
ゲームを作っている中で、「HP」という名前の変数を作ったとしましょう。
そこでこう思います。
「HPが変更されたとき、メッセージを流したい」
「毎回、最大HPとの差を確認したい」
プロパティは、これを関数を使わずに実現できます。
プロパティの文法
プロパティで重要なのは、getとsetです。
具体的を通して見ていきましょう。
private int _hp; // 現在の体力を保持するための変数
public int HP
{
get
{
// 参照されたとき:100から現在のHPを引いた値を返す
return 100 - _hp;
}
set
{
// 変更されたとき:ログを出力し、値を更新する
Console.WriteLine("変更されました");
_hp = value;
}
}
get
getは、「プロパティの値が参照されたとき」 に実行されます。
このコードで言うと、他の関数からHPの値を確認しようとした場合、100 - _hpの値が返されます。
もしかすると、「『100 - HP』とは書かないの?」と思ったかもしれません。
100-HPと書いてしまうと、
HPの値を確認しようとする
↓
getが実行される
↓
getの内部で再びHPの値を確認しようとする
↓
getが実行される
・
・
・
という無限ループに入ってしまいます。
そのため、_hpという別の変数を用意するのが正解です。
set
setは、「プロパティの値が変更された時」 に実行されます。
このコードで言うと、HPを変更しようとした場合、「変更されました」というログが出力されます。
ここで、「value」という変数を使っていると思います。
valueはsetで使われる特別な変数で、「変更後の値」 が入っています。
例えばHPを70にしようとした場合、valueには70が格納されます。
よくある使い方
プロパティでよくある書き方の1つに、以下のようなものがあります。
public int HP { get; private set; }
getに何も書かれていないため、値が参照された際は、通常の変数と同様格納されている値を返します。
一方setには「private」と書かれています。
これは、別のクラスから値を変えることができないという意味です。
(同じクラス内からは値を変えることが出来ます。)
つまり、全体で見ると 読み取り専用 のような働きをしています。
単に変数にprivateを付けた、以下の書き方とは何が違うのでしょうか。
private int MP;
この場合、外部のクラスからは 読み取りも変更もできません。
先程のプロパティとは働きが異なっています。
おわり
プロパティは、Unityでゲームを作る上でとても強力なツールです。
ぜひ使いこなしていきましょう!