Programming Serendipity

プログラミングを中心に種々雑多に書き留めます

Unity5 メモ26

  • Start()などの戻り値
    MonoBehaviourの関数は戻り値をvoidではなくIEnumeratorにしても動作する。

  • List<>の内容を文字列化する(C#)

List<Object> list;  
list.ToString();  

とすると、"System.Collections.Generic.List 1[System.Single]"なる文字列が取得され、意図と異なる。
List<string>であればstring.Join(",", myList.ToArray());のようにできるがそれ以外の型の場合こうはできない。
そのため、StringBuilderを用いる必要がある。

StringBuilder builder = new StringBuilder();  
foreach (var obj in list)  
{  
    builder.Append(obj).Append(",");  
}  
string result = builder.ToString();  
string result = "";  
foreach (var obj in list)  
{  
    result += obj + ",";  
}  

ともできるが、C#での文字列同士の演算は重いため、上のクラスの利用が一般的になっている

  • コルーチン内でのタイムアウト処理
    コルーチンの内部での時間計測は不正確になる模様(deltaTimeを加算し続けて5秒まっても数値は0.7秒ほどしか進まなかった)。
    なので時間計測はUpdate()で行って、規定時間が過ぎたらタイムアウトとしてStopCoroutine()が手軽に感じられる。

  • StopCoroutine()

StartCoroutine("SomeFunc");  
StopCoroutine("SomeFunc");  

これは動かない。

var routine = StartCoroutine("SomeFunc");  
StopCoroutine(routine);  

これで意図通り動く。

  • foreachでループ中のインデックスを取得(C#)
foreach (var obj in rankingList.Select((value, index) => new {value, index}))  
{  
    builder.Append(obj.index + 1).Append(". ").Append(obj.value).Append("\n");  
}  
Debug.Log(builder.ToString());  
// output will be:  
// 1. 40.837  
// 2. 41.220  
// 3. 42.565  
// ...  

ref. http://nanoappli.com/blog/archives/2012