using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TerrianTest : MonoBehaviour {
public Terrain m_terrainFrom;
public Terrain m_terrainTo;
// Use this for initialization
void Start () {
//m_terrainTo.terrainData.treePrototypes = null;
m_terrainTo.terrainData.detailPrototypes = new DetailPrototype[0];
m_terrainTo.terrainData.treeInstances = new TreeInstance[0];
Debug.Log(m_terrainFrom.terrainData.treeInstanceCount);
TreePrototype[] bufFrom = m_terrainFrom.terrainData.treePrototypes;
TreeInstance[] bufIns = m_terrainFrom.terrainData.treeInstances;
m_terrainTo.terrainData.treePrototypes = bufFrom;
m_terrainTo.terrainData.detailPrototypes = m_terrainFrom.terrainData.detailPrototypes;
DetailMapCopy (m_terrainFrom, m_terrainTo);
for (int i = 0; i < bufIns.Length; i++)
{
m_terrainTo.AddTreeInstance (bufIns [i]);
}
}
void DetailMapCopy(Terrain t,Terrain to)
{
var map = t.terrainData.GetDetailLayer(0, 0, t.terrainData.detailWidth, t.terrainData.detailHeight, 0);
to.terrainData.SetDetailLayer(0, 0, 0, map);
}
}
方法2:
Unity Terrain数据复制
脚本挂在空物体上,添加原地形和指定地形并运行,可以看到地形的树木和植被数据被传递到了,新的地形上面
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class TerrainDataTransfer : EditorWindow {
TerrainData terrainDataFrom;
TerrainData terrainDataTo;
bool isJustCopy;
[MenuItem("Custom/TerrainDataTransfer")]
private static void ShowWindow() {
var window = GetWindow<TerrainDataTransfer>();
window.titleContent = new GUIContent("TerrainDataTransfer");
window.Show();
}
private void OnGUI() {
GUILayout.Label("原始地形数据");
terrainDataFrom = (TerrainData)EditorGUILayout.ObjectField(terrainDataFrom,typeof(TerrainData),true);
GUILayout.Label("目标地形数据");
terrainDataTo = (TerrainData)EditorGUILayout.ObjectField(terrainDataTo,typeof(TerrainData),true);
isJustCopy = GUILayout.Toggle(isJustCopy,"仅复制");
if(GUILayout.Button("复制terrain")){
TransferData(terrainDataFrom,terrainDataTo);
}
}
private void TransferData(TerrainData dataFrom, TerrainData dataTo){
//dataTo = new TerrainData(); 会导致重定向,从而找不到本尊
///复制参数
dataTo.heightmapResolution = dataFrom.heightmapResolution;
dataTo.size = dataFrom.size;
dataTo.wavingGrassAmount = dataFrom.wavingGrassAmount;
dataTo.wavingGrassSpeed = dataFrom.wavingGrassSpeed;
dataTo.wavingGrassStrength = dataFrom.wavingGrassStrength;
dataTo.wavingGrassTint = dataFrom.wavingGrassTint;
dataTo.detailPrototypes = dataFrom.detailPrototypes;
dataTo.treeInstances = dataFrom.treeInstances;
dataTo.treePrototypes = dataFrom.treePrototypes;
dataTo.alphamapResolution = dataFrom.alphamapResolution;
dataTo.baseMapResolution = dataFrom.baseMapResolution;
dataTo.splatPrototypes = dataFrom.splatPrototypes;
float[,] heights = dataFrom.GetHeights(0,0, dataFrom.heightmapResolution,dataFrom.heightmapResolution);
dataTo.SetHeights(0,0,heights);
float[,,] alphaMap = dataFrom.GetAlphamaps(0,0, dataFrom.alphamapWidth, dataFrom.alphamapHeight);
dataTo.SetAlphamaps(0,0, alphaMap);
///是否只是拷贝数据
if(isJustCopy)
return;
//在场景中创建地表
GameObject obj = Terrain.CreateTerrainGameObject(dataTo);
obj.name = "TerrainNew";
}
}
网友评论