Programming Serendipity

気まぐれに大まかに生きるブログ

Unity5 メモ14

  • プロパティ(C#
    例えば、値を代入するとき0以下なら0に、255以上なら255にしたい場合、
int a; // フィールド  
void setA(int value){  
    // 関数の中で直接チェック  
    if(value < 0){  
        a = 0;  
    }  
    else if(value > 255){  
        a = 255;  
    }  
    else{  
        a = value;  
    }  
}  

とするが、プロパティに記述することで、このような値のチェックなど、関数内で書くコードを軽減できる。

int _a; // フィールド  
int a{ // プロパティ  
    get{return _a;}  
    set{  
        if(value < 0){  
            _a = 0;   
        }  
        else if(value > 255){  
            _a = 255;  
        }  
        else{  
            _a = value;  
        }  
    }  
}  

ここで、this.a = 2689;のようにすると、2689がsetにvalueとして渡され、set内の条件分岐によって255が代入される。

  • 自動実装プロパティ(C#)
    int a{get; set;}
    とすると、
int __a;  
int a{  
    get{return __a;}  
    set{__a = value;}  
}  

と宣言したのと同じことになる。ただ、これだと
int a;
と事実上意味は同じであり、自動実装プロパティの使いどころは、
int a{get; private set;}
のように、取得はpublicだが、代入はprivateというようにしたい場合など。

  • Unityでの自動実装プロパティ
    Unityでは、自動実装プロパティを使って
    public int lifeMax{get; set;}
    とすると、エディタ側のインスペクターに表示されない。([SerializeField]を付けても同様)
    Vexe Framework
    などを使用してインスペクターをカスタマイズするか、自動実装せずに手で書く必要がある。
[SerializeField] int _lifeMax;  
public int lifeMax{  
    get { return _lifeMax; }  
    private set { _lifeMax = value; }  
}  
  • LINQ(Language Integrated Query)(C#)
    forやifなどが絡むコードを簡潔に(場合によっては1行で)書けるようにする機能。
    using System.Linq;を追加して使用する。
    例えば、直前に選択したメニュー以外のメニューを全て非アクティブにするという処理の場合、以下のようにもなる。
    LINQ不使用
for (int i = 0; i < menuList.Length; ++i)  
{  
    if (i != (int)prevMenu)  
    {  
        menuList[i].SetActive(false);  
    }  
}  

LINQ使用

menuList.Where(x => x != menuList[(int)prevMenu]).ToList().ForEach(x => x.SetActive(false));  

無論この場合、LINQのほうはリスト化しているのでパフォーマンスは少し落ちるが、1行で書け、ループカウンタが不要でバグが入りにくいコードになっている。
ただし懸案事項として、UnityでLINQを使用し、iOSの実機で動かした際にエラーになるケースが多数報告されている(下記記事内で対策も紹介されている)。
Unity+iOSでエラーになるLINQのまとめ