Unityな日々(Unity Geek)

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

外部ファイルへのパス

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"にアクセする場合...
f:id:yasuda0404:20120807221237p:plain

スクリプトは次のとおり。"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"にアクセしたい場合は(下のような状況)...
f:id:yasuda0404:20120807221633p:plain

"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、それぞれのプラットフォームに応じた対スクリプトを書けばよい。