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

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

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

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

Unity

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

Q&A

解決済

2回答

1249閲覧

Unity2D エラー OutOfMemoryException

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Unity

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

0グッド

0クリップ

投稿2019/04/22 11:16

実現したいこと

OutOfMemoryExceptionのエラーを解消したい

エラーメッセージ

OutOfMemoryException: Out of memory ExampleClass.GrassGenerate () (at Assets/Script/ExampleClass.cs:133) ExampleClass.Start () (at Assets/Script/ExampleClass.cs:36)

該当のソースコード

C#

1using System.Collections; 2using System.Collections.Generic; 3using System.Linq; 4using UnityEngine; 5 6public class ExampleClass : MonoBehaviour 7{ 8 public int rows; 9 public int columns; 10 11 Mesh mesh; 12 Matrix4x4[][] matrices; 13 int count; 14 public Material material; 15 16 Mesh grassMesh; 17 Matrix4x4[][] grassMatrices; 18 int grassCount; 19 public Material grassMaterial; 20 21 Mesh grassMesh2; 22 Matrix4x4[][] grassMatrices2; 23 int grassCount2; 24 public Material grassMaterial2; 25 26 Mesh lotusMesh; 27 Matrix4x4[][] lotusMatrices; 28 int lotusCount; 29 public Material lotusMaterial; 30 31 private void Start() 32 { 33 rows = World.instance.width; 34 columns = World.instance.height; 35 Instance(); 36 GrassGenerate(); 37 GrassGenerate2(); 38 LotusGenerate(); 39 } 40 41 void Instance() 42 { 43 mesh = new Mesh(); 44 mesh.vertices = new Vector3[] { 45 new Vector3 (0, 0, 0), 46 new Vector3 (0, 1, 0), 47 new Vector3 (1 ,0, 0), 48 new Vector3 (1, 1, 0), 49 }; 50 51 mesh.uv = new Vector2[] { 52 new Vector2 (0, 0), 53 new Vector2 (0, 1), 54 new Vector2 (1, 0), 55 new Vector2 (1, 1), 56 }; 57 58 mesh.triangles = new int[] { 59 0, 1, 2, 60 1, 3, 2, 61 }; 62 63 mesh.RecalculateNormals(); 64 mesh.RecalculateBounds(); 65 66 count = rows * columns; 67 var flatMatrices = new Matrix4x4[count]; 68 69 for(var i = 0;i < World.instance.NotWaterCoordinates.Count; i++) 70 { 71 var index = i; 72 73 var position = World.instance.NotWaterCoordinates[i]; 74 75 var rotation = Quaternion.identity; 76 77 var scale = Vector3.one; 78 79 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 80 } 81 82 matrices = flatMatrices.Select((m, i) => (m, i / 1023)) 83 .GroupBy(t => t.Item2) 84 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 85 } 86 87 void GrassGenerate() 88 { 89 grassMesh = new Mesh(); 90 grassMesh.vertices = new Vector3[] { 91 new Vector3 (0, 0, 0), 92 new Vector3 (0, 1, 0), 93 new Vector3 (1 ,0, 0), 94 new Vector3 (1, 1, 0), 95 }; 96 97 grassMesh.uv = new Vector2[] { 98 new Vector2 (0, 0), 99 new Vector2 (0, 1), 100 new Vector2 (1, 0), 101 new Vector2 (1, 1), 102 }; 103 104 grassMesh.triangles = new int[] { 105 0, 1, 2, 106 1, 3, 2, 107 }; 108 109 grassMesh.RecalculateNormals(); 110 grassMesh.RecalculateBounds(); 111 112 //grassCount = rows * columns; 113 grassCount = World.instance.GrassCoordinates.Count; 114 var flatMatrices = new Matrix4x4[grassCount]; 115 116 for(var i = 0;i < World.instance.GrassCoordinates.Count; i++) 117 { 118 var index = i; 119 120 var position = World.instance.GrassCoordinates[i]; 121 122 var rotation = Quaternion.identity; 123 124 var scale = Vector3.one; 125 126 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 127 } 128 129 grassMatrices = flatMatrices.Select((m, i) => (m, i / 1023)) 130 .GroupBy(t => t.Item2) 131 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 132 } 133 134 void GrassGenerate2() 135 { 136 grassMesh2 = new Mesh(); 137 grassMesh2.vertices = new Vector3[] { 138 new Vector3 (0, 0, 0), 139 new Vector3 (0, 1, 0), 140 new Vector3 (1 ,0, 0), 141 new Vector3 (1, 1, 0), 142 }; 143 144 grassMesh2.uv = new Vector2[] { 145 new Vector2 (0, 0), 146 new Vector2 (0, 1), 147 new Vector2 (1, 0), 148 new Vector2 (1, 1), 149 }; 150 151 grassMesh2.triangles = new int[] { 152 0, 1, 2, 153 1, 3, 2, 154 }; 155 156 grassMesh2.RecalculateNormals(); 157 grassMesh2.RecalculateBounds(); 158 159 grassCount2 = rows * columns; 160 var flatMatrices = new Matrix4x4[grassCount2]; 161 162 for (var i = 0; i < World.instance.GrassCoordinates2.Count; i++) 163 { 164 var index = i; 165 166 var position = World.instance.GrassCoordinates2[i]; 167 168 var rotation = Quaternion.identity; 169 170 var scale = Vector3.one; 171 172 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 173 } 174 175 grassMatrices2 = flatMatrices.Select((m, i) => (m, i / 1023)) 176 .GroupBy(t => t.Item2) 177 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 178 } 179 180 void LotusGenerate() 181 { 182 lotusMesh = new Mesh(); 183 lotusMesh.vertices = new Vector3[] { 184 new Vector3 (0, 0, 0), 185 new Vector3 (0, 1, 0), 186 new Vector3 (1 ,0, 0), 187 new Vector3 (1, 1, 0), 188 }; 189 190 lotusMesh.uv = new Vector2[] { 191 new Vector2 (0, 0), 192 new Vector2 (0, 1), 193 new Vector2 (1, 0), 194 new Vector2 (1, 1), 195 }; 196 197 lotusMesh.triangles = new int[] { 198 0, 1, 2, 199 1, 3, 2, 200 }; 201 202 lotusMesh.RecalculateNormals(); 203 lotusMesh.RecalculateBounds(); 204 205 lotusCount = rows * columns; 206 var flatMatrices = new Matrix4x4[lotusCount]; 207 208 for (var i = 0; i < World.instance.LotusCoordinates.Count; i++) 209 { 210 var index = i; 211 212 var position = World.instance.LotusCoordinates[i]; 213 214 var rotation = Quaternion.identity; 215 216 var scale = Vector3.one; 217 218 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 219 } 220 221 lotusMatrices = flatMatrices.Select((m, i) => (m, i / 1023)) 222 .GroupBy(t => t.Item2) 223 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 224 } 225 226 void Update() 227 { 228 foreach (var m in matrices) 229 { 230 Graphics.DrawMeshInstanced(mesh, 0, material, m); 231 } 232 233 foreach(var g in grassMatrices) 234 { 235 Graphics.DrawMeshInstanced(grassMesh, 0, grassMaterial, g); 236 } 237 238 foreach(var g2 in grassMatrices2) 239 { 240 Graphics.DrawMeshInstanced(grassMesh2, 0, grassMaterial2, g2); 241 } 242 243 foreach(var l in lotusMatrices) 244 { 245 Graphics.DrawMeshInstanced(lotusMesh, 0, lotusMaterial, l); 246 } 247 } 248}

試したこと

World.csにGrassAddというメソッドがあるのですが、この関数を使用するとエラーになります。
ExampleClass.csのGrassGenerateメソッドで、

C#

1grassCount = World.instance.GrassCoordinates.Count; 2

としていますが、エラーの原因となっているようです。恐らく、grassCountが大きすぎるのかもしれません。
自分がやりたいことは、草のテクスチャが描かれたメッシュを大量に生成することなのですが、OutOfMemoryException、メモリ不足となってしまいます。
どのように書き直せばいいでしょうか? 回答お願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

新しいメソッドを作り直したら解決しました。

C#

1using System.Collections; 2using System.Collections.Generic; 3using System.Linq; 4using UnityEngine; 5 6public class ExampleClass : MonoBehaviour 7{ 8 public int rows; 9 public int columns; 10 11 Mesh mesh; 12 Matrix4x4[][] matrices; 13 int count; 14 public Material material; 15 16 Mesh grassMesh; 17 Matrix4x4[][] grassMatrices; 18 uint grassCount; 19 public Material grassMaterial; 20 21 Mesh grassMesh2; 22 Matrix4x4[][] grassMatrices2; 23 int grassCount2; 24 public Material grassMaterial2; 25 26 Mesh lotusMesh; 27 Matrix4x4[][] lotusMatrices; 28 int lotusCount; 29 public Material lotusMaterial; 30 31 Mesh grassAddMesh; 32 Matrix4x4[][] grassAddMatrices; 33 int grassAddCount; 34 35 private void Start() 36 { 37 rows = World.instance.width; 38 columns = World.instance.height; 39 Instance(); 40 GrassGenerate(); 41 GrassGenerate2(); 42 LotusGenerate(); 43 GrassAddGenerate(); 44 } 45 46 void Instance() 47 { 48 mesh = new Mesh(); 49 mesh.vertices = new Vector3[] { 50 new Vector3 (0, 0, 0), 51 new Vector3 (0, 2, 0), 52 new Vector3 (2 ,0, 0), 53 new Vector3 (2, 2, 0), 54 }; 55 56 mesh.uv = new Vector2[] { 57 new Vector2 (0, 0), 58 new Vector2 (0, 1), 59 new Vector2 (1, 0), 60 new Vector2 (1, 1), 61 }; 62 63 mesh.triangles = new int[] { 64 0, 1, 2, 65 1, 3, 2, 66 }; 67 68 mesh.RecalculateNormals(); 69 mesh.RecalculateBounds(); 70 71 // 各インスタンスの姿勢はMatrix4x4として与える 72 count = rows * columns; 73 var flatMatrices = new Matrix4x4[count]; 74 /*for (var i = 0; i < rows; i++) 75 { 76 for (var j = 0; j < columns; j++) 77 { 78 var index = (i * columns) + j; 79 80 var position = new Vector3(j, i, 0); 81 82 //var randomAngle = Random.Range(-10.0f, 10.0f); 83 //var randomDirection = Random.insideUnitCircle.normalized; 84 var rotation = Quaternion.identity; 85 86 var scale = Vector3.one; 87 88 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 89 } 90 }*/ 91 92 for(var i = 0;i < World.instance.NotWaterCoordinates.Count; i++) 93 { 94 var index = i; 95 96 var position = World.instance.NotWaterCoordinates[i]; 97 98 var rotation = Quaternion.identity; 99 100 var scale = Vector3.one; 101 102 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 103 } 104 105 // 一度に描画できるインスタンスは1023個までなので、あらかじめそれを超えないよう切り分けておく 106 matrices = flatMatrices.Select((m, i) => (m, i / 1023)) 107 .GroupBy(t => t.Item2) 108 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 109 } 110 111 void GrassGenerate() 112 { 113 grassMesh = new Mesh(); 114 grassMesh.vertices = new Vector3[] { 115 new Vector3 (0, 0, 0), 116 new Vector3 (0, 1, 0), 117 new Vector3 (1 ,0, 0), 118 new Vector3 (1, 1, 0), 119 }; 120 121 grassMesh.uv = new Vector2[] { 122 new Vector2 (0, 0), 123 new Vector2 (0, 1), 124 new Vector2 (1, 0), 125 new Vector2 (1, 1), 126 }; 127 128 grassMesh.triangles = new int[] { 129 0, 1, 2, 130 1, 3, 2, 131 }; 132 133 grassMesh.RecalculateNormals(); 134 grassMesh.RecalculateBounds(); 135 136 //grassCount = rows * columns; 137 grassCount = (uint)World.instance.GrassCoordinates.Count; 138 var flatMatrices = new Matrix4x4[grassCount]; 139 140 for(var i = 0;i < World.instance.GrassCoordinates.Count; i++) 141 { 142 var index = i; 143 144 var position = World.instance.GrassCoordinates[i]; 145 146 var rotation = Quaternion.identity; 147 148 var scale = Vector3.one; 149 150 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 151 } 152 153 // 一度に描画できるインスタンスは1023個までなので、あらかじめそれを超えないよう切り分けておく 154 grassMatrices = flatMatrices.Select((m, i) => (m, i / 1023)) 155 .GroupBy(t => t.Item2) 156 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 157 } 158 159 void GrassGenerate2() 160 { 161 grassMesh2 = new Mesh(); 162 grassMesh2.vertices = new Vector3[] { 163 new Vector3 (0, 0, 0), 164 new Vector3 (0, 1, 0), 165 new Vector3 (1 ,0, 0), 166 new Vector3 (1, 1, 0), 167 }; 168 169 grassMesh2.uv = new Vector2[] { 170 new Vector2 (0, 0), 171 new Vector2 (0, 1), 172 new Vector2 (1, 0), 173 new Vector2 (1, 1), 174 }; 175 176 grassMesh2.triangles = new int[] { 177 0, 1, 2, 178 1, 3, 2, 179 }; 180 181 grassMesh2.RecalculateNormals(); 182 grassMesh2.RecalculateBounds(); 183 184 grassCount2 = rows * columns; 185 var flatMatrices = new Matrix4x4[grassCount2]; 186 187 for (var i = 0; i < World.instance.GrassCoordinates2.Count; i++) 188 { 189 var index = i; 190 191 var position = World.instance.GrassCoordinates2[i]; 192 193 var rotation = Quaternion.identity; 194 195 var scale = Vector3.one; 196 197 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 198 } 199 200 // 一度に描画できるインスタンスは1023個までなので、あらかじめそれを超えないよう切り分けておく 201 grassMatrices2 = flatMatrices.Select((m, i) => (m, i / 1023)) 202 .GroupBy(t => t.Item2) 203 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 204 } 205 206 void LotusGenerate() 207 { 208 lotusMesh = new Mesh(); 209 lotusMesh.vertices = new Vector3[] { 210 new Vector3 (0, 0, 0), 211 new Vector3 (0, 1, 0), 212 new Vector3 (1 ,0, 0), 213 new Vector3 (1, 1, 0), 214 }; 215 216 lotusMesh.uv = new Vector2[] { 217 new Vector2 (0, 0), 218 new Vector2 (0, 1), 219 new Vector2 (1, 0), 220 new Vector2 (1, 1), 221 }; 222 223 lotusMesh.triangles = new int[] { 224 0, 1, 2, 225 1, 3, 2, 226 }; 227 228 lotusMesh.RecalculateNormals(); 229 lotusMesh.RecalculateBounds(); 230 231 lotusCount = rows * columns; 232 var flatMatrices = new Matrix4x4[lotusCount]; 233 234 for (var i = 0; i < World.instance.LotusCoordinates.Count; i++) 235 { 236 var index = i; 237 238 var position = World.instance.LotusCoordinates[i]; 239 240 var rotation = Quaternion.identity; 241 242 var scale = Vector3.one; 243 244 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 245 } 246 247 // 一度に描画できるインスタンスは1023個までなので、あらかじめそれを超えないよう切り分けておく 248 lotusMatrices = flatMatrices.Select((m, i) => (m, i / 1023)) 249 .GroupBy(t => t.Item2) 250 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 251 } 252 253 void GrassAddGenerate() 254 { 255 grassAddMesh = new Mesh(); 256 grassAddMesh.vertices = new Vector3[] { 257 new Vector3 (0, 0, 0), 258 new Vector3 (0, 1, 0), 259 new Vector3 (1 ,0, 0), 260 new Vector3 (1, 1, 0), 261 }; 262 263 grassAddMesh.uv = new Vector2[] { 264 new Vector2 (0, 0), 265 new Vector2 (0, 1), 266 new Vector2 (1, 0), 267 new Vector2 (1, 1), 268 }; 269 270 grassAddMesh.triangles = new int[] { 271 0, 1, 2, 272 1, 3, 2, 273 }; 274 275 grassAddMesh.RecalculateNormals(); 276 grassAddMesh.RecalculateBounds(); 277 278 grassAddCount = World.instance.GrassAddCoordinates.Count; 279 var flatMatrices = new Matrix4x4[grassAddCount]; 280 281 for (var i = 0; i < World.instance.GrassAddCoordinates.Count; i++) 282 { 283 var index = i; 284 285 var position = World.instance.GrassAddCoordinates[i]; 286 287 var rotation = Quaternion.identity; 288 289 var scale = Vector3.one; 290 291 flatMatrices[index] = Matrix4x4.TRS(position, rotation, scale); 292 } 293 294 // 一度に描画できるインスタンスは1023個までなので、あらかじめそれを超えないよう切り分けておく 295 grassAddMatrices = flatMatrices.Select((m, i) => (m, i / 1023)) 296 .GroupBy(t => t.Item2) 297 .Select(g => g.Select(t => t.Item1).ToArray()).ToArray(); 298 } 299 300 void Update() 301 { 302 foreach (var m in matrices) 303 { 304 Graphics.DrawMeshInstanced(mesh, 0, material, m); 305 } 306 307 foreach(var g in grassMatrices) 308 { 309 Graphics.DrawMeshInstanced(grassMesh, 0, grassMaterial, g); 310 } 311 312 foreach(var g2 in grassMatrices2) 313 { 314 Graphics.DrawMeshInstanced(grassMesh2, 0, grassMaterial2, g2); 315 } 316 317 foreach(var l in lotusMatrices) 318 { 319 Graphics.DrawMeshInstanced(lotusMesh, 0, lotusMaterial, l); 320 } 321 322 foreach(var ga in grassAddMatrices) 323 { 324 Graphics.DrawMeshInstanced(grassAddMesh, 0, grassMaterial, ga); 325 } 326 } 327}

投稿2019/04/22 12:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

文字数制限があったため、World.csスクリプトを本文に記入出来ませんでした。なので、ここに書き込みます。

C#

1using System.Collections; 2using System.Collections.Generic; 3using System.Linq; 4using UnityEngine; 5 6public class World : MonoBehaviour 7{ 8 private const int TypeCountMax = 8; 9 10 private static readonly int TypeCountProperty = Shader.PropertyToID("_TypeCount"); 11 private static readonly int TypeUvsProperty = Shader.PropertyToID("_TypeUvs"); 12 private static readonly int TileSizeProperty = Shader.PropertyToID("_TileSize"); 13 private static readonly int TypeLevelsProperty = Shader.PropertyToID("_TypeLevels"); 14 15 public int width { get; private set; } 16 public int height { get; private set; } 17 18 public Tile[,] tiles; 19 20 public Material material; 21 22 Mesh mesh; 23 24 public string seed; 25 public bool randomSeed; 26 27 public float frequency; 28 public float amplitude; 29 30 public float lacunarity; 31 public float persistance; 32 33 public int octaves; 34 35 Noise noise; 36 37 public float seaLevel; 38 public float beachEndHeight; 39 public float grassEndHeight; 40 public float dirtEndHeight; 41 public float stoneEndHeight; 42 43 int typeCount; 44 List<Vector4> typeUvs; 45 Vector4 tileSize; 46 float[] typeLevels; 47 48 public List<Vector2> WaterCoordinates = new List<Vector2>(); 49 public List<Vector2> NotWaterCoordinates = new List<Vector2>(); 50 public List<Vector2> GrassCoordinates = new List<Vector2>(); 51 public List<Vector2> GrassCoordinates2 = new List<Vector2>(); 52 public List<Vector2> LotusCoordinates = new List<Vector2>(); 53 54 public static World instance { get; private set; } 55 56 private void Awake() 57 { 58 instance = this; 59 60 width = 100; 61 height = 100; 62 63 if (randomSeed == true) 64 { 65 int value = Random.Range(-1000, 10000); 66 seed = value.ToString(); 67 } 68 69 noise = new Noise(seed.GetHashCode(), frequency, amplitude, lacunarity, persistance, octaves); 70 } 71 72 // Use this for initialization 73 void Start() 74 { 75 CreateTiles(); 76 GenerateMesh(); 77 } 78 79 // Update is called once per frame 80 void Update() 81 { 82 this.material.SetInt(TypeCountProperty, this.typeCount); 83 this.material.SetVectorArray(TypeUvsProperty, this.typeUvs); 84 this.material.SetVector(TileSizeProperty, this.tileSize); 85 this.material.SetFloatArray(TypeLevelsProperty, this.typeLevels); 86 87 Graphics.DrawMesh(mesh, Vector3.zero, Quaternion.identity, material, 0); 88 } 89 90 void CreateTiles() 91 { 92 (Tile.Type, float)[] types = new[] 93 { 94 (Tile.Type.Water, this.seaLevel), 95 (Tile.Type.Sand, this.beachEndHeight), 96 (Tile.Type.Grass, this.grassEndHeight), 97 (Tile.Type.Dirt, this.dirtEndHeight), 98 (Tile.Type.Grass2, this.stoneEndHeight) 99 }.OrderBy(pair => pair.Item2).Take(TypeCountMax).ToArray(); 100 101 this.tiles = new Tile[this.width, this.height]; 102 103 float[,] noiseValues = this.noise.GetNoiseValues(this.width + 1, this.height + 1); 104 105 for (int i = 0; i < this.width; i++) 106 { 107 for (int j = 0; j < this.height; j++) 108 { 109 Vector4 weights = new Vector4(noiseValues[i, j], noiseValues[i + 1, j], noiseValues[i, j + 1], noiseValues[i + 1, j + 1]); 110 111 float averageWeight = Vector4.Dot(weights, Vector4.one) * 0.25f; 112 113 var type = types.Where(t => averageWeight < t.Item2).DefaultIfEmpty(types.Last()).Last().Item1; 114 115 this.tiles[i, j] = new Tile(type, weights); 116 117 if(averageWeight < seaLevel + 0.05f) 118 { 119 Vector2 pos = new Vector2(i, j); 120 WaterCoordinates.Add(pos); 121 } 122 123 if (averageWeight < seaLevel - 0.1f) 124 { 125 Vector2 pos = new Vector2(i, j); 126 LotusCoordinates.Add(pos); 127 } 128 129 Vector2 allpos = new Vector2(i, j); 130 NotWaterCoordinates.Add(allpos); 131 GrassCoordinates.Add(allpos); 132 GrassCoordinates2.Add(allpos); 133 } 134 } 135 136 for (var i = 0;i < width; i++) 137 { 138 for(var j = 0;j < height; j++) 139 { 140 Vector2 randomPos = new Vector2(i, j); 141 var random = Random.Range(0, 100); 142 if(random < 99) 143 { 144 NotWaterCoordinates.Remove(randomPos); 145 } 146 } 147 } 148 149 for (float i = 0; i < width; i++) 150 { 151 for (float j = 0; j < height; j++) 152 { 153 Vector2 randomPos = new Vector2(i, j); 154 var random = Random.Range(0, 100); 155 if (random < 60) 156 { 157 GrassCoordinates.Remove(randomPos); 158 } 159 } 160 } 161 162 for (float i = 0; i < width; i++) 163 { 164 for (float j = 0; j < height; j++) 165 { 166 Vector2 randomPos = new Vector2(i, j); 167 var random = Random.Range(0, 100); 168 if (random < 90) 169 { 170 GrassCoordinates2.Remove(randomPos); 171 } 172 } 173 } 174 175 for (var i = 0; i < width; i++) 176 { 177 for (var j = 0; j < height; j++) 178 { 179 Vector2 randomPos = new Vector2(i, j); 180 var random = Random.Range(0, 100); 181 if (random < 99) 182 { 183 LotusCoordinates.Remove(randomPos); 184 } 185 } 186 } 187 188 for (var i = 0; i < WaterCoordinates.Count; i++) 189 { 190 if (NotWaterCoordinates.Contains(WaterCoordinates[i])) 191 { 192 NotWaterCoordinates.Remove(WaterCoordinates[i]); 193 } 194 if (GrassCoordinates.Contains(WaterCoordinates[i])) 195 { 196 GrassCoordinates.Remove(WaterCoordinates[i]); 197 } 198 if (GrassCoordinates2.Contains(WaterCoordinates[i])) 199 { 200 GrassCoordinates2.Remove(WaterCoordinates[i]); 201 } 202 } 203 204 for(var i = 0;i < NotWaterCoordinates.Count; i++) 205 { 206 GrassCoordinates.Remove(NotWaterCoordinates[i]); 207 GrassCoordinates2.Remove(NotWaterCoordinates[i]); 208 } 209 210 for(var i = 0;i < GrassCoordinates.Count; i++) 211 { 212 GrassCoordinates2.Remove(GrassCoordinates[i]); 213 } 214 215 GrassAdd(); 216 217 int typesLength = types.Length; 218 int uvVectorCount = (typesLength / 2) + (typesLength % 2); 219 List<Vector4> uvVectors = new List<Vector4>(uvVectorCount); 220 for (int i = 0; i < uvVectorCount; i++) 221 { 222 int j = i * 2; 223 Tile.Type type1 = types[j].Item1; 224 Tile.Type type2 = (j < typesLength - 1) ? types[j + 1].Item1 : Tile.Type.Void; 225 Vector2 uv1 = SpriteLoader.instance.GetTileUVs(type1)[0]; 226 Vector2 uv2 = SpriteLoader.instance.GetTileUVs(type2)[0]; 227 uvVectors.Add(new Vector4(uv1.x, uv1.y, uv2.x, uv2.y)); 228 } 229 230 Vector2[] voidUvs = SpriteLoader.instance.GetTileUVs(Tile.Type.Void); 231 Vector2 size = voidUvs[3] - voidUvs[0]; 232 233 this.typeCount = types.Length; 234 this.typeUvs = uvVectors; 235 this.tileSize = size; 236 this.typeLevels = types.Select(t => t.Item2).ToArray(); 237 } 238 239 void GrassAdd() 240 { 241 for (var i = 0; i < GrassCoordinates.Count; i++) 242 { 243 Vector2 centerPos = GrassCoordinates[i]; 244 245 Vector2 leftupPos = new Vector2(centerPos.x - 0.35f, centerPos.y + 0.35f); 246 Vector2 rightupPos = new Vector2(centerPos.x + 0.35f, centerPos.y + 0.35f); 247 Vector2 leftbottomPos = new Vector2(centerPos.x - 0.35f, centerPos.y - 0.35f); 248 Vector2 rightbottomPos = new Vector2(centerPos.x + 0.35f, centerPos.y + 0.35f); 249 250 if (leftupPos.x < 0 || leftupPos.x > 100 || leftupPos.y < 0 || leftupPos.y > 100) 251 { 252 253 } 254 else 255 { 256 GrassCoordinates.Add(leftupPos); 257 } 258 259 if (rightupPos.x < 0 || rightupPos.x > 100 || rightupPos.y < 0 || rightupPos.y > 100) 260 { 261 262 } 263 else 264 { 265 GrassCoordinates.Add(rightupPos); 266 } 267 268 if (leftbottomPos.x < 0 || leftbottomPos.x > 100 || leftbottomPos.y < 0 || leftbottomPos.y > 100) 269 { 270 271 } 272 else 273 { 274 GrassCoordinates.Add(leftbottomPos); 275 } 276 277 if (rightbottomPos.x < 0 || rightbottomPos.x > 100 || rightbottomPos.y < 0 || rightbottomPos.y > 100) 278 { 279 280 } 281 else 282 { 283 GrassCoordinates.Add(rightbottomPos); 284 } 285 } 286 } 287 288 void GenerateMesh() 289 { 290 MeshData data = new MeshData(this.tiles); 291 this.mesh = new Mesh(); 292 293 this.mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; 294 295 this.mesh.vertices = data.vertices.ToArray(); 296 this.mesh.triangles = data.triangles.ToArray(); 297 this.mesh.colors = data.colors.ToArray(); 298 299 this.mesh.RecalculateNormals(); 300 this.mesh.RecalculateBounds(); 301 } 302 303}

投稿2019/04/22 11:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

fiveHundred

2019/04/22 11:49

文字数をオーバーするということは、回答者にそれだけ長いコードを読ませることになります。 (少なくとも、私は読む気になれません) まずはコードを整理して「エラーが出る最小限のコード」にしてください。
退会済みユーザー

退会済みユーザー

2019/04/22 12:05

申し訳ありませんでした。
退会済みユーザー

退会済みユーザー

2019/04/22 12:07

次からは気をつけます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問