public void Initialize(Vector3 position, float width, float height) { Width = width; Height = height; var terrainData = BuildTerrainData(width, height); if (Terrain == null) { var terrainGameObject = Terrain.CreateTerrainGameObject(terrainData); terrainGameObject.layer = LayerMask.NameToLayer("Terrain"); terrainGameObject.transform.SetParent(transform, false); Terrain = terrainGameObject.GetComponent <Terrain>(); TerrainCollider = terrainGameObject.GetComponent <TerrainCollider>(); } else { Terrain.terrainData = terrainData; TerrainCollider.terrainData = terrainData; } transform.position = position; InstancedTerrainMaterial = new Material(RenderConfig.TerrainMaterialTemplate); InstancedWaterMaterial = new Material(RenderConfig.StandingWaterData.RenderingData.Material); Vector4 bakeTextureDimensions = new Vector4( transform.position.x - RenderConfig.OuterRadius * 1.5f, transform.position.z - RenderConfig.OuterRadius * 1.5f, RenderConfig.ChunkWidth + RenderConfig.OuterRadius * 3f, RenderConfig.ChunkHeight + RenderConfig.OuterRadius * 3f ); InstancedTerrainMaterial.SetVector("_BakeTextureDimensions", bakeTextureDimensions); InstancedWaterMaterial.SetVector("_BakeTextureDimensions", bakeTextureDimensions); InstancedWaterMaterial.EnableKeyword("USE_BAKE_TEXTURE"); Terrain.shadowCastingMode = RenderConfig.TerrainShadowCastingMode; Terrain.basemapDistance = RenderConfig.TerrainBasemapDistance; Terrain.materialType = Terrain.MaterialType.Custom; Terrain.materialTemplate = InstancedTerrainMaterial; Terrain.heightmapPixelError = RenderConfig.TerrainHeightmapPixelError; Terrain.drawTreesAndFoliage = false; Terrain.editorRenderFlags = TerrainRenderFlags.Heightmap; Terrain.reflectionProbeUsage = UnityEngine.Rendering.ReflectionProbeUsage.Off; Terrain.bakeLightProbesForTrees = false; Terrain.freeUnusedRenderingResources = true; StandingWater.OverrideMaterial(InstancedWaterMaterial); Terrain.Flush(); }
private void RefreshWater() { StandingWater.Clear(); foreach (var cell in CenteredCells) { if (cell.Terrain.IsWater()) { WaterTriangulator.TriangulateWaterForCell(cell, transform, StandingWater); } } StandingWater.Apply(); }