DUVER Tips

Unity,Unreal Engine,XR関係のblog

Unity C# プロパティ使い方

Unity C# プロパティ使い方

今回はUnity C# のプロパティの使い方について
やっていこうと思います。

プロパティて?

多分見たことがある人が多いと思いますが
こういうやつです。

private int score;

public int Score{
    get{
        return score;
    }
    set{
       score=value;
    }
}

プロパティはget,setというアクセッサを持っています。
(両方必ず必要なわけではない)
値を知りたい時はget,値を代入したい場合はsetを使用し
それぞれが呼び出されます。

要はゲッターとセッターと呼ばれるものなのですが、
C#にある機能で、いちいち関数を用意しなくていいので非常に便利です。

プロパティを使用しないで、ゲッターとセッターの関数を用意すると
以下のような実装になります。

private int score;

//スコアのゲッター
public int GetScore()
{
    return score;
}

//スコアのセッター
public void SetScore(int value)
{
    score=value;
}

使い方

使い方①

基本的な使い方としては、privateな変数があって
その値に他のクラスからもアクセスしたい場合に使います。
上の例でいうとscoreに他のクラスからアクセスしたいけどprivateの場合。


またプロパティの変数名は、定義されているprivateな変数と区別化するためにも
同じ名前でよいので大文字始まりにするなどが一般的だと思います。
ではプロパティの具体的な使用例を以下にあげます。

//MyClassからHogeクラスのprivate 変数scoreにアクセスしたい
public class MyClass :MonoBehaviour
{
   void Start()
   {
    Hoge hoge=new Hoge();
    hoge.Score=10;
    Debug.Log(hoge.Score);
    }

}

public class Hoge
{
    private int score;

    public int Score{
    get{
        return score;
    }
    set{
       score=value;
    }
}
}

この例ではMyClassからHogeクラスの変数scoreにアクセスしたいが
privateなのでアクセスできません。
そこでプロパティを利用してScoreへアクセスすることで
Hogeクラスのprivateな変数scoreにアクセスすることができます。

先ほども述べましたが、値を代入する場合はsetが、値を参照したい場合はgetが呼ばれます。

使い方②

またプロパティは変数を関数のように使用することができます。
例えば、入力された値によってはエラーを返す。
という実装が可能になります。
もう一つ例を見て見ましょう。
先ほどのスクリプトに少し訂正を加えました。

//MyClassからHogeクラスのprivate 変数scoreにアクセスしたい
public class MyClass :MonoBehaviour
{
   void Start()
   {
    Hoge hoge=new Hoge();
    hoge.Score=-10;
    Debug.Log(hoge.Score);
    }

}

public class Hoge
{
 [SerializeField]
    private int score;

    public int Score{
    get{
        return score;
    }
    set{
       if(value<=0){
          Debug.Log("マイナスの値は入力できません");
              return;
       }
       score=value;
    }
}
}

今回の例では、マイナスの値をscoreに代入しようとすると
if分の制限により代入できません。
このように関数のような振る舞いを持たせることができます。

上記の仕様例では、SerializeFieldのattributeを使って
インスペクターに値を表示しているのでscoreの変数とプロパティを二つ用意していますが
インスペクターに値を表示しない場合であれば、
以下のコードのように短縮して記述することもできます。

public class Hoge
{
    public int score{get; set;}
}

まとめ

以上プロパティの使い方でした。