2014年1月19日日曜日

C#で配列を固定定数値で宣言する~Unity

C#では配列宣言時に constにて固定定数を配置できない。これの回避方法とUnityで使用する際についてのメモ。
 

■まずは.netの話

回避策として.netframework2.0から追加された ReadOnlyCollection クラスを用いると似たことができる。(Unityは.netクラスを継承してるらしいので特にUnity上での準備は必要ない)

【数値型】

C++:
  const int Test[] = { 1, 2, 3, 4, 5 };
C#:
  readonly ReadOnlyCollection<int> Test = Array.AsReadOnly(new int[] {
        1,2,3,4,5
    });

【文字型】


C++:
  const char Test[][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
C#:
  readonly ReadOnlyCollection<string> Test = Array.AsReadOnly(new string[] {
    "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
 });

【アクセス】

アクセス方法は普通に、
  Debug.Log( Test[0] );
等とする。

■Unityでの注意

【グローバルな固定定数】

public static を付けて宣言する。

  public static readonly ReadOnlyCollection<string> Test = Array.AsReadOnly(new string[] {
    "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"
 });

他のスクリプトから参照する場合は定義元スクリプトを特定する為に、

string s = ScriptName.Test[0];

等と、スクリプト名を指定する必要がある。ScriptName はAssetsのスクリプト名。
このアクセスの為にstaticが必要となる。

もしstaticを付記しない場合はインスタンスへのポインタ経由(厳密にはC#なのでポインタではないが)でアクセスが必要になる。
しかしそもそも固定定数を複数のインスタンスで個別に持つことがバイナリ効率で合理的とは思えないので、static付記した方が良いのではないかとは思う。



【必要なusing】

Unityの自動生成のC#ファイルにはいくつか uning文がデフォルトで付記されている。
しかしそれだけでは足りないので、以下をC#ファイルの先頭の using文の最後尾にでも付記する。

using System;      //(for Array)
using System.Collections.ObjectModel;    //(for ReadOnlyCollection)








-*---*---*---*---*-
constを用いた他の記述方法にて実装も可能なので特に「ReadOnlyCollectionじゃないとダメ」とこだわる必要もない。

が、ReadOnlyCollection を用いると比較的スマートな記述ができるので知っておいて損はない。

しかしこの記法は.net必須な記法なので他のC++処理系への移植性は低くなる欠点がある。使い回せそうな処理系非依存性の高いクラスは用いない方が良い気もする。


0 件のコメント:

コメントを投稿