プロパティとは、
クラス外部から見るとメンバー変数のように振る舞い、
クラス内部から見るとメソッドのように振る舞う機能です。
そのため、
実装状態(private修飾子のまま)を変更することなく、
外部クラスへの参照・変更を行える機能であるため、扱いを覚えておくと非常に便利です。
この特性より、プロパティを作成する場合、多くは
private 修飾子の変数の情報を扱うために作成します。
今回の場合は、
PlayerController クラスの isTalking 変数に対してのプロパティを作成します。
<プロパティの作成>
private bool isTalking;
/// <summary>
/// isTalking 変数のプロパティ
/// </summary>
public bool IsTalking
{
set {
isTalking = value;
}
get {
return isTalking;
}
}
上記のようなプロパティを作成することで、private 修飾子で宣言している isTalking 変数を
プロパティを利用することによって、
外部クラスから参照出来るようにしています。
private 修飾子にて宣言フィールドで宣言した変数については、
外部のクラスからは参照・変更を行うことが出来ません。
このとき参照を行いたい場合には、変数の修飾子を public 修飾子に変更して対応するのではなく
プロパティの持つ get キーワードを利用して、戻り値を利用して private 修飾子の変数を外部クラスに参照させることで対応することが出来ます。
こういった機能を知っているかどうかで
設計部分が大きく変わります。
色々な機能を知っていれば、例えば、今回はプロパティを使おうか、どうしようか、という選択肢が増えますが、知らなければ選択肢自体が生まれません。
設計の引き出しを広げる上でも、新しい技術を覚えること、常に学習する意欲と向上心を持つことがプログラム学習のポイントです。
プロパティを利用した設計により、
public ではない変数を外部クラスで利用できるようにします。
外部からプロパティを呼び出して戻り値を参照する処理のことを
ゲッター(getter)と呼びます。
get {
return isTalking;
}
同様に、
private 修飾子の値を外部クラスより変更したい場合には、プロパティを仲介する手法を使って書き換える処理を実装出来ます。
こちらの処理は set キーワードを利用して処理を記述します。そのため、この処理を
セッター(setter)と呼びます。
set キーワード内には呼び出し元から value の値で情報が届いていますので、value の値を利用することで private 修飾子の変数に代入処理を行うことが出来ます。
set {
isTalking = value;
}
この処理を外部のクラスから実行する場合には、参照する場合と同じで「
クラスの変数.プロパティ名」と記述することで値の書き換えが可能です。
今回のケースであれば次のような形で参照して利用できます。
<TreasureBox.cs>
// プロパティの利用
public void CloseTreasureBox() {
dialogController.HideDialog();
// クラスの変数.プロパティで利用している
playerController.IsTalking = false;
}
get、set キーワードはどちらか片方だけでも記述できます。
また
プロパティ内部に条件式を用意して、その結果に合わせて処理を変更する記述も出来ます。
参考サイト
未確認飛行 C 様
プロパティ
https://ufcpp.net/study/csharp/oo_property.html
FEnetインフラ様 テックブログ
C#のプロパティを使いこなそう!さまざまな実装方法を紹介
https://www.fenet.jp/infla/column/technology/c%E3%...
実際の使用例です。外部クラスからは、「
プロパティのあるクラスの変数.プロパティ名」と記述することで参照が可能です。
参照する場合は通常の変数と同じように、左辺に変数を用意して代入したり、引数の部分に利用したり出来ます。
<利用例>
PlayerController player = GetComponent<PlayerController>();
player.IsTalking = false;
今回のケースではメソッドの引数に PlayerController クラスの情報が届いていますので、それを活用してクラスを取得しています。
GetComponent メソッド以外でもクラスの情報を取得できる方法があることを覚えておきましょう。
<TreasureBox.cs にて利用>
// 宣言フィールドにて変数を宣言
private PlayerController playerController;
----------------------------------------------------------------------------------------------
// クラスの情報を取得
public void OpenTresureBox(Vector3 playerPos, PlayerController playerController) {
// メソッドに届いた PlayerController クラスの情報を変数に代入
if (this.playerController == null) {
this.playerController = playerController;
}
// 省略
}
----------------------------------------------------------------------------------------------
// プロパティの利用
public void CloseTreasureBox() {
dialogController.HideDialog();
// クラスの変数.プロパティで利用している
playerController.IsTalking = false;
}
処理を見直して、流れを把握してみてください。