前提・実現したいこと
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ファイルを開いて確認できるのではないか?
他に良い方法があれば教えていただけると助かります。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/09 07:14
2018/11/09 07:25
2018/11/09 08:17