[GameFramework]Demo9-AssetBundle打包的一些坑

笨木头  2018-04-6 21:35   未分类   阅读(2,607)   36条评论

本文 Game Framework 版本:3.1.1

本文 Unity3D 版本:2017.3

更多GF教程和实例:https://github.com/mutouzdl/gameframework_demo.git

 

转载请注明,原文地址:http://www.benmutou.com/archives/2615
文章来源:笨木头与游戏开发

关于AssetBundle的用法,官方已经有两篇文档了,我当然不会重复写的。

但是,对于AssetBundle新手来说,官方那两篇文档还少了几个细节,这几个细节可能会导致新手无法打包成功,所以我在这里以补充的角度和大家讲解一下AssetBundle(针对GF框架)的注意事项。

 

(另外,Demo8还没完成,因为有朋友问到了打包的问题,所以先研究这块了)

1.为什么打包后,场景加载不了

大家别笑,有位朋友问我,为什么打包成windows平台后,加载场景都失败了。

然后我觉得很奇怪,怎么会呢,后来我试了试

啪啪啪,脸疼。

确实加载不了场景呢,呵呵。

原因很简单,在GameFramework框架中,所有的东西都是资源,包括场景。

所以,想要在打包后成功加载场景,就得把场景作为资源进行加载。

资源怎么加载?由于我也是GF的新手,目前我只知道通过AssetBundle打包资源,然后再加载。

2.AssetBundle是什么?

木头离开游戏行业2、3年了,Unity3D也一直都是业余在玩,所以,老实说,我压根没有用过AssetBundle。

最简单粗暴的理解就是,AssetBundle的作用是,把资源打包,然后可以动态加载,从而可以实现资源的热更新。

大家自行去学习AssetBundle,我就不误人子弟了。

3.AssetBundle Editor

关于GameFramework的AssetBundle打包方式,大家自行去看官方的文档,按照以下顺序:

http://gameframework.cn/archives/320 (使用AssetBundle编辑工具)

http://gameframework.cn/archives/356 (使用AssetBundle构建工具)

 

关于AssetBundle编辑工具,简单补充一下,左边是各个资源包,自己新建即可。

选中资源包后,中间的部分就是资源包的内容,内容从哪来?就是从右边的资源列表里来。

把你想添加的资源选中,然后点击”<<“按钮就可以了。

 

由于场景和预制体没法打在一个包里,我在Demo里打了两个包:

4.AssetBundle Builder

关于就是这个构建工具了,大家打开的话,一定是报错的(除非你直接把StarForce项目拿过来用)。

大概是这样:

这个问题折腾了我2天(我每天只能在上班前和下班后分别研究50分钟,一天是两个50分钟)。

因为报错信息是一连串的,99.9%都是同一条信息,导致我忽略了第一条:

 

似乎有某个程序集缺失了,要解决这个问题,有两个办法,第一个,建一个Editor的目录,然后随便建一个类。

然后就会生成这个带Editor名称的程序集了:

 

第二个办法是,将GameFramework\Scripts\Editor\Misc目录下的Type.cs文件的EditorAssemblyNames属性里的”Assembly-CSharp-Editor”注释掉。

然后就正常了。

剩下就按照官方文档来做就行了

5.初始化时,加载资源

资源打包好,并且拷贝到相应的目录后,并不代表结束了。

这点在官方文档里并没有提到,资源打包之后,是需要先加载再使用的。

大家别笑我,我只是以为框架有自动加载所需资源的功能而已

好吧,你们笑就笑,但别捂肚子,我是认真的。

 

对于一开始就把所有资源都加载的游戏,很简单(需要实时加载的我就不演示了,没去研究)。

在初始场景里,先调用ResourceComponent的InitResources函数对资源进行初始化,初始化成功后会出发ResourceInitComplete事件。

在资源初始化后再进行我们的菜单场景(或其它你想进入的场景)即可。

OK,本Demo的注意事项已经说完了,具体请大家看代码。

 

特别提醒,如果你要在电脑上加载AB资源,则必须把GameFramework对象里的Editor Resource Mode的勾去掉:

6.唠叨一下

我研究这个问题也就花了2、3个小时,但是我写这篇文章,需要花一小时(有些文章会更久)。

希望大家也能有分享精神,解决了自己的问题的同时,能分享一下心得。

那样的话,在帮助了其他人的同时,自己也能梳理思路,何乐而不为呢。

 

我毕竟已经不在一线开发游戏了,在GameFramework框架上,不会给大家带来太多的帮助,只能给大家做个入门指引,仅此而已。

我研究这个框架的目的并不是要在实际项目中使用,说实话,我个人写的小游戏,压根用不上什么框架,我自己搭的搓框架就够用了。

我就是想学习一线高手的思想,但是我觉得很孤单

 

我平时时间不多,没法一直关注官方群,所以大家在群里再怎么讨论,我都没法获得太多帮助(每天去翻聊天记录太耗时,还得筛选无效信息)。

