[UI/2D物理シミュレーション課題]public変数を全体で使い回すことについて | Unity Forum | Tech Stadium Forum

[UI/2D物理シミュレーション課題]...
 
通知
すべてクリア

[UI/2D物理シミュレーション課題]public変数を全体で使い回すことについて  

  RSS

Student
(@student)
メンバー Moderator
結合: 4年前
投稿: 1351
17/03/2021 2:03 pm  
GameManagerに
ゲームが始まったかというbool型変数とゲームをクリアしたかというbool型変数を
public staticで定義しており、
 public static bool isGameStart;
public static bool isGameClear;
それを色んなクラスから
if (GameManager.isGameClear)
{
//処理
}
のようにして使いまくっているのですが、
このような大事な変数をpublicで修飾するのも何か怖い感じがするし、
色々なとこから引っ張っているうちに、どこかを変更することで
崩壊しそうな感じがしたのですが、(説明がふわっとしていてすみません…)
このような構成は正しいのでしょうか?
実際の現場ではこのような全体を司る変数をどのように扱っているのか
ご教授いただきたいです。

引用
Teacher
(@admin)
メンバー Admin
結合: 4年前
投稿: 1318
17/03/2021 2:57 pm  
実際の現場ではpublic変数を全体で使い回すようなことはせず、プロパティを使ってアクセスしてもらいます。
プロパティの使い方アクセスレベル 型名 プロパティ名
{
set
{
// setアクセサー(setter)
// ここに値の変更時の処理を書く。
// valueという名前の変数に代入された値が格納される。
}
get
{
// getアクセサ(getter)
// ここに値の取得時の処理を書く。
// メソッドの場合と同様に、値はreturnキーワードを用いて返す。
}
}
プロパティの便利なところは、setterとgetterは片方だけ宣言しても良いということです。
例えば、publicにして他のクラスからも参照したいが、他のクラスから変更はされたくないという場合にはこのように宣言することで実装できます。
private bool isGameStart;public bool IsGameStart
{
get
{
return isGameStart
}
}
のように記述すると、GameManagerクラス内部ではisGameStartの値を変更することはできますが、他のクラスからは変更することができなくなります。
しかし値の参照は行うことはできるので
if(GameManager.IsGameStart)
{
//trueの時に行う実装を記述
}
というように行うことができます。他にも様々な利点があり、publicで変数を宣言して参照させるよりはるかに便利な機能となっています。
なので、今後は privateで変数を宣言し、publicプロパティでgetさせるのが良いでしょう。
プロパティのついて詳しくはこちらを参照してください。
https://ufcpp.net/study/csharp/oo_property.html  

返信引用
Student
(@student)
メンバー Moderator
結合: 4年前
投稿: 1351
17/03/2021 2:58 pm  
なるほど!プロパティとはそのためにあったのですね…!
今回、他の関数から、setさせる必要もあったため、
結局setterも設定したのですが、
private static bool gameStart;
private static bool gameClear; public static bool isGameStart
{
get
{
return gameStart;
}
set
{
gameStart = value;
}
} public static bool isGameClear
{
get
{
return gameClear;
}
set
{
gameClear = value;
} }
これだと、結局どのクラスからもさわれてしまうので、
ただのpublic変数の時と同じでは…と思ったのですが、
この場合でもプロパティを設定する意義というのはあるのでしょうか?

返信引用
Teacher
(@admin)
メンバー Admin
結合: 4年前
投稿: 1318
17/03/2021 3:00 pm  
publicにしてしまうと、どのクラスからもさわれてしまう問題は残ってしまいます。
そこでプロパティのsetterに条件式をつける等の工夫をすることによって、「問題のある代入」などを阻止することができます。
    private int num;    public int PropertyTest
{
get
{
return num;
}
set
{
if(value < 0)
{
Debug.LogError("numは0以上じゃなければならない");
}
else
{
num = value;
}
}
}
このようにすることで、numに0より小さい値の代入を防ぐことができ、安定化に繋がります。
それでも、外部から好き勝手アクセスできるのは困ることも多いので、publicにする変数は限定的にするのがベストですね。

返信引用
共有:
タイトルとURLをコピーしました