Unity3d 保存和使用地形高度
2015-09-15 11:43
323 查看
TerrainHeightProcesser 地形高度存储工具
TerrainHeightData 地形高度数据
// class TerrainHeightProcesser
//TerrainHeightData
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 + "\n" + 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]; } }
相关文章推荐
- Unity3D屏幕坐标到世界坐标转换浅析
- unity5在小米2/2s等小米机器上闪退
- Unity3D鼠标控制摄像机“左右移动控制视角+WASD键盘控制前后左右+空格键抬升高度”脚本
- 滑动翻页的实现5.1 拖拽结束接口
- Unity3D逆向基础教程第五课
- Unity3D逆向基础教程第四课
- Unity3D逆向基础教程第三课
- Unity3D逆向基础教程第二课
- 在Unity 5.2中,只需几步即可轻松使用Unity服务!
- Unity物理引擎:布料简介
- Unity3D项目实战笔记(5):延时功能的几种实现
- (转)Unity3d的3种截图方法
- Unity物理引擎:Charactor Controller简介
- Unity AssetBundle资源打包,Depend依赖关系
- Unity物理引擎:Colliders简介
- Unity热更新专题(七)SimpleFramework
- Unity物理引擎:Rigidbody简介
- Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动
- 辛巴学院-Unity-剑英陪你零基础学c#系列(二)顺序
- Unity 游戏开发技巧集锦之使用cookie类型的纹理模拟云层的移动