我相信,和我一样的人,有很多

真的希望大家可以戒掉群聊,多留点文章、issues,造福后人。

以上。

36 评论

  1. 按照文档和博客一步一步来,结果将资源包放在StreamingAssets后,报错NotSupportedException: InitResources
    NotSupportedException: InitResources
    UnityGameFramework.Runtime.EditorResourceComponent.InitResources () (at Assets/GameFramework/Scripts/Runtime/Resource/EditorResourceComponent.cs:659)
    UnityGameFramework.Runtime.ResourceComponent.InitResources () (at Assets/GameFramework/Scripts/Runtime/Resource/ResourceComponent.cs:623)
    ProcedureLaunch.OnEnter (IFsm`1 procedureOwner) (at Assets/Scripts/ProcedureLaunch.cs:29)
    GameFramework.Fsm.Fsm`1[GameFramework.Procedure.IProcedureManager].Start (System.Type stateType)
    GameFramework.Procedure.ProcedureManager.StartProcedure (System.Type procedureType)
    UnityGameFramework.Runtime.ProcedureComponent+c__Iterator0.MoveNext () (at Assets/GameFramework/Scripts/Runtime/Procedure/ProcedureComponent.cs:94)
    UnityEngine.SetupCoroutine.InvokeMoveNext (IEnumerator enumerator, IntPtr returnValueAddress) (at C:/buildslave/unity/build/Runtime/Export/Coroutines.cs:17)

    但是我的资源包确实是单机模式的呀

      1. 唉,AB这边真的是一步一个错误。解决了上个错误,又提示我场景未加载…
        Scene ’01’ couldn’t be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.
        To add a scene to the build settings use the menu File->Build Settings…

        1. 这个是Unity本身的问题,需要把场景添加到Build Setting里,按照它的提示操作就可以了。
          如果已经这么做了还是报错的话,是不是你没有把场景打包到AB里?

          1. 我已经将场景添加到Build Setting,也将场景打包到AB里了。
            但是我代码里面写的是真实的场景名称,而不是“01”(比如我加载场景那一行是 Scene.LoadScene(“Assets/Scenes/01.MainMenu.unity”, this);
            ),难道是这个原因?
            但是我看demo9里面也是这个写法啊

            另外不论是几个场景分开打包还是一起打包都不行……

          2. 问题解决了,E大修了个DefaultLoadResourceAgentHelper里的bug
            SceneNamePosition在定义的时候搞错了

  2. 感谢楼主的分享!一开始一头雾水,现在慢慢的理解一些,就是不知道动态加载怎么弄!祝楼主工作顺利

  3. 前辈,为什么我创建AssetBundleEditor到指定路径,AssetbundleEditor编辑器里面还是空的

    1. 为空的话,要注意一下官方的那篇文档,里面有提到一个配置文件(Assets\GameFrameworkConfigs\AssetBundleEditor.xml),如果没有那个配置文件,里面就会是空的。
      你看看是不是这个原因?

      1. 那个配置文件创建了,并且复制了官网的代码,编辑器里面还是空。是还缺少其他操作步骤么

        1. 这是正在写的小游戏项目的配置,你看看有没有不一样的地方?https://github.com/mutouzdl/GF_JustOneLevel/blob/Dev/Assets/GF_JustOneLevel/Configs/AssetBundleEditor.xml

          另外,打开编辑器的时候,有没有报错日志或者警告日志?

  4. 木头,动态加载的问题有解决没,我的项目里面正好有一处需要动态加载资源,因为那个配置表的解析Helper没办使用默认的,是自己重写的,需要动态加载脚本,并加载数据表才能解析成功。这样导致我的项目导出后黑屏了。

    1. 你是指,在需要用到的时候再加载资源,而不是像我这样一开始就调【Resource.InitResources ()】初始化资源,是这个意思吗?
      你用开发模式导出,看看报了什么错,或出现了什么警告?

        1. 测试后,发现是UIForm配置表格,对应的DRUIForm解析脚本中的ParseDataRow方法,没有按照自己配置文件的解析方式来导致的。PS:个人感觉,资源还是一开始全部加载比较符合游戏逻辑,动态加载资源需要控制的变量太多,不利于开发。

    1. 抱歉,Android的发布我还没试过,近期把开源的那个小游戏完善后,再研究一下Android的发布,到时候再和大家分享

            1. 是的,我离开游戏行业的原因之一就是刚毕业就进了手游创业公司,噩梦。
              现在的公司老板很好,很信任我,我满足了。

  5. 前阵子开始学习用框架重构自己的小DEMO,本来拿到这个框架是一头雾水,不知从何下口的。
    感谢博主的这系列文章,顺着博主的思路,现在已经慢慢入手了,学到了好多。

发表评论

电子邮件地址不会被公开。 必填项已用*标注