关于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 ,能够多个场景同一时候叠加。

关于LightMapping和NavMesh烘焙的动态载入,布布扣,bubuko.com

时间: 2024-12-17 11:16:22

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

动态载入Layout 与 论Activity、 Window、View的关系

1)动态载入Layout的代码是 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null)); 它等同于 setContentView(R.layout.main); 事实上 getWindow().setContentView(LayoutInflater.from(this).inflate(R.layout.main, null))  是 setContentView(R.layout

Silverlight动态载入调用XAML资源

以多语言为例子: ResourceDictionary resourceDictionary = new ResourceDictionary(); //新建资源集合 var culture = CultureInfo.CurrentCulture;//获取本地Culture if (culture.Name != "zh-CN") { Application.LoadComponent(resourceDictionary, new Uri("/ETiger_MarketT

动态载入TreeView时让TreeView节点前显示加号

解释下标题,我这里通过webservice获取数据并动态载入TreeView节点.那么某个节点展开前它是没有子节点的.那么它就不显示加号.这样会让用户误以为此节点不能展开.我是这样做的,每次创建节点a时,默觉得它创建一个子节点b(随便给个名字即可,如果为"呵呵"),那么创建的节点a就有了子节点b,也就会显示加号了,等展开节点a时,再把刚才默认创建的子节点b移除就能够了,删除方法是先推断展开的节点a是否有一个子节点而且名字为"呵呵".如果为真则删掉. 当然这样做导致有

DL动态载入框架技术文档

DL动态载入框架技术文档 DL技术交流群:215680213 1. Android apk动态载入机制的研究 2. Android apk动态载入机制的研究(二):资源载入和activity生命周期管理 3. APK动态载入框架DL解析 4. Android 使用动态载入框架DL进行插件化开发 5. DL插件开发笔记 6. DL开发注意事项 附:DL层次结构图

兼容的动态载入JS【原】

兼容的动态载入JS 屌丝就是悲剧,五一还得宅家里敲代码专研技术. 说起动态载入JS,搞web的肯定不陌生,著名的YUI库就有强大的模块化的动态载入JS机制.在代码量不断庞大的今天,动态载入JS作用还是很明显的.其实这门技术已经很古老了,但是发现网络上很多资料也同样很古老.诶,没法,自立更生吧,人生总要不断积累的,更何况作为一个程序猿呢. 关于动态JS大家比较关注的无非就两点,兼容性如何?如何控制是同步还是异步?现在针对常见的4种方案来分析.前3种是异步的,最后1种是同步的. 方法1: <scri

Android 使用动态载入框架DL进行插件化开发

如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客) 概述: 随着应用的不断迭代.应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号.强制用户进行更新.结果频繁的更新,反而容易减少用户使用黏性.或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装. 怎么办? 參考浏览器-插件开发模式:

java动态载入指定的类或者jar包反射调用其方法

序言 有时候.项目中会用到java动态载入指定的类或者jar包反射调用其方法来达到模块的分离,使各个功能之间耦合性大大减少,更加的模块化.代码利用率更高.模式中的代理模式就用到java的这一机制. 下边就让我们通过代码来看看怎样实现此功能. 代码具体 package loadjarclass; import java.io.File; import java.lang.reflect.Method; import java.net.URL; import java.net.URLClassLoa

Android中apk动态载入技术研究(2)android插件化及实现

了解了android中类载入的前期知识点后,来看看android中DexClassLoader详细的实现 详细载入流程例如以下: 宿主程序会到文件系统比方SD卡中去载入APK[1],然后通过一个叫proxy的Activity去运行apk中的Activity 关于动态载入ap.理论上可用用到DexClassLoad.PathClassLoader.URLClassLoader; DexClassLoader: 能够载入文件系统上的jar.dex.apk PathClassLoader:能够载入 /

动态类型和动态绑定,动态载入

1.       iOS动态类型和动态绑定简述 NSObject * 也就是id类型---动态类型 动态绑定: 先明白引用多态---父类指针可以指向子类对象 方法多态: 方法名相同,方法的实现却不同 动态绑定就是当程序运行的时候,才去查找对象的类型. 一种是静态载入,一种动态载入 2.      简述你对UIView.UIWindow和CALayer的理解 UIWindow 就是程序的窗口,一个程序可以有多个窗口,但是屏幕大小限定的在同一时间内,只能显示一个窗口,窗口上面显示的UIView,可以