unity同一个版本中将地形树的数据传递给新的地形上

2023-07-31  本文已影响0人  Rayson
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";
    }
}
上一篇 下一篇

猜你喜欢

热点阅读