下载框架作者的示例工程 https://github.com/EllanJiang/StarForce
移动到 unity 空项目中
然后再下载 Gameframework https://github.com/EllanJiang/GameFramework 放到项目的 Asset 对应文件夹中
打开项目,一切顺利
笨木头的教程
https://github.com/mutouzdl/gameframework_demo
烟雨的视频教程
https://www.bilibili.com/video/av71419528
一开始看烟雨的视频教程感觉,啊,讲得好快
有些看懂了有些没看懂,果然还是要自己看
先把烟雨最后的总结截一下:
1.分为编辑器资源模式和非编辑器资源模式
2.流程的生命周期
3.同一时间,只能有一个流程在运行
4.离开流程时要注意取消订阅事件,防止逻辑冲突
5.DF中所有资源加载,都是异步的,不会阻塞主线程,依靠回调函数来判断有没有加载完成
6.GameEntry.Resource.InitResources 是一定要有的,它在非编辑器资源模式下起着至关重要的作用,它初始化了所有资源到一个映射表,但是并没有把所有资源都加载到内存
一开始看的时候还不知道为什么识别不到 namespace
问了别人才知道要设置 adf,说是 Unity 自定程序集 AssemblyDefinitionFile
建好了 adf,我重新构建一遍,结果发现错误更多,然后居然是引擎内部的程序集引用的问题
这就不科学了,LFS 版本的引擎内部应该不会有问题,所以我觉得可能是我项目构建有问题
或许这是因为我需要使用 unity 的 build 来构建
啊……重新构建了一遍还是有这个问题
我这个是把游戏工程文件夹复制粘贴到空项目中,会不会是我这个做法有问题……难受
好吧,这次我是直接用游戏工程文件夹打开,就好了
难受啊,这是哪里的设置有问题
要开始认真看了
我的打算是一遍看一遍复制粘贴项目,照着改,解决改的时候出现的错误,这样的话就能慢慢知道每个东西都是干嘛的了,大概
程序入口为 Hierarchy - Game Framework 的 GameEntry 脚本组件
因此我搞完 Hierarchy - Game Framework 就先复制 GameEntry 脚本过来
然后脚本里面唯二的两个函数被分在 GameEntry.Builtin 脚本和 GameEntry.Custom 脚本中,再复制这两个过来
然后就可以发现 GameEntry.Builtin 是初始化的框架自带的组件,GameEntry.Custom 是初始化自定义的组件,因此直接复制 GameEntry.Custom 过来的话,因为我还没有写自定义组件,所以找不到,会报错。这个时候我还用不到,先删了吧
一开始 Hierarchy - Game Framework - BuiltIn - Procedure 中啥也没有
从头构建游戏流程的话,那就必须要有流程了嘛,所以现在先要复制这个
根据烟雨的分析,我觉得这个流程……好像挺好的呀hhhh
干脆直接拿过来吧
反正之后只需要修改拓展 ProcedureMain 和 ProcedureMenu
Procedure 命名空间都改完了之后出现的错误:
ProcedureMenu 要用到创建好的 UI 类,我暂时没有界面 UI,就把这部分删去了
不过它要求必须重载 UseNativeDialog
是我没想到的
Procedure 中的 GameBase
和 GameMode
都是基于太空战机这个玩法创建的,那我自然是不能要,之后还是可以借鉴的
比如,他是做了一个游戏模式对应游戏类的字典,啊,这我就不知道为啥了
另外他好像在流程的每一个钩子都要用父类的方法,就比如 OnUpdate
的开头是 base.OnUpdate
,OnLeave
的结尾是 base.OnLeave
然后有一个转换到 menu 界面的方法
procedureOwner.SetData<VarInt32>("NextSceneId", GameEntry.Config.GetInt("Scene.Menu"));
ChangeState<ProcedureChangeScene>(procedureOwner);
他是要转换到 menu,所以设置这个 menu 的 id,但是实际上状态机里面切换到了 ProcedureChangeScene
,那就应该是 ProcedureChangeScene
里面要用到这个 NextSceneId
还有他在 update 中通过计时器来实现延时……哦,这让我知道了原来确实是可以这么做的
ProcedureChangeScene
里面停止声音,恢复正常速度什么的,是把 Main 场景的 OnEnter
的职责分出去了
但是那是因为框架里面已经写好了通用的停止声音,恢复正常速度,就是说,从别的场景里面退出,一样能用,牛啊
然后他根据 id 在 DRScene
中找到对应的场景
怎么判断流程跳转完了呢?他用了一个 m_IsChangeSceneComplete
作为标志
Update
中查看 m_IsChangeSceneComplete
是不是 true,是则 ChangeState
m_IsChangeSceneComplete
在哪里设置为 true 呢,在 OnLoadSceneSuccess
,这是一个事件,这个事件在 OnEnter
被订阅,同时 OnEnter
程序块最后执行了 GameEntry.Scene.LoadScene(AssetUtility.GetSceneAsset(drScene.AssetName), Constant.AssetPriority.SceneAsset, this);
,也就是说这是一个异步的加载场景,在进入 ProcedureChangeScene
的时候就立即加载 Scene,加载完毕之后立即跳转流程
Main 流程中的 m_Games.Add(GameMode.Survival, new SurvivalGame());
就是游戏主逻辑了
但是 SurvivalGame 里面只有一个随机生成陨石的脚本……?为啥捏
啊,又要找了,难受
不过还是先看陨石吧
他用 IDataTable<DRAsteroid> dtAsteroid = GameEntry.DataTable.GetDataTable<DRAsteroid>();
拿到了一个 datatable,但是它只是用来获得一个数量,制作陨石的 typeid,因为后面有 new AsteroidData(GameEntry.Entity.GenerateSerialId(), 60000 + Utility.Random.GetRandom(dtAsteroid.Count)
这个构造函数是 public AsteroidData(int entityId, int typeId)
好奇怪啊,typeid 是在 60000 的基础上加一个随机数
然后这个 Count 应该是场上所有的陨石数量吧,但是我没有在 AsteroidData 的构造函数里面找到修改这个 Count 的内容。
好吧,之后才看到,这个 Count 是数据表的行数
诶呀,那他这个随机就很怪
AircraftData.cs
public AsteroidData(int entityId, int typeId)
: base(entityId, typeId, CampType.Neutral)