FC2ブログ
    03 «1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.» 05

    ハルシオンシステムの気ままBlog

    株式会社ハルシオンシステムのメンバーが送る、UnityやらJavaやらの技術的話題から、自社開発のアプリの宣伝とかとかのブログです。ほんと気ままにいきたいと思います。更新日は毎週 月 木でっす!

     

    【Unity】テキストファイル読み込み? 

    明日はあったかくなるようですね。
    今日は雨が降るとか雪が降るとか言ってました。
    いきなりの温度変化で風邪ひきやすくなりそうですね!みなさんお気をつけて!

    以前髪の毛ピンクにしたって言いましたけど、色が落ちて茶色になりました。
    短い期間でしたということで、毎度おなじみ月曜の坂内です。

    ええと、テキストファイルなんかをUnityで使おうとしてたら嵌りました。
    そこの対処法なんぞを、簡単に書いてみようかと思います。
    え?テキストファイルなんか使わない?まぁまぁ そういわずに・・・

    適当にAssetのフォルダの中に「Document」フォルダを作り、そこに「test.txt」を
    置き、以下のようなコードを書いたところ・・・・


    public class Test : MonoBehaviour {
    public UILabel label;

    void Start(){
    string txtBuffer = "";
    string textFileName = "test.txt";
    string description = "";
    string path = Application.dataPath + "/Document/" + textFileName;
    FileStream file = new FileStream(path,FileMode.Open,FileAccess.Read);
    StreamReader reader = new StreamReader(file);
    while((txtBuffer = reader.ReadLine()) != null){
    description = description + txtBuffer + "\r\n";
    }
    label.text = description;
    }
    }


    普通に動くジャマイカ!

    なーんだと思っていたとこ、Androidにいれたら動かない!!

    いやー 嵌りました!

    エラーを見るとこんなのが出てます。

    IsolatedStorageException: Could not find a part of the path "/data/app/test.company-1.apk/Document/test.txt".

    で、調べたところ、以下のようなことが書いてました。

    で、streamingAssetsを使うことに?。
    これはAssetsの直下に「StreamingAssets」というフォルダを置いて、ここいテキストファイルを配置します。
    公式ではStreamingAssetsについて、以下のように書かれています。

    「Unityプロジェクトにおける StreamingAssets と呼ばれるフォルダに配置したファイルはターゲットとするプラットフォームの特定のフォルダにそのまま保持されます。フォルダ名は Application.streamingAssetsPath プロパティを取得することが出来ます。参考のため、プラットフォームにより、このファイルのパスは異なります:」
    詳細はこちら http://docs-jp.unity3d.com/Documentation/Manual/StreamingAssets.html

    で、AndroidはWWWクラスを使えと。


    using UnityEngine;
    using System.Collections;
    using System.IO;

    public class Test : MonoBehaviour {
    public UILabel label;
    TextReader txtReader;
    string description;

    void Start(){
    StartCoroutine("LoadText");
    }

    IEnumerator LoadText(){
    string txtBuffer = "";
    string textFileName = "test.txt";
    string path = "";
    #if UNITY_EDITOR
    path = Application.streamingAssetsPath + "\\" + textFileName;
    FileStream file = new FileStream(path,FileMode.Open,FileAccess.Read);
    txtReader = new StreamReader(file);
    yield return new WaitForSeconds(0f);
    #elif UNITY_ANDROID
    path = "jar:file://" + Application.dataPath + "!/assets" + "/" + textFileName;
    WWW www = new WWW(path);
    yield return www;
    txtReader = new StringReader(www.text);
    #endif
    while((txtBuffer = txtReader.ReadLine()) != null){
    description = description + txtBuffer + "\r\n";
    }
    label.text = description;
    }
    }


    一応これで、PCでの起動はOKです。

    ではAndroidで実行してみましょう・・

    うごいた!!

    ってことで、WWWを使うらしいです。

    んで、その場合、yieldを使って、WWWでの取得を確認した後じゃないと、動かないので
    こんな感じのコードになるのかなーと。

    まぁ動くまで色々悩んで1日すぎちゃったのは過去のこと!

    一応以上ですが、え?もっと簡単な方法あるよー!って情報持ってる方いましたら、
    コメントなんぞで教えてくれると、泣いて喜びます!

    アデュー!

    Category: 開発日記(Unity)

    tb 0 : cm 0   

    コメント

    コメントの投稿

    Secret

    トラックバック

    トラックバックURL
    →http://halcyonsystemblog.jp/tb.php/78-ccba54a3
    この記事にトラックバックする(FC2ブログユーザー)