当前位置: 首页 > news >正文

关于LightMapping和NavMesh烘焙的动态载入

熟悉unity的朋友都应该知道,unity有内部LightMapping烘焙和NavMesh寻路的功能。但这些非常好用的功能,都是基于对某个已经保存的关卡(scene)进行烘焙(Bake)的操作,我一直以为,一般来说这样非常难做到外部载入或者动态载入的。

        但通过近期一段时间的研究,发现事实上这些基于scene的功能,也是能够动态载入的,尽管在使用上是有一定的限制,只是合理利用还是能做到不少想要的效果的。

        如果我们限制有这种项目要求,游戏项目是网页游戏,因为容量的关系,我们全部的场景都是外部动态载入的,但为了效果好,我们使用了 LightMapping烘焙了场景,而为了有寻路功能,我们对场景进行了NavMesh的烘焙。我们希望把这个烘焙了的场景像一般的 assetBundle那样从外部载入进来。

        如今我们须要把这个烘焙好的场景导出成assetBundle。

使用的方法是:BuildPipeline.BuildPlayer

 

BuildPipeline.BuildPlayer 编译播放器

static function BuildPlayer (levels : string[], locationPathName : string, target : BuildTarget, options : BuildOptions) : string

使用方法举例:

@MenuItem ("Build/BuildWebplayerStreamed")
static function MyBuild(){
var levels : String[] = ["Assets/StreamedScene1.unity", "Assets/StreamedScene2.unity",
"Assets/StreamedScene3.unity"];
BuildPipeline.BuildPlayer( levels, "StreamedWebplayer.unity3d",
BuildTarget.WebPlayer, BuildOptions.BuildAdditionalStreamedScenes);
}

 

比如我们把上面烘焙好的场景保存成scene001,那么我们就能够写成

 var levels : String[] = ["Assets/scenes/scene001.unity"];
 BuildPipeline.BuildPlayer( levels, "scene001.unity3d",
  BuildTarget.FlashPlayer , BuildOptions.BuildAdditionalStreamedScenes);

 

这样我们能够把这个scene001的场景导出成了scene001.unity3d的assetBundle。当我们想从外部载入这个烘焙好的场景时,能够使用WWW来下载他,但使用方法和一般的www载入assetBundle有点不同的使用方法。

如果我们把这个导出的asssetBundle放在了一个路径(url),那么我们能够这样载入它:

        WWW www = new WWW(Url);
        yield return www;
        if (www.error == null)
        {
            AssetBundle level = www.assetBundle;
            Application.LoadLevelAdditive(“”);
        }

 

可 以看出,在前两步,我们的做法和普通的www载入assetBundle是一样的,都是获取一个新的WWW资源,但以下的一步就有点不一样,因为他是一个 场景,而不是一个GameObject,所以我们不能通过Instantiate 来实例化他,而是用Application.LoadLevel 或者Application.LoadLevelAdditive 之类的载入关卡的方法来读取他的。在读取之前,我们仅仅须要随便的把获取回来的www .assetBundle赋予给一个变量,然后,我们就能依照关卡的名称来LoadLevel了。

 

        如今,关卡已经能载入进一个新的项目了,我们能够看到,lightmapping的效果,和NavMesh寻路的网格,依旧存在。

只是我们须要注意下面几个问题:

1、和一般的assetBundle一样,假如我们导出的关卡场景里面包括了某些新项目里面没有的脚本,那么这些脚本在导入新项目的时候会所有丢失。

2、 NavMesh的外部载入仅仅能使用Application.LoadLevel ,假设使用Application.LoadLevelAdditive 的话,NavMesh会所有丢失。也就意味着,NavMesh的场景一次仅仅能载入一个,而不能同一时候载入多个。所以用NavMesh做动态大地图是不可行 的。但LightMapping能够使用Application.LoadLevelAdditive ,能够多个场景同一时候叠加。

相关文章:

  • struts2之example
  • 前嗅ForeSpider教程:采集58同城
  • 配置与管理Apache服务器
  • Go标准容器之List
  • 关于RFC
  • MongoDB官方C#驱动中查询条件Query用法
  • 分享我在学习web前端路上踩过的一些坑
  • MyEclipse10安装PyDev插件
  • Python3获取新浪微博内容乱码问题
  • boost::thread类
  • 一种基于WebRTC与UDP组播的一对多远程控制桌面的实现思路
  • rational clearcase 提交活动注意
  • ELK批量删除索引
  • (转)Android中使用ormlite实现持久化(一)--HelloOrmLite
  • 华致酒行登陆A股 启幕酒业流通“铂金时代”
  • [deviceone开发]-do_Webview的基本示例
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • JAVA多线程机制解析-volatilesynchronized
  • leetcode98. Validate Binary Search Tree
  • maven工程打包jar以及java jar命令的classpath使用
  • mongodb--安装和初步使用教程
  • Mybatis初体验
  • Octave 入门
  • OpenStack安装流程(juno版)- 添加网络服务(neutron)- controller节点
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • php中curl和soap方式请求服务超时问题
  • 高性能JavaScript阅读简记(三)
  • 机器学习中为什么要做归一化normalization
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 前端技术周刊 2019-01-14:客户端存储
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 突破自己的技术思维
  • 移动端唤起键盘时取消position:fixed定位
  • ​iOS实时查看App运行日志
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #LLM入门|Prompt#3.3_存储_Memory
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (顺序)容器的好伴侣 --- 容器适配器
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • *Django中的Ajax 纯js的书写样式1
  • .chm格式文件如何阅读
  • .gitignore文件_Git:.gitignore
  • .net core webapi 部署iis_一键部署VS插件:让.NET开发者更幸福
  • .NET Core 中的路径问题
  • .Net 代码性能 - (1)
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 利用 Walterlv.WeakEvents 高性能地中转一个自定义的弱事件(可让任意 CLR 事件成为弱事件)
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .NET构架之我见
  • .NET开发人员必知的八个网站
  • .NET面试题解析(11)-SQL语言基础及数据库基本原理