熟悉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烘焙的动态载入的更多相关文章

  1. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

  2. js中动态载入css js样式

    js中动态载入css样式,方法如下: //<link rel="stylesheet" type="text/css" href="http:/ ...

  3. 深入浅出Android动态载入jar包技术

    在实际项目中.因为某些业务频繁变更而导致频繁升级client的弊病会造成较差的用户体验,而这也恰是Web App的优势,于是便衍生了一种思路.将核心的易于变更的业务封装在jar包里然后通过网络下载下来 ...

  4. Unity 动态载入Panel并实现淡入淡出

    unity版本:4.5 NGUI版本:3.6.5 参考链接:http://tieba.baidu.com/p/3206366700,作者:百度贴吧 水岸上 动态载入NGUI控件,这里用Panel为例说 ...

  5. 实现Android 动态载入APK(Fragment or Activity实现)

    尊重原创:http://blog.csdn.net/yuanzeyao/article/details/38565345 近期由于项目太大了.导致编译通只是(Android对一个应用中的方法个数貌似有 ...

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

    解释下标题,我这里通过webservice获取数据并动态载入TreeView节点.那么某个节点展开前它是没有子节点的.那么它就不显示加号.这样会让用户误以为此节点不能展开.我是这样做的,每次创建节点a ...

  7. C# 动态载入Dll

    1.新建測试dll及方法,用vs2010新建winform程序,详细代码例如以下: using System; using System.Collections.Generic; using Syst ...

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

    如有转载,请声明出处: 时之沙: http://blog.csdn.net/t12x3456    (来自时之沙的csdn博客) 概述: 随着应用的不断迭代.应用的体积不断增大,项目越来越臃肿,冗余添 ...

  9. cocos2dx3.2 异步载入和动态载入

    半个月没有更新博客,从这个项目開始学习了非常多细节的东西,都不太成系统.可是却是开发上线中必须经历的东西.比方超级玛丽系列(一)中的正确的异步载入,正确的分层.正确的合成和载入plist.及时的移除未 ...

随机推荐

  1. 【数据挖掘基础算法】KNN最近邻分类算法

    算法简介: 通过计算待预测样本和已知分类号的训练样本之间的距离来判断该样本属于某个已知分类号的概率.并选取概率最大的分类号来作为待预测样本的分类号 懒惰分类算法,其模型的建立直到待预测实例进行预测时才 ...

  2. [Spring Data JPA问题]Executing an update/delete query; nested exception is javax.persistence.TransactionRequiredException

    JPQL如下: @Modifying(clearAutomatically = true) @Query("UPDATE SyncTestFromTKDO SET stuAns = '' w ...

  3. appium---【Mac】Appium-Doctor提示WARN:“ opencv4nodejs cannot be found”解决方案

    报错提示: AppiumDoctor  ✖. opencv4nodejs cannot be found 如下截图: 解决方案: 第一步:安装cmake并配置环境变量 1.打开terminal执行:c ...

  4. numpy,看不懂,但很利害

    慢慢有感觉.. 截几个图看看. import numpy as np np.random.seed(42) complex_numbers = np.random.random(5) + 1j * n ...

  5. Hadoop(三)HDFS读写原理与shell命令

    一 HDFS概述 1.1 HDFS产生背景 随着数据量越来越大,在一个操作系统管辖的范围内存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件 ...

  6. js正则获取url参数,包含hash[#]和search[?]两种通用

    function getQueryString(name) { var reg = new RegExp("(^|&)" + name + "=([^&] ...

  7. bzoj 1132 几何

    思路:我刚开始算三角形的方法是原点叉积三条边,然后计算每条边向量积的贡献,但是对于同一条线上的点 有时候没有办法抵消掉..... 看网上的思路是对于一个三角形的面积通过两条边的叉积获得,然后枚举一个点 ...

  8. Screen 常用命令+VNC 启动停止命令总结

    screen -S 名称:创建一个新的会话 screen -r 会话ID:恢复一个Detach状态的会话 screen -xr 会话ID:强制恢复一个Attach状态的会话,常用于掉线时上次的会话没有 ...

  9. Python类总结-析构函数和__call__方法

    class Foo: def __init__(self): pass #析构函数 def __del__(self): print('解释器要销毁我了,我要做最后一次呐喊') def __call_ ...

  10. 初拾Java(问题三:乱码问题)

    年后的工作不是那么的忙,最近也开始思考自己以后的路该怎么走,在迷茫的时候,还是坚持学习点儿东西吧. 接着之前的JSP,这次是要尝试着用request.getParameter(ParameterNam ...