示例#1
0
        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);
                    }
                }
            }
        }
示例#2
0
        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);
        }