Unityな日々(Unity Geek)

Unityで可視化アプリを開発するための試行錯誤の覚書

XMLParserを使う その1

Unity Scriptsの[Download UnityScript XML Parser:title=Unityscript XML Parserへのリンク]をクリックし、ZIPをダウンロードする。
f:id:yasuda0404:20120805084349p:plain

解凍すると3つのjsスクリプトファイルができる。
f:id:yasuda0404:20120805084419p:plain

これらをUnityのプロジェクトビューにドラッグ&ドロップ
f:id:yasuda0404:20120805084738p:plain

パースするスクリプトを新規作成する(下の例では"XMLParser.js"を新規作成)
f:id:yasuda0404:20120805085243p:plain

次のTwitterXMLから、最初のstatusタグのuserタグ-idタグのテキストを読み取ることを考える。
f:id:yasuda0404:20120808172811p:plain

スクリプトは次のようになる。
注)#pragma strict をコメントアウトすること。 "Type 'Object' does not support slicing"のエラーが出てしまう。

//#pragma strict
import XMLNode;
import XMLNodeList;
import XMLParser;
//Ref.   http://dev.grumpyferret.com/unity/

var url1 = "http://twitter.com/statuses/user_timeline/ataro44.xml";	//my twitter post list
private var val:String;

function Start () {
	Debug.Log("XMLをパースする");
	var getXML : WWW = new WWW(url1);
 	yield getXML;
 	
	if (getXML.error != null) {
		Debug.Log("XML not read:"+url1);
		
	}else{
		//XML available
		Debug.Log("XML read");
 		Debug.Log( getXML.text );
 		var parser = new XMLParser();
		var node:XMLNode = parser.Parse( getXML.text); 
		val =  node["statuses"][0]["status"][0]["user"][0]["id"][0]["_text"];

	}
}

function OnGUI () {
	//Screen on Display
    GUI.Label (Rect (10, 30, 800, 20), "id="+val);
}

参考:XMLデータのパース - UnityDocs

ビルドする

File-Build Settings... を選択
f:id:yasuda0404:20120805092021p:plain

ビルドするシーンを選択する。現在開いているシーンファイルを選択する場合は、"Add Current"をクリック
f:id:yasuda0404:20120805092059p:plain

詳細設定は下部の"Player Setting..."をクリックし、Player Settingsウィンドウでパラメータを設定する。下の例では、Company Name, Product Name, Default Iconを設定。
f:id:yasuda0404:20120805092310p:plain

Resolution and Presentationでは、デフォルトでの解像度やフルスクリーン表示などが設定できる。
f:id:yasuda0404:20120805092528p:plain

”Build"ボタンでビルドを実行。
f:id:yasuda0404:20120805092605p:plain
保存先を指定する。
f:id:yasuda0404:20120805092651p:plain

WWWクラスで外部ファイルを読みこむ

wwwクラスを使ってUnityで外部ファイルを読み込むことができる。

http://images.earthcam.com/ec_metros/ourcams/fridays.jpgの画像ファイルを読み込む例。

#pragma strict
var url = "http://images.earthcam.com/ec_metros/ourcams/fridays.jpg";

function Start () {
     // Start a download of the given URL
    var www : WWW = new WWW (url);

    // Wait for download to complete
    yield www;

    // assign texture
    renderer.material.mainTexture = www.texture;
}


ローカルファイルの場合は"file://"を使う。Macの場合、"file://ボリューム名/Users/...”となる。例えば下の通り。
この例では"XOOMS14"がボリューム名、"ay3844"はユーザ名。ユーザ名までのフルパス("file://XOOMS14/Users/ay3844/")はよく使うので、覚えておくと便利。

#pragma strict
var url = "file://XOOMS14/Users/ay3844/Documents/_development/unity/trial/trial01/publish/data/pict01.jpg";

function Start () {
     // Start a download of the given URL
    var www : WWW = new WWW (url);

    // Wait for download to complete
    yield www;

    // assign texture
    renderer.material.mainTexture = www.texture;
}

上の例は画像データのため、textureプロパティで取り出しているが、テキスト、ムービーなどリソースの種類に応じてプロパティがある。

プロパティ名 種類 対応クラス
text テキスト String
bytes バイトデータ Byte Array
texture 画像 Texture2D
movie 動画 Movie Texture

パスについて

ローカルデータにアクセスするには、"file://"+絶対パスで記述する
Macの場合、"file://ボリューム名/Users/...”となる。

"file://XOOMS14/Users/ay3844/Documents/_development/unity/trial/trial01/publish/data/pict01.jpg";

この例では"XOOMS14"がボリューム名、"ay3844"はユーザ名。ユーザ名までのフルパス("file://XOOMS14/Users/ay3844/")はよく使うので、覚えておくと便利。


いちいち長いフルパスを明示的に指示するのは面倒なので、スクリプトでパスを取得できないかと考えるだろう。現在のunityファイルの絶対パス

var path =  Application.dataPath;

で取得できるが、この場合、/Users/...以降のパスとなり、ボリューム名までは取得できない。

/Users/ay3844/....