• Unity 导出NavMesh (可行走区域判定) 数据给服务器使用


    img cp790621656
    博客专家

    Unity 导出NavMesh (可行走区域判定) 数据给服务器使用

    发表于2016/9/26 18:15:11  1089人阅读

    分类: Unity MMO

    这个项目的客户端使用Unity 自带的 NavMesh 来做寻路。然后怪物的刷新以及移动是由服务器负责的,但是这样会有一个问题,如果怪物在场景边缘或者怪物与人之间有障碍物,服务器是又不知道这里有障碍物,那怪物的移动就没法做了。

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn  转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn  转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn  转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn  转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn  转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    所以有这么个需求,让服务器能够判定当前移动位置是否在可行走区域之内。

    所以就需要把客户端的 NavMesh数据导出给服务器使用(或许有其它的办法)。

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn  转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    Unity 提供了相关的接口:

    NavMesh.CalculateTriangulation

    利用这个接口能够获取到NavMesh 的数据,顶点以及顶点索引。

    熟悉GL或DX的童鞋知道有了顶点以及顶点索引就可以画出模型来。

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    下面是我写的一个简单的示例,用来把NavMesh 数据导出到一个 obj 文件,obj 是一种文本形式存储的模型文件格式。导出之后直接拖到Unity 中可以看到NavMesh 的形状。

    /************************************************
     * 文件名:ExportNavMesh.cs
     * 描述:导出NavMesh数据给服务器使用
     * 创建人:陈鹏
     * 创建日期:20160926
     * http://blog.csdn.net/huutu/article/details/52672505
     * ************************************************/
    
    using UnityEngine;
    using System.Collections;
    using UnityEditor;
    using System.IO;
    using UnityEngine.SceneManagement;
    
    public class ExportNavMesh
    {
        [MenuItem("NavMesh/Export")]
        static void Export()
        {
            Debug.Log("ExportNavMesh");
    
            NavMeshTriangulation tmpNavMeshTriangulation = NavMesh.CalculateTriangulation();
    
            //新建文件
            string tmpPath = Application.dataPath + "/" + SceneManager.GetActiveScene().name + ".obj";
            StreamWriter tmpStreamWriter = new StreamWriter(tmpPath);
    
            //顶点
            for (int i=0;i<tmpNavMeshTriangulation.vertices.Length;i++)
            {
                tmpStreamWriter.WriteLine("v  "+ tmpNavMeshTriangulation.vertices[i].x+" "+ tmpNavMeshTriangulation.vertices[i].y+" "+ tmpNavMeshTriangulation.vertices[i].z);
            }
    
            tmpStreamWriter.WriteLine("g pPlane1");
    
            //索引
            for (int i = 0; i < tmpNavMeshTriangulation.indices.Length;)
            {
                tmpStreamWriter.WriteLine("f " + (tmpNavMeshTriangulation.indices[i]+1) + " " + (tmpNavMeshTriangulation.indices[i+1]+1) + " " + (tmpNavMeshTriangulation.indices[i+2]+1));
                i = i + 3;
            }
    
            tmpStreamWriter.Flush();
            tmpStreamWriter.Close();
    
            Debug.Log("ExportNavMesh Success");
        }
    }
    

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    点击Export 导出后,会生成以 当前 Scene 命名的 obj 文件

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    拖到Unity 中绘制出来如下,证明我们成功导出了NavMesh的数据

    转自http://blog.csdn.net/huutu http://www.thisisgame.com.cn

    把这个 obj 扔给服务器,服务器进行怪物是否在三角形 范围内判定。具体怎么做我不管了。

  • 相关阅读:
    Java数据结构和算法(三)——冒泡、选择、插入排序算法
    Java数据结构和算法(二)——数组
    Java数据结构和算法(一)——简介
    Linux系列教程(二十四)——Linux的系统管理
    部署python项目到linux服务器
    ImportError:No module named 'PIL'
    Django异常
    linux安装mysqlclient报错
    python升级带来的yum异常:File "/usr/bin/yum", line 30
    python3+django+mysql
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/6685809.html
Copyright © 2020-2023  润新知