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

  • 相关阅读:
    图的连通性问题之tarjan算法
    图的连通性问题之强连通分量初步
    NOIP 2010 引水入城
    最短路经典例题 codevs 1557 热浪
    图的连通性问题之连通和最小环
    最短路径算法
    《数据结构与算法-Javascript描述》
    蓝天白云
    《慢慢来,一切都还来得及》
    聚餐
  • 原文地址:https://www.cnblogs.com/blfshiye/p/3781443.html
Copyright © 2020-2023  润新知