public Texture Bake(LODTerrainData terrainData, int size = 2048) { this.size = size; this.CreateObjects(); this.UpdateCameraModes(); SplatsNormalmap.quads[this.key].SetActive(true); this.rttCamera.gameObject.SetActive(true); this.rttCamera.enabled = true; TerrainConfig terrainConfig = GameScene.mainScene.terrainConfig; this.sntMat.SetTexture("_Control", terrainData.splatsmapTex); for (int i = 0; i < terrainData.spaltsmapLayers; i++) { Splat splat = terrainData.splats[i]; if (splat != null) { this.sntMat.SetTexture("_Splat" + i, splat.normalMap); this.sntMat.SetTextureScale("_Splat" + i, new Vector2(splat.tilingOffset.x, splat.tilingOffset.y)); this.sntMat.SetTextureOffset("_Splat" + i, Vector2.zero); } else { splat = terrainData.splats[0]; this.sntMat.SetTexture("_Splat" + i, terrainConfig.baseSplat.normalMap); this.sntMat.SetTextureScale("_Splat" + i, new Vector2(splat.tilingOffset.x, splat.tilingOffset.y)); this.sntMat.SetTextureOffset("_Splat" + i, Vector2.zero); } } this.rttCamera.targetTexture = this.rtt; RenderTexture.active = this.rtt; this.tex.ReadPixels(new Rect(0f, 0f, (float)size, (float)size), 0, 0); this.tex.Apply(); return(this.tex); }
public void Destroy() { this.terrainData.Release(); this.terrainData = null; this.uvs = null; this.vertices = null; this.normals = null; this.triangles = null; this.tangents = null; DelegateProxy.GameDestory(this.matrial); this.matrial = null; DelegateProxy.GameDestory(this.mesh); this.mesh = null; }
/// <summary> /// 地形资源加载完成,开始显示地形 /// </summary> /// <param name="asset"></param> private void OnTerrainLoadCompate(Asset asset) { if (asset.loaded) //资源加载的直接显示 { this.terrain = asset.terrain; this.terrain.name = this.key; this.terrain.transform.position = new Vector3(this.position.x, 0f, this.position.z); this.terrain.gameObject.layer = GameLayer.Layer_Ground; if (this._lightmapPrototype.lightmapIndex >= 0) { this.terrain.GetComponent <Renderer>().lightmapIndex = this._lightmapPrototype.lightmapIndex; this.terrain.GetComponent <Renderer>().lightmapTilingOffset = this._lightmapPrototype.lightmapTilingOffset; } this.terrain.splatsMapPath = string.Concat(new object[] { "Scenes/", this.region.scene.sceneID, "/", this.region.regionX, "_", this.region.regionY, "/", this.tileX, "_", this.tileY, "Splats" }); if (!GameScene.isPlaying) { this.terrain.BuildMaterial(null); } } else //不是加载的,创建一个基础的地形 { LODTerrainData terrainData = new LODTerrainData(); this.terrain = LODTerrain.CreateTerrainGameObject(terrainData, false); this.terrain.name = this.key; this.terrain.transform.position = new Vector3(this.position.x, 0f, this.position.z); this.terrain.gameObject.layer = GameLayer.Layer_Ground; this.terrain.Init(); } if (!GameScene.isPlaying && this.terrain != null) //给地形添加网格碰撞器 { this.terrain.gameObject.AddComponent <MeshCollider>(); } }
/// <summary> /// 使用地形数据信息创建地形游戏对象 /// </summary> /// <param name="terrainData">属性数据</param> /// <param name="useTrrainData"></param> /// <returns></returns> public static LODTerrain CreateTerrainGameObject(LODTerrainData terrainData, bool useTrrainData = false) { GameObject gameObject = new GameObject(); LODTerrain lODTerrain = gameObject.AddComponent <LODTerrain>(); gameObject.isStatic = true; lODTerrain.terrainData = terrainData; lODTerrain.terrainConfig = GameScene.mainScene.terrainConfig; lODTerrain.mesh = new Mesh(); if (GameScene.isPlaying) { lODTerrain.mesh.vertices = terrainData.vertices; } else { if (LODTerrain.shareVertices == null) { LODTerrain.BuildShareVertices(); } if (terrainData.vertices != null) { lODTerrain.vertices = terrainData.vertices; } else { lODTerrain.vertices = LODTerrain.shareVertices; } lODTerrain.normals = terrainData.normals; lODTerrain.tangents = terrainData.tangents; lODTerrain.mesh.vertices = lODTerrain.vertices; lODTerrain.BuildUVs(); lODTerrain.mesh.normals = lODTerrain.normals; lODTerrain.mesh.tangents = lODTerrain.tangents; lODTerrain.BuildTriangles(); } gameObject.AddComponent <MeshFilter>().mesh = lODTerrain.mesh; lODTerrain.terrainRenderer = gameObject.AddComponent <MeshRenderer>(); if (GameScene.isPlaying) { lODTerrain.terrainRenderer.enabled = false; lODTerrain.terrainRenderer.receiveShadows = true; lODTerrain.terrainRenderer.castShadows = false; } return(lODTerrain); }