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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

749閲覧

一定時間ごとに書き換わるファイルをunityで読む方法

meJ15

総合スコア55

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/11/09 02:52

編集2018/11/09 08:35

前提・実現したいこと

unityを使ってpythonで計算した結果を扱うために、
pythonで計算した値をcsvファイルに書き込み、その値をunityで読み取ろうとしています。

unityでファイルの中身を読み込み、その値に応じてアニメーションを再生させたいと考えています。
ただそのファイルが一定時間(約1.5秒ぐらい)で数値が変化するようにpythonで書いています。

python側でcsvファイルの値を書き換えても、unityの動作中はunityがその書き換えに対応できない問題が発生しました。

アニメーションはキャラクタを動かすものです。
キャラコントロール

問題の動画

発生している問題・エラーメッセージ

unityが参照するcsvファイルの中身の値を変えてもunityの動作が変わらない。

該当のソースコード

C#

1 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5using System.Linq; 6using System; 7using System.IO; 8 9public class RigControl2 : MonoBehaviour { 10 public GameObject humanoid; 11 public Vector3 bodyRotation = new Vector3(0,0,0); 12 public int a; 13 14 15 TextAsset csvFile; // CSVファイル 16 public int height; // CSVの行数 17 List<string[]> csvDatas = new List<string[]>(); // CSVの中身を入れるリスト; 18 19 RigBone leftUpperArm; 20 RigBone leftLowerArm; 21 RigBone rightUpperArm; 22 RigBone rightUpperLeg; 23 RigBone rightLowerLeg; 24 25 void Start () { 26 leftUpperArm = new RigBone(humanoid, HumanBodyBones.LeftUpperArm); 27 leftLowerArm = new RigBone(humanoid, HumanBodyBones.LeftLowerArm); 28 rightUpperArm = new RigBone(humanoid, HumanBodyBones.RightUpperArm); 29 rightUpperLeg = new RigBone(humanoid, HumanBodyBones.RightUpperLeg); 30 rightLowerLeg = new RigBone(humanoid, HumanBodyBones.RightLowerLeg); 31 } 32 33 void Update () { 34 double t = Math.Sin(Time.time * Math.PI); // [-1, 1] 35 double s = (t+1)/2; // [0, 1] 36 csvFile = Resources.Load("tesCSV") as TextAsset; // Resouces下のCSV読み込み 37 StringReader reader = new StringReader(csvFile.text); 38 39 // , で分割しつつ一行ずつ読み込み 40 // リストに追加していく 41 while (reader.Peek() > -1) // reader.Peaekが0になるまで繰り返す 42 { 43 string line = reader.ReadLine(); // 一行ずつ読み込み 44 csvDatas.Add(line.Split(',')); // , 区切りでリストに追加 45 height++; // 行数加算 46 } 47 48 // csvDatas[行][列]を指定して値を自由に取り出せる 49 Debug.Log(csvDatas[0][0]); 50 //Debug.Log(csvDatas[0][2]); 51 //Debug.Log(csvDatas[1][2]); 52 //Debug.Log(csvDatas[1][1]); 53 a = int.Parse(csvDatas[0][0]); 54 if (int.Parse(csvDatas[0][0])== 0 || a==0) 55 { 56 // 読み取った値が0の時の処理を書いています。 57 } 58 59 60 if (int.Parse(csvDatas[0][0])== 1 || a== 1 ) 61 { 62 //読み取った値が1の時の処理を書いています 63 } 64 65 if (int.Parse(csvDatas[0][0])== 2 || a==2) 66 { 67 //読み取った値が2の時の処理を書いています 68 } 69 } 70} 71

rightLowerLeg = new RigBone(humanoid, HumanBodyBones.RightLowerLeg);
とかはあまり関係ないです。(アニメーションに関係すること)

void Updateの中身は
unityのResourcsの中にあるtesCSVというファイルを読み込み、そのなかの文字を配列に保存しています
(ここのでcsvファイルは0,1,2のいずれかが一セル目に書いてあるだけです)
その文字をint型に変換して、0なら0のアニメーション、1なら1のアニメーションを流すようにしています。

int.Parse(csvDatas[0][0])== 2 || a==2)こうしている理由
unityを動かしているときにpublic変数aの値を変えてアニメーションが変わるかを確認するために作っています。これでアニメーションが変わることが確認できました。

