public void UpdateMesh(IMeshContext options, IReadOnlyDictionary <Vector2i, ITerrainMesh2i> terrainMeshes, IEnumerable <Vector2i> toKeepGroups) { if (terrainMeshes != null) { using (options.ProfilerFactory("Setting Mesh", this)) { var toDeleteGroups = _meshFilters.Keys.Except(terrainMeshes.Keys).Except(toKeepGroups).ToList(); int meshIndex = 0; foreach (var terrainMesh in terrainMeshes) { MeshFilter meshFilter; if (!_meshFilters.TryGetValue(terrainMesh.Key, out meshFilter)) { if (toDeleteGroups.Count > 0) { int toDeleteIndex = toDeleteGroups.Count - 1; var toDeleteKey = toDeleteGroups[toDeleteIndex]; meshFilter = _meshFilters[toDeleteKey]; _meshFilters.Remove(toDeleteKey); _meshFilters[terrainMesh.Key] = meshFilter; toDeleteGroups.RemoveAt(toDeleteIndex); } else { meshFilter = CreateMeshObject(options); _meshFilters[terrainMesh.Key] = meshFilter; } } ITerrainMesh2i triangleMesh = terrainMesh.Value; UpdateMesh(triangleMesh, meshFilter.sharedMesh); var collider = meshFilter.gameObject.GetComponent <MeshCollider>(); collider.sharedMesh = null; collider.sharedMesh = meshFilter.sharedMesh; meshIndex++; } foreach (var toDeleteGroup in toDeleteGroups) { _meshFilters[toDeleteGroup].gameObject.Destroy(); _meshFilters.Remove(toDeleteGroup); } } } }
private MeshFilter CreateMeshObject(IMeshContext options) { string name = string.Format("group_{0}", _meshFilters.Count); var tile = options.GameObjectFactory != null?options.GameObjectFactory() : new GameObject(); tile.name = name; tile.hideFlags = HideFlags.DontSave; var meshFilter = tile.GetOrAddComponent <MeshFilter>(); tile.AddComponentIfMissing <MeshRenderer>(); tile.AddComponentIfMissing <MeshCollider>(); if (meshFilter.sharedMesh == null) { meshFilter.mesh = new Mesh(); } var mesh = meshFilter.sharedMesh; mesh.MarkDynamic(); return(meshFilter); }