[Unity] GameFramework 学习记录 1

本文记录了在Unity中学习和使用GameFramework框架的过程,包括如何导入框架、参考教程,以及遇到的错误和解决方法。文章提到了GameFramework的资源加载方式、流程生命周期等关键点,并分享了在实际操作中对框架的理解和应用。
摘要由CSDN通过智能技术生成

下载框架作者的示例工程 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 中的 GameBaseGameMode 都是基于太空战机这个玩法创建的,那我自然是不能要,之后还是可以借鉴的
比如,他是做了一个游戏模式对应游戏类的字典,啊,这我就不知道为啥了
另外他好像在流程的每一个钩子都要用父类的方法,就比如 OnUpdate 的开头是 base.OnUpdateOnLeave 的结尾是 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)
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值