Unityでは外部ファイルへのアクセスがやや面倒。ややこしいので具体例で示す。以下、Mac環境です。
まず現在のアプリケーションのパスは
Application.dataPath
で取得できる。ただし、実行環境でその値は異なる。(参考:Unity Script Reference – Application.dataPath
Unity Editorからの実行 | (プロジェクトフォルダ)/Assets |
appファイルからの実行、Mac | (appバンドル)/Contents |
exeファイルからの実行、Win | (実行ファイル名_data)フォルダ |
Web Playerからの実行 | (unityデータファイルへのフルURL) |
例えば、Projectビュー(=Assetsフォルダ)の下にtextureと言うフォルダを作り、その中にある"pict01.jpg"にアクセする場合...
スクリプトは次のとおり。"XOOMS14"はボリューム名。
#pragma strict private var url:String; function Start() { url = "file://XOOMS14" + Application.dataPath + "/texture/pict01.jpg"; var www : WWW = new WWW (url); // Wait for download to complete yield www; // assign texture renderer.material.mainTexture = www.texture; } function OnGUI () { GUI.Label (Rect (10, 10, 1200, 20), url); }
では、Unity Editorではなく、Mac上でビルドしたappファイル("readFile.app")から、appと同じ階層にあるdataフォルダの下の"pict01.jpg"にアクセしたい場合は(下のような状況)...
"url="の部分を次のように書き換える
function Start() { url = "file://XOOMS14" + Application.dataPath + "/../../data/pict01.jpg"; (以下同じ)
Application.dataPathは、...readFile.app/Contents を指しているので、2つ上の階層=readFile.appがあるフォルダに戻り、そこにあるdataファルダ、その下のpict01.jpg、と言うパスになるわけだ。
このように、実行プラットフォームに対応してスクリプトを変更する必要がある。現在のプラットフォームは、
Application.platform
で参照できるので、この値で処理を変えれば良い。なおプラットフォーム名は、RuntimePlatformに定義されている。
上の例のように、(Mac上の)Unity Editorとappの両方に対応する場合は次のようになる。
function Start() { // Start a download of the given URL if (Application.platform == RuntimePlatform.OSXEditor){ url = "file://XOOMS14" + Application.dataPath + "/texture/pict01.jpg"; }else if (Application.platform == RuntimePlatform.OSXPlayer){ url = "file://XOOMS14" + Application.dataPath + "/../../data/pict01.jpg"; }else{ url = ""; }
Mac以外でも、Windows上のEditor/exe, iPhone, Android、それぞれのプラットフォームに応じた対スクリプトを書けばよい。