質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.77%

Unityでリアルタイムで更新される外部ファイルを読み込みたい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,731

score 12

C言語で書き出されるcsvファイルをUnityでStreamReader()を用いて読み込んでいます。
CSVファイルは随時更新され,UnityがCSVファイルを読み込み、その中身に適したテクスチャをUnityで貼りたいと考えています。

以下はシステムの流れになります。

  1. スペースキー入力
  2. C言語が、CSVファイルを書き出し、フラグ(csvファイル)をたてる
  3. Unityはフラグを確認し、立っていたらCSVファイルを読み込む
  4. CSVファイルの内容に適したテクスチャを貼りつける

これを繰り返すシステムになります。

Unityのエディタ上ではうまくいったのですが、ビルドをすると、外部に置いていたCSVファイルが見つからないと言われます。
エディタ上では適応されたので、ファイルの場所は間違ってないと思います。が、ビルドすると場所が変わってしまうのでしょうか?

また、Assets/StreamingAssetsにも置いてみましたが、そこでは組み込まれてしまうため、テクスチャが変更されません。
ビルドをしたときのCSVファイルに従ったテクスチャが貼られています。

なにか方法があれば、教えていただければと思います。

/* この上部でテクスチャの宣言 */
void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
       {
           StartCoroutine("WaitCoordinateLeft");
       }
}

IEnumerator WaitCoordinateLeft()
{
       int e, c, p, s;
       string str1 = "error";
       string str2 = "error";

       for (int count = 0; count < 10; count++)
       {

           /* フラグの確認 */
           while (true)
           {
               //string f = Application.dataPath + "/StreamingAssets/flag_coordinate.csv";
               string f = Application.dataPath + "../../../csv/flag_coordinate.csv";
               StreamReader sr = new StreamReader(f, Encoding.GetEncoding("Shift_JIS"));
               str1 = sr.ReadToEnd();

               int sets = int.Parse(str1);

               Debug.Log(str1 + " : " + sets);
               sr.Close();
               if (sets == count)
               {
                   break;
               }
               else
               {
                   Debug.Log("now loading...");
                   break;
               };
           }

           //Debug.Log("コーディネートの読み込み " + count);

           /* コーディネートの読み込み */ 
           //string f2 = Application.dataPath + "/StreamingAssets/coordinate.csv";
           string f2 = Application.dataPath + "../../../csv/coordinate.csv";
           StreamReader sr2 = new StreamReader(f2, Encoding.GetEncoding("Shift_JIS"));
           str2 = sr2.ReadToEnd();

           sr2.Close();

           var csvDatas = str2.Split(new[] { ',', '\n' }, StringSplitOptions.RemoveEmptyEntries);

           e = int.Parse(csvDatas[1]);
           c = int.Parse(csvDatas[2]);
           p = int.Parse(csvDatas[3]);
           s = int.Parse(csvDatas[4]);

       /* コーディネートの設定 */
           SetEye(e);
           SetCloth(c);
           SetPattern(p);
           SetShoes(s);

           Debug.Log("コーディネートの設定" + (count + 1));
           Debug.Log("Left Coordinate " + count + " is " + e + " " + c + " " + p + " " + s);

           Flag.CatchFlag(count);
           //string f3 = Application.dataPath + "/../../csv/flag_coordinateSets.csv";
           //StreamWriter sw = new StreamWriter(f3, false, Encoding.GetEncoding("Shift_JIS"));
           //sw.WriteLine(count);
           //sw.Close();

           yield return new WaitForSeconds(12);
        }
}
int main(){
    int c;                                        //現対戦数
    if (GetAsyncKeyState(VK_SPACE)){        //スペースキー入力により開始

        /* 各対戦 */
        for (c = 0; c < NUMBER - 1; c++){
            printf("%d対戦目\n", c + 1);

            select_individual();            //対戦する個体の選択
            OutputChoiceIndividual();        //対戦する個体をunityに渡す
            printf("%d対戦個体:%d vs %d\n", c + 1, D.indivi[0], D.indivi[1]);

            Check_coordinatie(c);            //コーディネートを出力しましたよ

            EyeTrack();                        //視線情報の取得
            OutputGazeposi();                //視線位置の出力

            judgement_game();                //勝敗判定
            calclation_fitness();            //評価値計算
        }
    }

    return 0;
}

void OutputChoiceIndividual(){
    FILE *fci;

    sprintf(F.nIndividual, "..\\..\\..\csv\\coordinate.csv", C.NumG);
    //sprintf(F.nIndividual, "..\\..\\..\\DisplayCoordinate\\Assets\\StreamingAssets\\coordinate.csv", C.NumG);

    /* ファイルオープン */
    if ((fci = fopen(F.nIndividual, "w")) == NULL){
        printf("Individualファイルオープン失敗\n");
        exit(-1);
    }

    for (int i = 0; i < 2; i++){
        for (int j = 0; j < 5; j++){
            fprintf(fci, "%d, ", CG[D.indivi[i]].decimal[j]);
            printf("%d, ", CG[D.indivi[i]].decimal[j]);
        }
        fprintf(fci, "\n");
        printf("\n");
    }

    fclose(fci);
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • stdio

    2019/01/22 16:49

    いったい何がしたいのか分からない。
    リアルタイムで更新される外部ファイルを読み込みたいと言われましても...
    Unityではそのような環境依存のやり方は嫌われてますよ。

    一番の原因はc側でCSVをクローズしていない事ですが、
    このままでは判断できないので、ソースコードをアップして下さい。

    キャンセル

  • fm86

    2019/01/22 17:16

    申し訳ありませんでした。
    ソースコードを追加させていただきました。

    キャンセル

回答 2

checkベストアンサー

+1

Application.dataPathを使ってパスを取得していますが、これは相対的なものなので、ビルド時に場所が変わってしまいます。

絶対パスで指定してあげるか、条件分けで階層を変える必要がありますね

おそらく

  string f = Application.dataPath + "../../../csv/flag_coordinate.csv";


の「../」の数を増やすか減らす必要があると思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

+1

最初にビルドしたとき、exeファイルを生成する場所を指定したはずです
ですから、「ビルドすると場所が変わる」が正しいと思います

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る