ですので、unityが動作しているときに、csvファイルを書き換えて保存しても、unityにはその変化を読めない?プログラムになっているのかと思います。

下がpython側の重要な部分です。

python

1 label = random.randint(0,2) 2 3   with open(r'C:\Users\1\Desktop\2\3\reHumanoid\Assets\Resources\tesCSV.csv', 'w', newline='') as csv_file: 4 5 title = [label] 6 writer = csv.writer(csv_file) # writerオブジェクトの生成 7 writer.writerow(title) # 1行目に書き込み 8 9 n = n + 1 10 time.sleep(1.5) #csvファイルを作ってから1.5秒間まってから次の信号を受け取りcsvファイルを作る。 11

python側はただ1.5秒ぐらいの間隔でcsvファイル1セル目を0,1,2ランダムに書き換える
だけのプログラムにしています。

試したこと

python側でのcsvファイルの書き換えは成功しているのは確認済みです。

unityを動かしながら、unityが参照しているcsvファイルの値を変えても、アニメーションが変わりません。
unityが動いているときは、csvファイルの値を変更しても参照はできないのか?
C#のupdate関数なら何度も繰り返す処理ならので、
一回一回Resourceの中のcsvファイルを開いて確認できるのではないか?
他に良い方法があれば教えていただけると助かります。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

CSV読み込みでcsvDatas.Addとどんどん追加しているので、csvDatas[0]は変化しないのではないでしょうか。
読み込む前にクリアするなりすればどうでしょう?

というか、必ず1行のCSV(もしくは1セットのデータしかいらない)のであれば、Listで持ってなくてもいいのでは?

投稿2018/11/09 03:15

編集2018/11/09 03:29
YAmaGNZ

総合スコア10251

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meJ15

2018/11/09 07:14

回答ありがとうございます・ while (reader.Peek() > -1) // reader.Peaekが0になるまで繰り返す { string line = reader.ReadLine(); // 一行ずつ読み込み a = int.Parse(line); height++; // 行数加算 } Debug.Log(a); 上のように書き換えました。pythonのプログラムを動かさずにunityとcsvファイルを用いて試してみました。 unityを実行しながらcsvファイルを書き換えるとDebug.Log(a);により変えた値になりました。また その値に応じたアニメーションをするようになりました。 しかしpythonと組み合わせると、 unity実行しながら pythonでcsvファイルの値を変えても,ほかの画面をアクティブウィンドウにしてから、unityの画面をアクティブウィンドウにしないとunityがcsvファイルの違いを読むことができません。(pythonでcsvファイルの値がかわってからcsvファイルをアクティブウィンドウにすると値が目の前で変わります) その後またpythonで値が変わっても、unityの動きは変わらず、ほかの画面をアクティブウィンドウにしてからunityをアクティブにしないといけません。 何が問題なのでしょうか? イメージでは unityでResourcesのなかにあるtesCSVの 一セル目を読んでそれをaに入れる aによりアニメーションさせる という動作を繰り返しているはずなのですがunityがcsvファイルの変化にunityをアクティブにしないと対応できないです。
YAmaGNZ

2018/11/09 07:25

Assets\Resourcesではなく、他のフォルダで行った場合はどうでしょうか? Unityはほぼ分からないので、あいまいな話しかできませんが、Assets\Resourcesは読み取り専用らしいです。
meJ15

2018/11/09 08:17

コメントありがとうございます。 他のフォルダで参照する場合も試してみます。
guest

0

python側が怪しいのですが
ファイルはflushしていますか?

投稿2018/11/09 08:09

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meJ15

2018/11/09 08:29

with open(r'C:\Users\jump1268\Desktop\fourth year\unity for reserch\reHumanoid\Assets\Resources\tesCSV.csv', 'w', newline='') as csv_file: title = [label] writer = csv.writer(csv_file) # writerオブジェクトの生成 writer.writerow(title) # 1行目に書き込み csv_file.flush() このように最後にflush()を入れてみましたが、状況は変わらないです。 ほかのウィンドウをアクティブにしてからunityをアクティブにしないとアニメーションが変わりません。
asm

2018/11/09 09:54

そうですか・・・ Resources.Load("tesCSV") だとキャッシュされるのかもしれませんね FileStreamか、いっそのことCreateFile/ReadFileをP/invokeで呼び出す必要がありそうです
meJ15

2018/11/11 04:00

回答ありがとうございます それぞれのプログラムを検討してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問