主要工作内容如下:
-
新版大厅仍在制作中, 目前美术正在整理素材
-
新增武器轮盘功能, 游戏中按下
Tab
即可显示轮盘, 鼠标悬停可以选择武器, 轮盘最多可以同时显示6把武器, 超过6把武器就会显示翻页按钮, 鼠标悬停在指定武器上时按下Space
可以快速扔掉武器 -
新增图鉴功能, 目前只是初版图鉴, 可显示武器, 道具, 怪物的介绍信息
-
重构buff系统, 现在将所有buff属性拆成一个个的buff片段, 再由这些buff片段组成buff道具或者主动道具, buff属性基类
PropFragment
,PropFragment
有以下分支子类- BuffFragment: 被动属性逻辑基类, 这就是基础被动属性基类
- ChargeFragment: 主动道具充能基类, 用于主动道具充能条件和充能进度计算
- ConditionFragment: 主动道具使用条件基类, 用于判断主动道具是否可以使用
- EffectFragment: 主动道具使用效果基类
-
新增被动道具(
BuffPropBase.xlsx
)和主动道具(ActivePropBase.xlsx
)表 -
编辑器中支持导出buff属性表, 功能路径
工具/生成buff属性表
, 该功会汇总所有buff片段, 并生成一份用于用于快速查询buff及其描述的.md
文件 -
配置表导出工具支持新特性, 在
Array
或Map
类型后面添加*
号, 可以省略Array
两端的中括号或者Map
两端的大括号 -
配置表导出工具支持
object
数据类型, 映射到C#类型为:System.Text.Json.JsonElement
-
新增5个主动道具
- 猪猪存钱罐: 拾起该道具后玩家捡到的所有金币将会被存入到存钱罐中, 使用该道具, 会摧毁存钱罐, 并返回双倍的金币
- 红外遥控器: 使用后会触发附近地上的武器开火
- 魔术棒: 随机选择房间内的一个手持武器的敌人, 交换你们手中的武器
- 便携式供血器: 使用金币换取血量
- 便携式献血器: 使用血量换取金币
-
更新液体shader, 不再使用非常糊的液体边缘
-
地牢编辑器新增商店房间中的商店老板标记
-
地牢编辑器支持运行除战斗和起始房间外的指定房间
-
抽出
AiRole
类, 所有Ai逻辑全部从Enemy
移动到AiRole
, 现在Enemy
只负责区分敌人
这一角色类型 -
重大调整, 引入阵营系统, 角色只会攻击敌对阵营的目标, 游戏中也支持实时修改角色阵营的功能, 例如修改房间中其中第一个敌人阵营, 将其变为玩家阵营, 其它敌人就会和它打起来, 也就是电子斗蛐蛐, 目前包含以下阵营:
- None: 无阵营, 所有角色都视为敌人
- Peace: 和平阵营, 不会被攻击
- Camp1: 阵营1, 玩家
- Camp2~Camp5: 敌人, 不同阵营的敌人会互相攻击
-
修复地牢生成器发现的bug
游戏暂定名为《枪火地牢》
项目从4.2升级到4.2.1, 本次更新大量内容, 地牢编辑器2.0, 游戏大厅, 奖励房间, 自定义地牢生成规则, 地牢装饰等, 所以开发周期来到了两个半月
主要工作内容如下:
- 地牢编辑器2.0正式支持47格Tile的平铺地形, 完整的新增功能:
- 新增TileSet编辑器, 功能如下:
- 导入外部图像, 并进行裁剪
- 编辑自动平铺地形(2x2, 3x3)
- 编辑图块组合
- 烘焙静态导航网格
- TileMap编辑器更新:
- 支持选择TileSet
- 支持在自定义层级绘制图块
- 支持自由绘制TileSet中的纹理图块
- 支持绘制TileSet中的自定义平铺地形(2x2, 3x3)
- 支持绘制TileSet中的组合图块
- 支持配置自动填充数据, 生成怪和奖励交给随机池控制
- 支持配置随机物体的标记
- 生成墙壁高度改为2格高
- 标记物体显示图标
- 地牢房间管理器更新:
- 支持删除地牢组
- 删除地牢组/地牢房间添加延时确定, 防止用户误删
- 创建房间添加默认预设
- 地牢生成器新功能
- 生成奖励/商店房间(商店目前只是占位)
- 支持自定义逻辑控制房间生成
- 随机池功能, 控制整个游戏奖惩
- 新增TileSet编辑器, 功能如下:
- 新增5把武器(音效特性还没完全做完)
- P90: 射速高, 弹夹容量大
- (暂未起名): 发色彩虹子弹
- M1型热能狙击枪: 发射可反弹和穿透的子弹
- 左轮: 基础抢, 性能较弱
- 木质短弓: 蓄力拉弓射击, 箭会插在目标身上, 目标死亡时可回收箭
- 击杀敌人掉落金币, 玩家会自动拾取金币, Ui血条下方显示金币数量
- 将excel导出工具执行流程改为先动态编译工具源码在执行, 这样导出工具就不用再打包了
- 将excel导出工具库依赖改为使用
Aspose.Cells
, 这个库在执行导出excel不会修改excel文件内容, 也就是不会被git侦测到修改 - 新增
InputAction
, 用于控制用户输入行为 - 更新门素材
- 新增游戏大厅流程, 进入游戏首先进入大厅, 在通过大厅的地牢入口进入地牢
- 修复
UiGrid
和部分Ui会产生游离节点的bug - 修复Mac运行游戏在敌人死亡时游戏会卡死的bug
- 修复Mac运行游戏地上素材闪烁失帧的bug
- 支持在编辑器中放置
ActivityObject
实例, 通过ActivityInstance
节点实现
项目正式从Godot4.2beta升级到4.2, 这一个半月主要工作内容:
- 新增武器:
- 榴弹发射器, 发射可以爆炸并造成范围伤害的弹丸, 爆炸会影响地上的弹壳和碎屑
- 激光手枪, 发射具有穿透敌人身体并造成伤害的激光
- 新增道具:
- 弹射子弹 子弹反弹次数+2
- 穿透子弹, 子弹穿透+1
- 武器背包, 武器容量+1
- 道具背包, 道具容量+1
- 武器预制体移除握把标记, 现在武器原点变为握把位置, 旋转中心点变为
AnimatedSprite
精灵的中心点, 这样更加方便制作武器动画 - 新增对象池功能, 对象池类为
ObjectPool
, 可入池对象必须实现IPoolItem
接口, 但为了方便获取池中的物体, 新增ObjectManager
用于根据某些标记快速获取对象池中的物体 - 新增
FreezeSprite
, 用于绘制静止不动的ActivityObject
,从而优化性能, 包含功能:- 调用
Freeze()
和Unfreeze()
来冻结和解冻, 与BecomesStaticImage()
不同的是,Freeze()
并不会销毁物体, 并且可逆 - 提供了检测圆形范围内所有冻结实例的接口
RoomStaticSprite.CollisionCircle()
, 可用类似爆炸等造成范围影响的功能 - 每个区域有
FreezeSprite
数量上限, 防止数量过多造成卡顿
- 调用
- 游戏解锁高帧率模式, 不再像以前一样锁定60帧了, 现在支持无上限帧数和垂直同步(暂未加入到游戏设置中)
- 将子弹伤害射程等基础配置移动到了
BulletBase.xlsx
配置表中 - 优化子弹创建逻辑, 现在调用
FireManager.ShootBullet()
发射字段, 调用FireManager.ThrowShell()
抛射弹壳 - 新增物体材质, 配置表为
ActivityMaterial.xlsx
, 并提供摩擦力
,重力
,回弹
等基础物理模拟属性 - 在完美像素模式下实现相机平滑移动
- 新增第二个敌人, 一个全身附着粘液的怪物, 发射带抛物线的远程子弹, 移动时地上会留下一滩粘液(暂未制作互动效果)
- 优化Ai状态机, 现在Ai发现玩家后会执行通知其它敌人的状态, 其它敌人收到通知时会走向玩家位置
- 更新玩家翻滚动作, 更新地牢素材
- 新增绘制液体功能, 根据笔刷(
BrushImageData
)在LiquidCanvas
上绘制液体, 液体会随着时间消散, 液体材质配置为LiquidMaterial.xlsx
, 液体笔刷管理器为LiquidBrushManager
,ActivityObject
新增绘制液体函数DrawLiquid()
, 目前暂未制作互动效果 ActivityObject
支持自定义阴影, 在预制体的ShadowSprite
节点中放入阴影纹理即可视为自定义阴影- 游戏右上角小地图, 未探索的房间将显示问号, 已探索的房间显示房间轮廓, 并且显示房间内敌人的位置, 按下
ctrl
键展开小地图, 展开后使用鼠标右键可以拖拽小地图, 并且点击鼠标左键可以传送到已经探索的房间 - 完善敌人死亡效果, 碎片会在地上留下血迹
- 将敌方子弹的颜色改为红白色, 更加容易区分敌我弹幕
- 修复武器没弹药后再触发扳机必须要等攻击冷却完成后才能触发换弹的bug
- 修复分裂子弹伤害计算错误的bug
- 修复武器换弹时扔掉或者放到背后会继续执行动画的问题
项目从Godot4.1升级到4.2beta, 使用了部分新功能以提升视觉效果, 本月主要完善Role
的动作和提升地牢视觉效果, 项目已正式开源
将项目的Ui框架抽成一个单独的Ui插件, 命名为DsUi
近一个半月主要工作内容如下:
- 项目已经开启2Dhdr, 也就是辉光效果, 现在子弹, 开火特效等都有了高光效果
- 敌人子弹添加红色描边, 更加容易区分敌方子弹
- 未被拾起的武器现在也能正常开火, 调用
Weapon.Trigger()
, 也就是在地上开火 - 玩家新增翻滚动作, 移动时按下鼠标右键就可以向运动方向翻滚移动一段距离, 并且期间无敌
- 新增武器近战攻击动作, 按空格键, 近战可以抵消地方子弹
- 新增近战武器反弹敌方子弹的功能
- 新增
Role
击退效果, 被子弹击中, 武器近战等都可以击退Role
对象, 但是玩家不能被击退 - 新增房间迷雾功能, 未探索的房间完全变暗, 当玩家第一次进入时迷雾消散, 并开始刷怪, 当玩家离开房间时房间稍微变暗
- 新增敌人是否显示瞄准辅助线, 开火时是否可以移动, 锁定目标时是否可以旋转枪口朝向的配置
- 新增
debug
浮动窗口, 用于游戏中查看日志, 代码日志改用Debug.Log()
和Debug.LogError()
函数 - 更换玩家, 门等游戏素材
- 游戏暂停功能, 按下
esc
键可以呼出暂停菜单 - 游戏自适应分辨率, 新增全屏设置
- 修复房间关门后, 物体到达房间门连接处会被判断离开房间的bug
- 修复拾起敌人掉落的汤姆逊冲锋枪第一次按扳机有概率无法开火的bug
- 修复房间门会在消灭所有敌人之前打开的bug
经过两个月漫长的开发, 新版地牢编辑器初版已经开发完成, 目的为了更加方便开发者和玩家制作地图, 新版地牢编辑器提供功能如下:
- 地牢项目管理功能, 可以管理地牢组和房间, 支持房间预览, 支持显示异常房间, 房间支持配置权重
- 绘制Tile功能, 并且支持验证Tile是否绘制异常, 自动生成地牢导航网格
- 配置地牢房间连接区域(门生成区域), 支持验证连接区域是否配置正常
- 房间预设功能, 运行房间时从多个预设中根据权重随机抽取一个执行标记
- 编辑波数功能, 编辑标记功能, 标记物体可以配置多个刷新目标, 并从配置的目标中随机抽取一个执行生成物体, 支持配置延时时间
除此了地图编辑器以外, 游戏本体还有以下更新:
- 地牢房间数据结构大改
- 更新ui生成工具, 修复bug, UiPanel支持嵌套打开Ui, 新增大量Api, 例如
Cell
排序, 触发点击Cell
, 双击Cell
, 帧函数等, 新增IUiNodeScript
接口, 用于Ui脚本节点获取该节点的IUiNode
实例对象 - 修复拾起武器再扔出时有一定概率将武器反着扔出去的bug
- 地牢房间添加预加载波的概念, 玩家在进入房间前就提前生成好了物体, 玩家在进入后激活这些物体
- 更改地牢房间关门规则, 进入一个新房间, 该房间没有敌人, 且不会生成敌人, 则不会关门
- 将随机数对象抽出来, 现在地牢生成和其它系统不在共用同一个随机数对象了, 这样的话在生成地牢时就可以指定随机种子了
- 协程函数更新, 新增
IsCoroutineOver()
函数来判断一个协程是否执行完成, 协程加入异常捕捉函数, 这样执行一个协程发生异常就不会影响其它协程执行
本轮主要完成主动和被动道具框架, 并且优化游戏中的Ui, 主要工作内容如下:
- 完成主动道具和被动道具的基础框架, 它们共同的基类是
Prop
, 继承自ActivityObject
, 主动道具基类ActiveProp
, 被动道具基类BuffProp
, 现已经完成移速,射速,伤害,散射值,血量上限,护盾等控制基础属性道具 - 将
Holster
抽成通用背包Package
, 并且删除Holster
, 可放入Package
的物体必须基础ActivityObject
类和实现接口IPackageItem
- 添加拾起道具后的通用提示面板, 提示内容为道具名称 + 简短的描述
- 可互动的武器和道具添加描边效果, 现在素材中不需要绘制物体描边, 由程序来控制描边颜色, 并且显示物体名称
- 将玩家血条由条状血条改为红心, 每次受到伤害只扣除半颗红心, 并且受到伤害后获得短暂无敌时间, 目的为了防止玩家迅速暴毙
- 添加武器自动上膛配置, 添加子弹伤害配置
- 没有弹药的武器不再显示泛光效果
- 修复霰弹枪换弹无法强制停止的bug, 修复武器抛弹壳存在的bug
- 修复
Shell
销毁后没有从AffiliationArea
中移除的bug - 修复导出项目编译错误的问题
本轮主要更改美术素材和添加音效, 并且使用excel作为项目配置表, 添加完整的游戏开始与结束流程
主要工作内容如下:
- 完成简易且完整的游戏流程, 添加主菜单, 加载, 和结算页面, 主菜单包括
开始游戏
,设置
,结束游戏
三个按钮, 点击开始游戏
进入加载页面, 加载完成后进入地牢. 当玩家死亡后跳出结算页面, 结算页面包含重新开始
和回到主菜单
的按钮 - 优化渲染大量静态
Sprite
, 实现类为ImageCanvas.cs
, 原理是将Texture2D
的纹理数据绘制到另一张Image
上, 并使用Sprite2D
来渲染这张Image
, 这样只需要调用一次渲染API就可以永久保存纹理数据, 为了防止同一帧突然添加大量渲染的图片导致处理时间过长, 这里引入了一个渲染队列机制, 如果渲染时间超过阈值时间, 后面的图片就放到下一帧渲染, 以确保游戏能稳定60帧运行 - 现在每个地牢房间会生成一个
ImageCanvas
实例, 并覆盖整个房间, 武器抛出的弹壳或者其它ActivityObject
可以调用ActivityObject.BecomesStaticImage()
函数将物体的纹理渲染到房间的ImageCanvas
上, 并且销毁当前对象, 这样大大节省性能开销 - 新增读取excel配置表功能, 在插件中添加
导出excel表
按钮, 点击后会读取目录DungeonShooting_Godot\excel\excelFile
下的所有.xlsx
文件, 并生成对应的json配置文件和读取json的c#代码文件, 也就是根据excel表结构生成对应的实体类代码, 导出工具支持数据类型:基础数据类型
,Array
,Dictionary
, 并且支持引用其它excel表 - 更改
ActivityObject
创建流程, 现在不再像以前一样在编辑器中创建ActivityObjectTemplate
了, 也不需要再ActivityObject
子类上添加[RegisterActivity]
标记,ActivityObjectTemplate
和RegisterActivity
类已被移除, 现在是直接在编辑器中创建ActivityObject
子类节点, 注册对象需要在ActivityObject.xlsx
表中填写物体id
和prefab路径
- 更新地牢生成器, 添加支持生成boss房间, 生成器添加更多特性, 修复一个连接地牢房间失败的bug
- 地牢房间的门添加打开和关闭效果, 关门后房间外的敌人丢失目标
- 新增输入管理器
InputManager.cs
- 武器属性移入
Weapon.xlsx
配置表, 添加更多新属性, 用于创建更丰富的武器, 并且支持配置音效 - 新增
狙击枪
和冲锋枪
- 武器素材更新, 为每种武器添加射击音效, 换弹音效, 上膛音效(音效包从unity商城和fanatical购买的), 并且游戏中左下角的武器预览ui会同步玩家手上的武器动画
- 修复敌人扔出武器的一瞬间会触发重新拾起武器拾起的bug
- 修复投抛物体中心点位置计算不正确的bug
- 修复武器扔出去的一瞬间阴影位置不正确的bug
- 编辑器中生成
ResourcePathGenerator.cs
支持排除指定路径文件夹 - 修复播放音效和背景音乐的API设置音量存在的bug
本轮主要优化视觉上的效果, 并且完善模板房间创建的功能, 主要工作内容有:
- 添加房间门的美术资源, 但是该资源依旧是一个临时资源
- 修改房间内南方向的墙壁碰撞大小, 碰撞器大小减半, 添加透视效果, 同样也修改了生成导航网格的代码
- 修改
ActivityMark
创建单位的流程, 并且引入了ActivityExpression
表达式, 用于创建单位并初始化属性, 也可以在表达式中指定多个id并让ActivityMark
从中随机挑选创建单位. 添加单位创建特效, 修复ActivityMark
在初始房间存在的bug - 添加敌人标记
EnemyMark
, 用于在指定位置创建敌方单位, 并且支持配置手中的武器 - 添加敌人死亡特效, 敌人死亡后分裂成数个碎片并且向四周散开
- 物理模拟增强, 现在物体运动撞到墙壁会模拟现实轨迹反弹, 并且在玩家或敌人运行时抛出的物体也会继承一部分运动速度
- 武器袋更新, 现在可以设置任意容量的大小, 并且武器袋的卡槽能装下的武器不再受武器类型限制, 放到背后的武器由
Role.OnPutBackMount()
函数来设置角度和位置 - 协程添加新特性, 支持返回并等待
Task
和SignalAwaiter
本轮工作重点在于编写文档以及完善模板房间配置, 最近这段时间本职工作比较忙, 所以开发进度相比上一轮稍微放缓, 主要工作内容如有:
- 编写项目帮助文档, 为给后续开发人员更好的理解项目架构以及功能代码, 位置在DungeonShooting_Document/项目帮助文档.md, 该文档为初期开发文档, 后续会因项目架构调整或新增内容而修改
- 修复
DungeonRoomTemplate
在编辑器中draw函数绘制层级过低和ctrl
+s
有时不触发保存bug - 调整模板房间文件夹结构, 以前全放在
tileMaps
文件夹下, 现在在tileMaps
下会有个分组文件夹, 用于放置同一层的地牢房间, 再到组文件夹下分了Battle
,Inlet
,Outlet
,Boss
,Reward
,Shop
,Event
这几个文件夹, 用于分类房间类型, 并加入房间权重, 权重越大, 越容易随机到该房间 ActivityMark
添加生成物体高度和垂直速度配置, 支持在一个矩形区域内随机位置生成物体, 并优化ActivityMark
性能, 现在不是开始游戏就进入场景树, 而是玩家进入当前房间并开始执行标记时再放入场景树中- 添加用于调试用的功能: 在
GameApplication.DesignatedRoom
中指定地牢生成的房间, 这样地牢就只会在这个指定的随机池中抽取房间, 方便调试房间 - 添加Ai使用武器属性变化:
AiBulletSpeedScale
, Ai使用该武器发射的子弹速度缩放比;AiAmmoConsumptionProbability
, Ai使用该武器消耗弹药的概率
本周主要完成Godot编辑器插件扩展, 目的为了更加方便为游戏添加内容, 主要工作内容如有:
- 将原来编辑器中的
automation
面板移到Godot编辑器2D
/Script
这一栏, 并重命名为Tools
Tools
面板中添加创建UI的功能, 输入UI名称点击创建就能自动创建一个空的UI场景和相配套UI代码, 编辑器监听用户对于UI的改动, 一旦有变化, 就会自动重新生成UI基础代码, 这样做的好处是一旦有节点重命名或者移动位置, 用到这个节点的代码就会编译报错. 每个UI都分好了文件夹, 所有和当前UI有关的代码都应该被放到同一个UI文件夹下- UI节点添加打开子UI的api, 允许嵌套打开UI
Tools
面板中添加创建地牢预制房间的功能, 现在不需要自己在节点管理器中添加DungeonRoomTemplate
了, 并且节点管理器已经移除DungeonRoomTemplate
- 优化
RoomConfig.json
, 现在不是所有数据都存在这个配置里了, 这里面值放一些基础数据和房间详细配置的路径, 需要房间详细信息再进行动态加载 Uibase
添加协程支持, 功能和ActivityObject
中的协程一样- 重写
ActivityObject
中的投抛系统, 加入ActivityObject
加入海拔高度字段, 并且自动计算精灵和阴影位置, 当海拔高度大于0时会自动做自由落体, 想向上抛物的话也只需要设置垂直方向的速度就行, 现在的Throw()
函数仅仅只是对于设置海拔高度和垂直速度的一个封装
为了尽早能够完成核心功能, 对外展示demo, 三月上旬开发提速, 主要的工作内容有:
- 找到一个会触发关闭游戏卡死的 bug, 问题出在
TileMap.GetCellTileData()
函数上, 调用该函数在关闭游戏释放资源时会导致读取到已经被释放的内存, 但是卡死的问题还是有极小概率发生, 目前情况未知 - 发现并修复bug: 之前版本在自定义房间连接时, 如果生成带有拐角的通道, 通道生成的位置不是按最近位置生成, 这就导致生成的拐角通道特别长, 而且浪费空间, 现已修复
- 完成房间的定义, 并为房间划分好区域, 当玩家进入一个新的房间时开始关门并刷怪, 消灭房间内所有敌人时开门
- 重整
ActivityObject
子类实例化流程, 现在通过在ActivityObject
子类上加[RegisterActivity(id, prefabPath)]
标记来注册物体, 并调用ActivityObject.Create(id)
来创建实例 - 在预制房间中添加自定义物体生成标记(
ActivityMark
), 通过标记可以指定生成的对象, 位置, 所在波数和延时生成时间, 也可以继承ActivityMark
来扩展物体生成操作, 例如子类EnemyMark
, 标记生成敌人, 并且可以指定初始武器与弹药量 - Ui核心框架已经搭建完成, 并划分好UI的层级, 现已通过
UiManager
管理Ui, 目前UiManager
还有部分功能尚未完成 - 完成Ui类代码自动生成的功能, 现在可以根据Ui对象生成相应的图层调用代码, 更加方便编写Ui, 但是目前还没有接到编辑器中, 需要写代码手动调用接口
- 修复相机运动和抖动时存在的问题
经过数十天开发, 已经完成自定义房间功能, 支持配置连接门生成区域, 而不是像之前一样整个矩形外框都能生成门, 并且还做了在编辑器中可视化编辑连接们生成区域的功能,
所有的自定义房间放在resource/map/tileMaps
, 路径下, 使用automation
面板下的打包地牢配置
即可将所有房间的配置信息整合到RoomConfig.json
文件内, 方便代码获取房间数据,
在编辑器中添加DungeonRoomTemplate
节点, 用于创建模板房间.
第一篇开发日志, 后面会更加频繁更新日志
用了大半年事件完成完成项目基础架构搭建, 已经包含的功能有:
- 所有物体的父物体为
ActivityObject
, 可以在编辑器中找到节点ActivityObjectTemplate
来快速创建物体模板 - 玩家, 敌人的基础移动, 拾起/扔掉武器, 武器袋存放武器, 切换武器, 手持武器开火, 换弹,
- 武器类别有近战/远程武器, 武器由属性类控制
- ai行为逻辑, 包括自动寻路, 发现玩家后追踪玩家, 通知其它ai玩家位置, 射程足够时朝玩家射击, 在玩家周围徘徊, 没有武器/弹药时寻找可用的武器
- 随机生成地牢, 地牢房间与房间由过道连接, 一个房间至少连接一个其它房间
- 游戏中UI, 包括血条, 玩家手持武器, 武器弹药, 换弹进度, 拾起武器提示
- 音效管理, 播放背景音乐和音效