主要工作内容如下:
Tab
即可显示轮盘, 鼠标悬停可以选择武器, 轮盘最多可以同时显示6把武器, 超过6把武器就会显示翻页按钮, 鼠标悬停在指定武器上时按下Space
可以快速扔掉武器重构buff系统, 现在将所有buff属性拆成一个个的buff片段, 再由这些buff片段组成buff道具或者主动道具, buff属性基类PropFragment
, PropFragment
有以下分支子类
新增被动道具(BuffPropBase.xlsx
)和主动道具(ActivePropBase.xlsx
)表
工具/生成buff属性表
, 该功会汇总所有buff片段, 并生成一份用于用于快速查询buff及其描述的.md
文件Array
或Map
类型后面添加*
号, 可以省略Array
两端的中括号或者Map
两端的大括号object
数据类型, 映射到C#类型为: System.Text.Json.JsonElement
新增5个主动道具
更新液体shader, 不再使用非常糊的液体边缘
AiRole
类, 所有Ai逻辑全部从Enemy
移动到AiRole
, 现在Enemy
只负责区分敌人
这一角色类型重大调整, 引入阵营系统, 角色只会攻击敌对阵营的目标, 游戏中也支持实时修改角色阵营的功能, 例如修改房间中其中第一个敌人阵营, 将其变为玩家阵营, 其它敌人就会和它打起来, 也就是电子斗蛐蛐, 目前包含以下阵营:
修复地牢生成器发现的bug
游戏暂定名为《枪火地牢》
项目从4.2升级到4.2.1, 本次更新大量内容, 地牢编辑器2.0, 游戏大厅, 奖励房间, 自定义地牢生成规则, 地牢装饰等, 所以开发周期来到了两个半月
主要工作内容如下:
Aspose.Cells
, 这个库在执行导出excel不会修改excel文件内容, 也就是不会被git侦测到修改InputAction
, 用于控制用户输入行为UiGrid
和部分Ui会产生游离节点的bugActivityObject
实例, 通过ActivityInstance
节点实现项目正式从Godot4.2beta升级到4.2, 这一个半月主要工作内容:
AnimatedSprite
精灵的中心点, 这样更加方便制作武器动画ObjectPool
, 可入池对象必须实现IPoolItem
接口, 但为了方便获取池中的物体, 新增ObjectManager
用于根据某些标记快速获取对象池中的物体FreezeSprite
, 用于绘制静止不动的 ActivityObject
,从而优化性能, 包含功能:
Freeze()
和Unfreeze()
来冻结和解冻, 与BecomesStaticImage()
不同的是, Freeze()
并不会销毁物体, 并且可逆RoomStaticSprite.CollisionCircle()
, 可用类似爆炸等造成范围影响的功能FreezeSprite
数量上限, 防止数量过多造成卡顿BulletBase.xlsx
配置表中FireManager.ShootBullet()
发射字段, 调用FireManager.ThrowShell()
抛射弹壳ActivityMaterial.xlsx
, 并提供摩擦力
,重力
,回弹
等基础物理模拟属性BrushImageData
)在LiquidCanvas
上绘制液体, 液体会随着时间消散, 液体材质配置为LiquidMaterial.xlsx
, 液体笔刷管理器为LiquidBrushManager
, ActivityObject
新增绘制液体函数DrawLiquid()
, 目前暂未制作互动效果ActivityObject
支持自定义阴影, 在预制体的ShadowSprite
节点中放入阴影纹理即可视为自定义阴影ctrl
键展开小地图, 展开后使用鼠标右键可以拖拽小地图, 并且点击鼠标左键可以传送到已经探索的房间项目从Godot4.1升级到4.2beta, 使用了部分新功能以提升视觉效果, 本月主要完善Role
的动作和提升地牢视觉效果, 项目已正式开源
将项目的Ui框架抽成一个单独的Ui插件, 命名为DsUi
近一个半月主要工作内容如下:
Weapon.Trigger()
, 也就是在地上开火Role
击退效果, 被子弹击中, 武器近战等都可以击退Role
对象, 但是玩家不能被击退debug
浮动窗口, 用于游戏中查看日志, 代码日志改用Debug.Log()
和Debug.LogError()
函数esc
键可以呼出暂停菜单经过两个月漫长的开发, 新版地牢编辑器初版已经开发完成, 目的为了更加方便开发者和玩家制作地图, 新版地牢编辑器提供功能如下:
除此了地图编辑器以外, 游戏本体还有以下更新:
Cell
排序, 触发点击Cell
, 双击Cell
, 帧函数等, 新增IUiNodeScript
接口, 用于Ui脚本节点获取该节点的IUiNode
实例对象IsCoroutineOver()
函数来判断一个协程是否执行完成, 协程加入异常捕捉函数, 这样执行一个协程发生异常就不会影响其它协程执行本轮主要完成主动和被动道具框架, 并且优化游戏中的Ui, 主要工作内容如下:
Prop
, 继承自ActivityObject
, 主动道具基类ActiveProp
, 被动道具基类BuffProp
, 现已经完成移速,射速,伤害,散射值,血量上限,护盾等控制基础属性道具Holster
抽成通用背包Package
, 并且删除Holster
, 可放入Package
的物体必须基础ActivityObject
类和实现接口IPackageItem
Shell
销毁后没有从AffiliationArea
中移除的bug本轮主要更改美术素材和添加音效, 并且使用excel作为项目配置表, 添加完整的游戏开始与结束流程
主要工作内容如下:
开始游戏
, 设置
, 结束游戏
三个按钮, 点击开始游戏
进入加载页面, 加载完成后进入地牢. 当玩家死亡后跳出结算页面, 结算页面包含重新开始
和回到主菜单
的按钮Sprite
, 实现类为ImageCanvas.cs
, 原理是将Texture2D
的纹理数据绘制到另一张Image
上, 并使用Sprite2D
来渲染这张Image
, 这样只需要调用一次渲染API就可以永久保存纹理数据, 为了防止同一帧突然添加大量渲染的图片导致处理时间过长, 这里引入了一个渲染队列机制, 如果渲染时间超过阈值时间, 后面的图片就放到下一帧渲染, 以确保游戏能稳定60帧运行ImageCanvas
实例, 并覆盖整个房间, 武器抛出的弹壳或者其它ActivityObject
可以调用ActivityObject.BecomesStaticImage()
函数将物体的纹理渲染到房间的ImageCanvas
上, 并且销毁当前对象, 这样大大节省性能开销导出excel表
按钮, 点击后会读取目录DungeonShooting_Godot\excel\excelFile
下的所有.xlsx
文件, 并生成对应的json配置文件和读取json的c#代码文件, 也就是根据excel表结构生成对应的实体类代码, 导出工具支持数据类型: 基础数据类型
, Array
, Dictionary
, 并且支持引用其它excel表ActivityObject
创建流程, 现在不再像以前一样在编辑器中创建ActivityObjectTemplate
了, 也不需要再ActivityObject
子类上添加[RegisterActivity]
标记, ActivityObjectTemplate
和RegisterActivity
类已被移除, 现在是直接在编辑器中创建ActivityObject
子类节点, 注册对象需要在ActivityObject.xlsx
表中填写物体id
和prefab路径
InputManager.cs
Weapon.xlsx
配置表, 添加更多新属性, 用于创建更丰富的武器, 并且支持配置音效狙击枪
和冲锋枪
ResourcePathGenerator.cs
支持排除指定路径文件夹本轮主要优化视觉上的效果, 并且完善模板房间创建的功能, 主要工作内容有:
ActivityMark
创建单位的流程, 并且引入了ActivityExpression
表达式, 用于创建单位并初始化属性, 也可以在表达式中指定多个id并让ActivityMark
从中随机挑选创建单位. 添加单位创建特效, 修复ActivityMark
在初始房间存在的bugEnemyMark
, 用于在指定位置创建敌方单位, 并且支持配置手中的武器Role.OnPutBackMount()
函数来设置角度和位置Task
和SignalAwaiter
本轮工作重点在于编写文档以及完善模板房间配置, 最近这段时间本职工作比较忙, 所以开发进度相比上一轮稍微放缓, 主要工作内容如有:
DungeonRoomTemplate
在编辑器中draw函数绘制层级过低和ctrl
+s
有时不触发保存bugtileMaps
文件夹下, 现在在tileMaps
下会有个分组文件夹, 用于放置同一层的地牢房间, 再到组文件夹下分了Battle
,Inlet
,Outlet
,Boss
,Reward
,Shop
,Event
这几个文件夹, 用于分类房间类型, 并加入房间权重, 权重越大, 越容易随机到该房间ActivityMark
添加生成物体高度和垂直速度配置, 支持在一个矩形区域内随机位置生成物体, 并优化ActivityMark
性能, 现在不是开始游戏就进入场景树, 而是玩家进入当前房间并开始执行标记时再放入场景树中GameApplication.DesignatedRoom
中指定地牢生成的房间, 这样地牢就只会在这个指定的随机池中抽取房间, 方便调试房间AiBulletSpeedScale
, Ai使用该武器发射的子弹速度缩放比; AiAmmoConsumptionProbability
, Ai使用该武器消耗弹药的概率本周主要完成Godot编辑器插件扩展, 目的为了更加方便为游戏添加内容, 主要工作内容如有:
automation
面板移到Godot编辑器2D
/Script
这一栏, 并重命名为Tools
Tools
面板中添加创建UI的功能, 输入UI名称点击创建就能自动创建一个空的UI场景和相配套UI代码, 编辑器监听用户对于UI的改动, 一旦有变化, 就会自动重新生成UI基础代码, 这样做的好处是一旦有节点重命名或者移动位置, 用到这个节点的代码就会编译报错. 每个UI都分好了文件夹, 所有和当前UI有关的代码都应该被放到同一个UI文件夹下Tools
面板中添加创建地牢预制房间的功能, 现在不需要自己在节点管理器中添加DungeonRoomTemplate
了, 并且节点管理器已经移除DungeonRoomTemplate
RoomConfig.json
, 现在不是所有数据都存在这个配置里了, 这里面值放一些基础数据和房间详细配置的路径, 需要房间详细信息再进行动态加载Uibase
添加协程支持, 功能和ActivityObject
中的协程一样ActivityObject
中的投抛系统, 加入ActivityObject
加入海拔高度字段, 并且自动计算精灵和阴影位置, 当海拔高度大于0时会自动做自由落体, 想向上抛物的话也只需要设置垂直方向的速度就行, 现在的Throw()
函数仅仅只是对于设置海拔高度和垂直速度的一个封装为了尽早能够完成核心功能, 对外展示demo, 三月上旬开发提速, 主要的工作内容有:
TileMap.GetCellTileData()
函数上, 调用该函数在关闭游戏释放资源时会导致读取到已经被释放的内存, 但是卡死的问题还是有极小概率发生, 目前情况未知ActivityObject
子类实例化流程, 现在通过在ActivityObject
子类上加[RegisterActivity(id, prefabPath)]
标记来注册物体, 并调用ActivityObject.Create(id)
来创建实例ActivityMark
), 通过标记可以指定生成的对象, 位置, 所在波数和延时生成时间, 也可以继承ActivityMark
来扩展物体生成操作, 例如子类EnemyMark
, 标记生成敌人, 并且可以指定初始武器与弹药量UiManager
管理Ui, 目前UiManager
还有部分功能尚未完成经过数十天开发, 已经完成自定义房间功能, 支持配置连接门生成区域, 而不是像之前一样整个矩形外框都能生成门, 并且还做了在编辑器中可视化编辑连接们生成区域的功能, 所有的自定义房间放在resource/map/tileMaps
, 路径下, 使用automation
面板下的打包地牢配置
即可将所有房间的配置信息整合到RoomConfig.json
文件内, 方便代码获取房间数据, 在编辑器中添加DungeonRoomTemplate
节点, 用于创建模板房间.
第一篇开发日志, 后面会更加频繁更新日志
用了大半年事件完成完成项目基础架构搭建, 已经包含的功能有:
ActivityObject
, 可以在编辑器中找到节点ActivityObjectTemplate
来快速创建物体模板