前提・実現したいこと
切った木を保存して次回ゲーム起動時に切れたままにしたい
unityコルーチンで重い処理を素早く終わらせたい
発生している問題・エラーメッセージ
Terrainの木の位置情報、高さなどをクラスのパラメータ配列に入れてから
BinaryFormatterでシリアライズしてからEasysaveで保存する処理
クラスのパラメータ配列に入れるとき保存する木の本数が5万本あるので
コルーチンで実行しないとクラッシュしてしまう
for文の中にyield return null;を入れるとクラッシュしないが
5万本の木のデータを配列に入れるスピードが遅すぎるので
クラッシュせずにスピーディに処理を完了させる方法はありませんか?
該当のソースコード
C#
1private IEnumerator SaveCoroutine() 2{ 3 4 TerrainTreeData treeData1 = new TerrainTreeData(); 5 6 //現在のテライン上の木の本数 7 int treeInstanceCountA1 = TerrainA1.terrainData.treeInstanceCount; 8 9 10 treeData1.HeightScaleA1 = new float[treeInstanceCountA1]; 11 treeData1.PositionXA1 = new float[treeInstanceCountA1]; 12 treeData1.PositionYA1 = new float[treeInstanceCountA1]; 13 treeData1.PositionZA1 = new float[treeInstanceCountA1]; 14 treeData1.PrototypeIndexA1 = new int[treeInstanceCountA1]; 15 treeData1.RotationA1 = new float[treeInstanceCountA1]; 16 treeData1.WidthScaleA1 = new float[treeInstanceCountA1]; 17 18 //この部分の計算に時間がかかってしまう 19 //yield return null;を書かないとUnityエディタがクラッシュしてしまう 20 //treeInstanceCountA1の数が50000 21 for (int i = 0; i < treeInstanceCountA1; i++) 22 { 23 treeData1.HeightScaleA1[i] = TerrainA1.terrainData.treeInstances[i].heightScale; 24 treeData1.PositionXA1[i] = TerrainA1.terrainData.treeInstances[i].position.x; 25 treeData1.PositionYA1[i] = TerrainA1.terrainData.treeInstances[i].position.y; 26 treeData1.PositionZA1[i] = TerrainA1.terrainData.treeInstances[i].position.z; 27 treeData1.PrototypeIndexA1[i] = TerrainA1.terrainData.treeInstances[i].prototypeIndex; 28 treeData1.RotationA1[i] = TerrainA1.terrainData.treeInstances[i].rotation; 29 treeData1.WidthScaleA1[i] = TerrainA1.terrainData.treeInstances[i].widthScale; 30 31 yield return null; 32 33 } 34 35 //セーブ 36 BinaryFormatter bf1 = new BinaryFormatter(); 37 MemoryStream saveMem = new MemoryStream(); 38 bf1.Serialize(saveMem, treeData1); 39 ES2.Save(saveMem.ToArray(), "TreeData.txt?tag=binary"); //Easysave byte配列で保存. 40 saveMem.Close(); 41} 42 43 private void OnGUI() 44 { 45 //セーブボタンを押すと実行 46 if (GUILayout.Button("Save")) 47 { 48 StartCoroutine("SaveCoroutine"); 49 } 50 }
補足情報(FW/ツールのバージョンなど)
Unity 2017.1.1f1

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/29 02:58