TerrainHeightProcesser 地形高度存储工具
TerrainHeightData 地形高度数据
// class TerrainHeightProcesser
using UnityEngine; using System.Collections; using System.IO; using UnityEditor; using System.Collections.Generic; /* * 地形高度处理器 */ public class TerrainHeightProcesser : ScriptableWizard { public int mapWdith; public int mapHeight; [MenuItem("Tools/Save Terrain Height File")] public static void OpenDialog() { DisplayWizard<TerrainHeightProcesser>("Save Terrain Height", "Save", "Cancel"); } public void SaveTerrainHeightFile() { //以每米为间隔从高空向下发射射线 Vector3 pos = Vector3.zero; pos.y = 100; Ray ray = new Ray(pos, -Vector3.up); Vector3 targetPos = Vector3.zero; //创建一个对象 TerrainHeightData th = ScriptableObject.CreateInstance<TerrainHeightData>(); th.MapWidth = mapWdith; th.MapHeight = mapHeight; th.List = new List<float>(); //纵向 for (short i = 0; i < mapHeight; i++) { pos.z = i; //横向 for (short j = 0; j < mapWdith; j++) { targetPos = Vector3.zero;//默认zero pos.x = j; ray.origin = pos; RaycastHit result; if (Physics.Raycast(ray, out result)) { targetPos = result.point; } th.List.Add(targetPos.y); } } //计算file name string sceneName = UnityEditor.EditorApplication.currentScene; int start = sceneName.LastIndexOf('/') + 1; int count = sceneName.LastIndexOf('.')-start; sceneName = sceneName.Substring(start, count); string path = "Assets/ArtAsset/TerrainHeightData/" + sceneName + ".asset"; //保存 AssetDatabase.CreateAsset(th, path); AssetDatabase.Refresh(); string str = string.Empty; str += "mapHeight=" + mapHeight.ToString() + " "; str += "mapWdith=" + mapWdith.ToString(); EditorUtility.DisplayDialog("SUCCESS", "file:" + path + " " + str, "OK"); } void OnWizardCreate() { SaveTerrainHeightFile(); } void OnWizardOtherButton() { Close(); } }
//TerrainHeightData
using UnityEngine; using System.Collections; using System.IO; using System.Collections.Generic; public class TerrainHeightData : ScriptableObject { [SerializeField] public int MapWidth = 0; [SerializeField] public int MapHeight = 0; [SerializeField] public List<float> List; public float GetTerrainHeight(float x,float z) { int w = (int)Mathf.Floor(x); int h = (int)Mathf.Floor(z); if (w < 0 || w >= MapWidth || h < 0 || h >= MapHeight) return 0.0f; int idx = h*MapWidth+w; if (idx < 0 || idx >= MapWidth * MapHeight || idx >= List.Count) return 0.0f; return List[idx]; } }