コルーチンについて

あまり理解せずにコルーチンを使用していたので、もう少しちゃんと理解しようと見直してみた。
そもそもコルーチンとは。。。
以下Wikipediaより。

コルーチン(英: co-routine)とはプログラミングの構造の一種。サブルーチンがエントリーからリターンまでを一つの処理単位とするのに対し、コルーチンはいったん処理を中断した後、続きから処理を再開できる。接頭辞 co は協調を意味するが、複数のコルーチンが中断・継続により協調動作を行うことによる。
サブルーチンと異なり、状態管理を意識せずに行えるため、協調的処理、イテレータ、無限リスト、パイプなど、継続状況を持つプログラムが容易に記述できる。
コルーチンはサブルーチンを一般化したものと考えられる。コルーチンをサポートする言語には Modula-2、Simula、Icon、Lua、C#、Limbo などがある。マルチスレッドで原理的には同じことができるため、現在はそちらが使われるケースが多い。

ということで、処理を中断し再び呼び出すと続きから再開できるということのようです。
Continue…

NGUIJson

NGUIにもjsonを扱うクラスがあった。

string json = www.text;
Hashtable hash = (Hashtable)NGUIJson.jsonDecode(json);
ArrayList data = (Hashtable)hash["data"];
string id = (string)hash["id"];

こんな感じで使える。

2Dの際のスクリーンの座標

2Dの際にはカメラのモードが正投影(Orthographic)になる。その際にSizeという値があるけどそのサイズはスクリーンの縦のサイズの半分の高さを意味している。
Camera.orthographicSize
なので、1136pxの縦幅に対してdot by dotにしたいときにはSizeを568にする。
ただ物理演算をさせたいときには、Unityの1unitは1mとなっているので、dot by dotにしてしまうと100m単位のオブジェクトなどになってしまうのでdot by dotとして扱わない場合もある。
その際には

// 画面幅
Screen.width * Camera.main.orthographicSize / (Screen.height / 2)

// 画面高さ
Screen.height * Camera.main.orthographicSize / (Screen.height / 2)

こんな感じで画面の幅と高さを取得できる。
Spriteの設定のPixels To Unitsもものの大きさに合わせて設定する。

GetComponentInChildrenがnullになる

なんでGetComponentInChildren()がnullになるのかと調べてみたらどうやらGetComponentInChildren()はアクティブでないGameObjectのコンポーネントは見つけてくれないらしい。
なので、AwakeやStartで取ろうとしてもnullになることがある。

参考 : unityAnswers > Possible to make GameObject.GetComponentInChildren() check inactive objects?

ただ、GetComponentsInChildren(bool includeInactive) この引数をtrueにすれば非アクティブなコンポーネントも配列型になるけど取得できた。通常のGetComponent()でも非アクティブなコンポーネントが取得できる。
使うタイミングで分けるのがよさそう。

ローディング

Unityでローディングをする際のテスト。基本的にはWWWクラスで簡単に処理ができる。FlashでいうURLLoaderのような感じだけどもう少し簡易的に扱える。
今回は画像ならGUI.Boxで画像を表示し、音ならAudioSourceで音を鳴らし、それ以外であればGUI.TextFieldにてテキストを表示させるようにしてみた。
音についてはUnityはmp3を外から取ってきて鳴らすというのはサポートされていないそうで非圧縮音源かoggフォーマットのみ。

基本的な部分はすごく簡単で

/**
 * データのロード。
 */
private IEnumerator LoadData(string url) {
	this.www = new WWW(url);

	yield return this.www;

	// ダウンロード後の処理
}

こんなメソッドを用意してあげて、あとは呼び出すだけ。
ローディング状況はWWW.progressで取れる。
エラーについてはWWW.errorがnullでなければエラーが発生している。
Flashと同様に別のドメインのファイルを見にいくときにはcrossdomain.xmlの設置が必要になってくる。
Continue…

UnityでXMLを扱う

前回のjsonに引き続きXMLの読み込みのテスト。
この辺はFlashと同じような扱いでできた。
XMLをDOMとして扱うのであればこれでいいんだけど、SAXとして扱う場合はXmlReader.Create()を使うと思う…けどよく分からなかったけどこの辺が参考になるのかしら。
Continue…

UnityでJsonを扱う

UnityでJsonを扱うにはいくつかライブラリがあるようです。
生存日記 | UnityのJSONパーサ
この中でJSON ObjectLitJSONを扱ってみました。

(2014.06.28 追記 : NGUIにもJsonを扱うNGUIJsonがあった

JSONObjectのライセンスはLGPL2.1と書いてあるんですが、DLしたものには特に明記はなく、Asset Storeに並んでいるものも特に明記はしていないのでこちらが適応されると思っていいんでしょうか…
LitJSONの方はパブリックドメインなので問題なく自由に使えるようです。
Continue…

拡張メソッド

組み込みのクラスやライブラリのクラスを拡張したいときに使える拡張メソッドというのがある。
staticなクラスを作りそこにあるメソッドがまるで自身のクラスのメソッドのように扱える。
staticクラスのメソッドになるので、自身のプライベートなメソッドやプロパティにはアクセスができない。

例えば
A だと
###
#A#
###
のように自身の文字列を囲みの文字に変えるよう機能を拡張する場合は

static class StaticStringExtensions {
	/**
	 * 「#」で文字を囲む。
	 */
	public static string BorderSharp(this string s) {
		string border = "";

		for (int i = 0; i < s.Length + 2; ++i) {
			border += "#";
		}

		string blockStr = "";
		blockStr = border + "\n";
		blockStr += "#" + s + "#" + "\n";
		blockStr += border + "\n";

		return blockStr;
	}
}

使い方は

static class StaticStringExtensions {
using UnityEngine;

// テストクラス
public class StringTest : MonoBehaviour {
	public void Start() {
		Debug.Log("ABCDEFG".BorderSharp());
		Debug.Log(StaticStringExtensions.BorderSharp("HIJKLMN"));

		Debug.Log("OPQRSTU".BorderLine());
	}
}

自身の作ったクラスなんかであればpartialというキーワードを付けたクラスを作るとそのクラスを拡張できる。Objective-Cでいうところのカテゴリの様な感じでしょか?

NGUI スクロールビューについて

NGUIについてまだ使ったことのないコンポーネントがたくさんあるので今回はUIScrollViewあたりを触ってみました。
この辺は非常に良くできていてスクリプトを書かずに実装までできてしまう。
分かりやすいムービはこちら。

Continue…