void Update() { if (!_isInit) { if (_clothSim == null) { _clothSim = GetComponent <GPUClothSimulation>(); } if (_clothSim != null && _clothSim.IsInit) { var gridList = new List <SpringIds>(); var gridDiagonalList = new List <SpringIds>(); var gridDiagonalAlternateList = new List <SpringIds>(); var res = _clothSim.GetClothResolution(); for (var y = 0; y < res.y; y++) { for (var x = 0; x < res.x; x++) { gridList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x, y + 1))); gridList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x + 1, y))); if (x < res.x - 1 && y < res.y - 1) { gridDiagonalList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x + 1, y + 1))); gridDiagonalList.Add(new SpringIds(new Vector2Int(x + 1, y), new Vector2Int(x, y + 1))); } if (x < res.x - 2 && y < res.y - 2) { gridDiagonalAlternateList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x + 2, y + 2))); } if (x >= 2 && y < res.y - 2) { gridDiagonalAlternateList.Add(new SpringIds(new Vector2Int(x, y), new Vector2Int(x - 2, y + 2))); } } } _gridBuffer = new ComputeBuffer(gridList.Count, Marshal.SizeOf(typeof(SpringIds))); _gridBuffer.SetData(gridList.ToArray()); _gridDiagonalBuffer = new ComputeBuffer(gridDiagonalList.Count, Marshal.SizeOf(typeof(SpringIds))); _gridDiagonalBuffer.SetData(gridDiagonalList.ToArray()); _gridDiagonalAlternateBuffer = new ComputeBuffer(gridDiagonalAlternateList.Count, Marshal.SizeOf(typeof(SpringIds))); _gridDiagonalAlternateBuffer.SetData(gridDiagonalAlternateList.ToArray()); gridList = null; gridDiagonalList = null; gridDiagonalAlternateList = null; _isInit = true; } } }
// メッシュを生成 void GenerateMesh() { // メッシュの解像度を計算 Vector2Int clothResolution = _clothSim.GetClothResolution(); int gridWidth = clothResolution.x - 1; int gridHeight = clothResolution.y - 1; // MeshRendererを取得, または作成 if (!GetComponent <MeshRenderer>()) { _meshRenderer = gameObject.AddComponent <MeshRenderer>(); } else { _meshRenderer = GetComponent <MeshRenderer>(); } _meshRenderer.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off; _meshRenderer.receiveShadows = false; // MeshFilterを作成 MeshFilter meshFilter; if (!GetComponent <MeshFilter>()) { meshFilter = gameObject.AddComponent <MeshFilter>(); } else { meshFilter = GetComponent <MeshFilter>(); } // Meshを作成 var mesh = new Mesh(); meshFilter.mesh = mesh; // グリッドの間隔 var tileSizeX = 1.0f / gridWidth; var tileSizeY = 1.0f / gridHeight; // 頂点データを作成 var vertices = new List <Vector3>(); // 頂点 var triangles = new List <int>(); // 頂点インデックス var normals = new List <Vector3>(); // 法線 var uvs = new List <Vector2>(); // UV var index = 0; for (var y = 0; y < gridHeight; y++) { for (var x = 0; x < gridWidth; x++) { // 頂点を追加 vertices.Add(new Vector3(x * tileSizeX, y * tileSizeY, 0)); vertices.Add(new Vector3((x + 1) * tileSizeX, y * tileSizeY, 0)); vertices.Add(new Vector3((x + 1) * tileSizeX, (y + 1) * tileSizeY, 0)); vertices.Add(new Vector3(x * tileSizeX, (y + 1) * tileSizeY, 0)); // 頂点インデックスを追加 triangles.Add(index + 2); triangles.Add(index + 1); triangles.Add(index); triangles.Add(index); triangles.Add(index + 3); triangles.Add(index + 2); index += 4; // 法線を追加 normals.Add(Vector3.forward); normals.Add(Vector3.forward); normals.Add(Vector3.forward); normals.Add(Vector3.forward); // UVを追加 uvs.Add(new Vector2((x + 0) * tileSizeX, (y + 0) * tileSizeY)); uvs.Add(new Vector2((x + 1) * tileSizeX, (y + 0) * tileSizeY)); uvs.Add(new Vector2((x + 1) * tileSizeX, (y + 1) * tileSizeY)); uvs.Add(new Vector2((x + 0) * tileSizeX, (y + 1) * tileSizeY)); } } // 頂点の最大数(通常は65535個に制限されている)を上げる mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; // 頂点データを代入 mesh.vertices = vertices.ToArray(); mesh.normals = normals.ToArray(); mesh.triangles = triangles.ToArray(); mesh.uv = uvs.ToArray(); mesh.bounds = new Bounds(transform.position, Vector3.one * 1000.0f); mesh.RecalculateNormals(); mesh.RecalculateTangents(); mesh.MarkDynamic(); mesh.name = "Grid_" + gridWidth.ToString() + "_" + gridHeight.ToString(); }