困った時の自分用メモ

読んだ本を考察してメモったり、自分でいじった物の感想をメモったりする場。週1更新を目指します。

MACスタンドアローンアプリの話〜Unityでハマったポイント〜

MAC上で動くデスクトップアプリを作ろうと思った。 実は、初めての試みだった。 そして、案の定色々ハマったので、その備忘録をしておく。

○要件
今回作ろうと思ったのは、ボタンを押したら音を鳴らすというアプリだ。
ただ、アプリに内包されている決められた音を鳴らすのではなく、音は外部から差し替え可能で、アプリは動的に配置されている音データを読み込んで鳴らすという事が必要な要件だった。

つまり、Unityで作る場合は、Resourcesフォルダに格納するのではなく、 出力される実行ファイルから辿れる階層にあるフォルダに存在する音データを、 読み込めなければならない。

○発生した問題
一番ネックになるのは、外部ファイルの読み込みだが、ファイルその物は下記方法で読み込めた。

   using (WWW www = new WWW("file:///" + path))
    {
        while (!www.isDone) {
            if (string.IsNullOrEmpty(www.error) == false) {
                break;
            }
            yield return null;
        }

        if (string.IsNullOrEmpty(www.error) == false) {
            callback(null);
            yield break;
        }

        AudioClip audioClip = www.GetAudioClip(false, true);
        if (audioClip.loadState != AudioDataLoadState.Loaded) {
            callback(null);
            yield break;
        }

        callback(audioClip);
    }

問題は、パスの求め方だ。 ひとまず、

Directory.GetCurrentDirectory()

これを使うようにしたのだが、ビルドしたAPPと、どこかネットを経由(=他人に渡した状態)だと、パスが変わってしまった。

デスクトップ上にフォルダを置いて、その中に実行ファイルがあると
/Users/UserName/Desktop/FolderName/AppName
となるのだが、
後者の場合だと、全く異なるパスになった

※追記
のだが、この記事を書いている段階でパスの差が出なくなってしまったので、いったん置いておく。

解決方法としては3流だが、
/Users/UserName/Desktop
までのパスは同じと仮定し、ユーザー名は

Environment.UserName

これで取れるので、誰の環境でもパスが取れる。

○さらに別の問題
これでビルドしたアプリだが、OSバージョンが若干古い他人の環境で実行してもらったところ、Unityロゴが表示された後に強制終了してしまった。
正直、ここまでくると調査する気にもならなくなってきたので、XCodeでネイティブアプリを直接作る方向に切り替えた。

なので、次回以降はMAC上でアプリを作成する備忘録を書いていく。