笨木头  2018-04-06 21:35     Unity3D,Game Framework     阅读(24162)     评论(44)
转载请注明,原文地址: http://www.benmutou.com/archives/2615
文章来源:笨木头与游戏开发
本文 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事件。

在资源初始化后再进行我们的菜单场景(或其它你想进入的场景)即可。
    protected override void OnEnter (ProcedureOwner procedureOwner) {
        base.OnEnter (procedureOwner);
        ResourceComponent Resource
            = UnityGameFramework.Runtime.GameEntry.GetComponent<ResourceComponent> ();
        // 初始化资源
        Resource.InitResources ();
        EventComponent Event
            = UnityGameFramework.Runtime.GameEntry.GetComponent<EventComponent> ();
        // 订阅资源初始化成功事件(记得在OnLeave函数里取消订阅,我就不演示了)
        Event.Subscribe (ResourceInitCompleteEventArgs.EventId, OnResourceInitComplete);
    }
OK,本Demo的注意事项已经说完了,具体请大家看代码。

 

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

6.唠叨一下

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

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

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

 

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

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

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

 

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

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

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

以上。
44 条评论
  • xushimike 2020-07-29 05:45:14

    Assembly-CSharp-Editor 这一行不建议注释掉。
    注释掉以后,无法自定义给 Editor 使用的类型。例如 Resource Builder 窗口下的 Build Event Handler 下拉列表里的自定义内容就看不到了。

    目前的框架版本是 Game Framework 2020.07.10
    0回复
  • frank 2019-06-20 19:55:22

    木头已经离开游戏行业2-3年了啊 感慨。。 从cocos到u3d 一下就这么久了
    0回复
    • 博主 笨木头 2019-06-21 08:02:16

      /_ \其实已经离开了4年多了(是不是比你想象中过得更快,颤抖一下吧)
      0回复
  • ClarkQi 2018-09-19 11:41:01

    框架怎么加载外部场景呢,比如加载persistentDataPath目录下的场景ab包
    0回复
    • 博主 笨木头 2018-09-20 08:26:53

      不好意思,我也不知道,动态加载AB的所有知识我都不了解
      0回复
  • 海阳宋仲基 2018-09-14 12:01:05

    为啥我点startbuild 没反应啊
    0回复
  • XTStarry 2018-07-22 22:46:38

    按照文档和博客一步一步来,结果将资源包放在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)

    但是我的资源包确实是单机模式的呀
    0回复
    • 博主 笨木头 2018-07-23 08:31:54

      你在电脑上跑的吗?电脑上要把GameFramework对象属性里的【Editor Resource Mode】的勾去掉才能模拟AB加载的情况。
      0回复
      • XTStarry 2018-07-23 09:07:17

        唉,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...
        0回复
        • 博主 笨木头 2018-07-23 11:43:40

          这个是Unity本身的问题,需要把场景添加到Build Setting里,按照它的提示操作就可以了。
          如果已经这么做了还是报错的话,是不是你没有把场景打包到AB里?
          0回复
          • XTStarry 2018-07-23 14:22:36

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

            另外不论是几个场景分开打包还是一起打包都不行......
            0回复
          • XTStarry 2018-07-23 15:03:25

            问题解决了,E大修了个DefaultLoadResourceAgentHelper里的bug
            SceneNamePosition在定义的时候搞错了
            0回复
            • 博主 笨木头 2018-07-24 06:39:59

              噢?有这种Bug?奇怪,我这边用着倒是挺正常...
              0回复
  • 盼盼 2018-07-18 10:05:29

    感谢楼主的分享!一开始一头雾水,现在慢慢的理解一些,就是不知道动态加载怎么弄!祝楼主工作顺利
    0回复
    • 博主 笨木头 2018-07-18 12:27:39

      谢谢,动态加载暂时没动力研究...(因为挺讨厌AB这种东西的说)
      0回复
  • 阿里晕呕爱思 2018-06-23 15:42:02

    前辈,为什么我创建AssetBundleEditor到指定路径,AssetbundleEditor编辑器里面还是空的
    1回复
    • 博主 笨木头 2018-06-23 19:17:44

      为空的话,要注意一下官方的那篇文档,里面有提到一个配置文件(Assets\GameFrameworkConfigs\AssetBundleEditor.xml),如果没有那个配置文件,里面就会是空的。
      你看看是不是这个原因?
      0回复
      • 阿里晕呕爱思 2018-06-23 19:19:33

        那个配置文件创建了,并且复制了官网的代码,编辑器里面还是空。是还缺少其他操作步骤么
        0回复
        • 博主 笨木头 2018-06-25 08:41:00

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

          另外,打开编辑器的时候,有没有报错日志或者警告日志?
          0回复
  • 仰望星空 2018-06-19 19:48:20

    木头,动态加载的问题有解决没,我的项目里面正好有一处需要动态加载资源,因为那个配置表的解析Helper没办使用默认的,是自己重写的,需要动态加载脚本,并加载数据表才能解析成功。这样导致我的项目导出后黑屏了。
    0回复
    • 博主 笨木头 2018-06-20 08:58:22

      你是指,在需要用到的时候再加载资源,而不是像我这样一开始就调【Resource.InitResources ()】初始化资源,是这个意思吗?
      你用开发模式导出,看看报了什么错,或出现了什么警告?
      0回复
      • 仰望星空 2018-06-20 09:48:18

        嗯 是这个意思。我试一试。
        0回复
        • 仰望星空 2018-06-20 14:44:19

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

            说实话,对于我这种写点小游戏的个人来说,根本就不想用AssetBundle...
            0回复
  • 洛辰 2018-05-31 16:33:45

    PC端发布可以正常运行了,为啥发布成安卓程序的apk,就还是启动后黑屏?
    0回复
    • 博主 笨木头 2018-05-31 20:13:51

      抱歉,Android的发布我还没试过,近期把开源的那个小游戏完善后,再研究一下Android的发布,到时候再和大家分享
      0回复
  • 淼淼 2018-04-27 16:53:25

    赞一个,木头转行做啥了?
    0回复
    • 博主 笨木头 2018-04-27 17:10:06

      还是开发,只是不在游戏行业了~
      0回复
      • AugustLee 2018-05-03 10:19:42

        博主不是会游戏的技术么? 不在游戏行业了那去做什么了?
        0回复
        • 博主 笨木头 2018-05-03 13:13:03

          说来复杂...现在在创业公司打杂
          0回复
          • AugustLee 2018-05-17 11:50:39

            创业公司坑比较多啊感觉
            0回复
            • 博主 笨木头 2018-05-17 13:27:45

              是的,我离开游戏行业的原因之一就是刚毕业就进了手游创业公司,噩梦。
              现在的公司老板很好,很信任我,我满足了。
              0回复
              • 章涵 2018-12-19 10:22:08

                木头大大,问一下,你目前是在做什么开发啊?还用unity吗?如果不用现在主要是用什么开发 啊
                0回复
                • 博主 笨木头 2018-12-19 13:54:23

                  我现在在创业公司,多面手,什么都开发(为了生活)。
                  业余时间还在用Unity写自己的游戏(真爱)。
                  0回复
                  • 章涵 2018-12-19 14:03:00

                    可以加你qq吗?看完你的创业心路历程23篇全文,对于你说的流氓股,强者之心,超级有感触,可以交个朋友吗。我的qq:315052776
                    0回复
                  • 章涵 2018-12-19 15:10:10

                    木头大大,请教一下,目前觉得自己目前对于unity开发游戏上的认知,很杂乱,散,这里知道一点,那里知道一点,不规范,不统一,如果换一个游戏,那些代码可以保留下来,那些地方要根据新游戏新需求去改动,没有脱离单个游戏的模块化的复用核心代码的积累,这种情况怎么办比较好
                    0回复
                    • 博主 笨木头 2018-12-19 17:06:58

                      其实我现在基本没上Q了,欢迎邮件和我交流(musicvs@163.com),邮件我一直都在用。

                      关于你那个问题,我相信大部分人都会遇到,一方面是自己去优化,比如你在新游戏需要用到战斗功能,你就可以把旧的代码拿过来用,每一次拿过来就优化一次,因为你的技术是不断成长的,肯定会一次好过一次。
                      另一方面是和其它开发者交流(有条件的话,像我就没有人可以交流...),或者是阅读一些源码。

                      其实你说的这些问题,我也有,感觉就是成长过程的其中一个环节。
                      一旦没有这种困扰了,那可能是你技术发展停滞了,或者是你技术水平达到顶峰了。
                      0回复
发表评论
粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发