笨木头  2018-04-06 21:35     Unity3D,Game Framework     阅读(27594)     评论(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,造福后人。

以上。

粤ICP备16043700号

本博客基于 BlazorAnt Design Blazor 开发