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…

GameCenter(Social)

UnityからGameCenterにつないでみたくて試してみました。
主に使うのはSocialクラスです。Apple Game Centerだけでなく、XBoxのスコアボードにも共通のクラスでアクセスできるので便利。便利でシンプルなんだけど、構造が少し分かり辛く戸惑いました。
Continue…

PropertyDrawer

インスペクタに独自のプロパティ属性を作れる機能を試してみた。
スクリプト単位で拡張するCustomEditorと、プロパティ単位で拡張するPropertyDrawerがあるらしい。

今回は下記のサイトのPropertyDrawerでやるやり方をやってみた。とくにアレンジはなくそのままです。。
Qiita | 自分だけのPropertyDrawerを作ろう!

もう少し詳しい内容はこちらのスライドにあります。

Continue…