Unity3d开发(十三)导出NavMesh可行走区域信息
来源:互联网 发布:淘宝店铺卖气模名字 编辑:程序博客网 时间:2024/05/01 14:03
div#cpcontent2 {height:215px;width:215px;float:left;}div#cpmenu {height:200px;float:left;}div#cpcontent {height:200px;width:150px;float:left;}
有时我们会需要Unity3d的地图信息,比如A*之类的逻辑运算。当这些操作要放到服务器上进行时,就需要地图信息。通常项目中的行走区域是使用Navmesh制作的。这篇文章中,介绍如何将Navmesh的信息导出成bitmap。
脚本效果
整个工具的设置界面放到Inspector中,由于是程序同学用,所以界面就比较糙,对付用吧 可以设置几个数值,导出地图的左顶点坐标、地图精度、宽、高,设置界面如下图所示:
设置好后点击Export
按钮,即可在场景中计算出可行走区域:
可以看到,与Navmesh的可行走区域相对应位置会画出绿色标尺线,不能行走则标为红色。最终导出的信息内容如下:
startpos=(-6.0, 0.0, 6.0)height=15wide=15accuracy=1{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},{0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,},{0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,},{0,0,1,1,1,1,0,0,0,0,1,0,0,0,0,},{0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,},{0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,},{0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,},{0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,},{0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,},{0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},{0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,},
核心原理
使用一个Unity3d中Navmesh的接口:
NavMesh.SamplePosition
来检测一个点是否在可行走区域中。同时将内容输出到日志中。检测时增加了不同高度的采样,防止由于斜坡引起的遗漏。
代码实现
using UnityEngine;using System.Collections;using System.Text;using UnityEditor;public class NavExport : MonoBehaviour{ #region Public Attributes public Vector3 leftUpStart = Vector3.zero; public float accuracy = 1; public int height = 30; public int wide = 30; #endregion #region Unity Messages void OnGUI() { if (GUILayout.Button("Export")) { exportPoint(leftUpStart, height, wide, accuracy); } } #endregion #region Public Methods public void Exp() { exportPoint(leftUpStart, wide, height, accuracy); } public void exportPoint(Vector3 startPos, int x, int y, float accuracy) { StringBuilder str = new StringBuilder(); int[,] list = new int[x, y]; str.Append("startpos=").Append(startPos).Append("\r\n"); str.Append("height=").Append(y).Append("\r\nwide=").Append(x).Append("\r\naccuracy=").Append(accuracy).Append("\r\n"); for (int i = 0; i < y; ++i) { str.Append("{"); for (int j = 0; j < x; ++j) { int res = list[j, i]; NavMeshHit hit; for (int k = -10; k < 30; ++k) { if (NavMesh.SamplePosition(startPos + new Vector3(j * accuracy, k, -i * accuracy), out hit, 0.2f, NavMesh.AllAreas)) { res = 1; break; } } Debug.DrawRay(startPos + new Vector3(j * accuracy, 0, -i * accuracy), Vector3.up, res == 1 ? Color.green : Color.red, 5); str.Append(res).Append(","); } str.Append("},\n"); } Debug.Log(str.ToString()); } #endregion}[CustomEditor(typeof(NavExport))]public class NavExportHelper : Editor{ public override void OnInspectorGUI() { base.OnInspectorGUI(); if (GUILayout.Button("Export")) { var exp = target as NavExport; exp.Exp(); } }}
如果你觉得这篇文章对你有帮助,可以顺手点个顶,不但不会喜当爹,还能让更多人能看到它...
1 0
- Unity3d开发(十三)导出NavMesh可行走区域信息
- Unity 导出NavMesh (可行走区域判定) 数据给服务器使用
- VRTK 可行走区域块的实现
- Unity3D学习笔记(十三)导出游戏
- 从“可行走骨架”开始开发应用
- unity3d开发2d游戏:自动寻路Navmesh入门
- Unity3D游戏开发之 (Navmesh) 和寻路 (Pathfinding)烘焙
- android studio开发<十三> 导出Jar包并在unity3d中使用
- 59 从可行走骨架开始开发应用
- [Unity3d] [图文]【寻路】 Waypoint 与 NavMesh 比较(转)
- [Unity3d] [图文]【寻路】 Waypoint 与 NavMesh 比较(转)
- [Unity3d] [图文]【寻路】 Waypoint 与 NavMesh 比较(转)
- [Unity3d] [图文]【寻路】 Waypoint 与 NavMesh 比较(转)
- Unity3D架构设计NavMesh寻路
- Unity3D架构设计NavMesh寻路
- unity3D游戏开发十三之GUI
- unity3D游戏开发十三之GUI
- unity3D游戏开发十三之GUI
- JAVA JDK1.5-1.9新特性
- 发的是给对方
- [Noi2016十连测第二场]幻想(后缀平衡树)
- php array
- 深入理解Linux内核 chap 7 进程调度
- Unity3d开发(十三)导出NavMesh可行走区域信息
- 人生其实很有趣
- caffe 结构之Blob
- Git与SourceTree使用详细指南
- Android开发之JSON数据的格式问题
- 图像平滑技术之盒滤波、均值滤波、中值滤波、高斯滤波、双边滤波的原理概要及OpenCV代码实现
- U3D前后端开发知识体系
- 融云后台服务创建token
- 多进程单线程模型与单进程多线程模型之争