这是一个使用 Unity 2022.3.62f3 开发的 2D 割草游戏(Vampire Survivors-Like),灵感来源于《吸血鬼幸存者》等作品。
游戏核心玩法:玩家操控英雄在战场上生存,击败源源不断涌来的怪物,收集经验值和道具,升级角色属性。
| 类别 | 技术 |
|---|---|
| 引擎 | Unity 2022.3.62f3 |
| 渲染 | Universal Render Pipeline (URP) |
| 语言 | C# 9.0 + Lua (XLua) |
| 异步 | UniTask |
| 动画 | DOTween |
| 热更 | SingularityGroup HotReload + XLua |
| 平台 | PC (Windows) |
Project/
├── Assets/
│ ├── _Project/ # 游戏代码主目录
│ │ ├── Scripts/ # C# 脚本
│ │ │ ├── Behaviours/ # MonoBehaviour 组件
│ │ │ ├── Managers/ # 管理器 (Input/Player/Prefab)
│ │ │ ├── Spawner/ # 生成器 (敌人/子弹)
│ │ │ ├── Utils/ # 工具类
│ │ │ └── XLua/ # XLua 集成
│ │ ├── Prefabs/ # 预制件
│ │ │ ├── Bullet/ # 子弹预制件
│ │ │ └── Monster/ # 怪物预制件
│ │ ├── Scenes/ # 场景
│ │ └── Textures/ # 贴图资源
│ ├── LuaScripts/ # Lua 脚本 (开发阶段)
│ │ ├── libs/ # 公共库
│ │ ├── thirds/ # 第三方库
│ │ ├── types/ # EmmyLua 类型定义 (仅 IDE 提示用)
│ │ ├── unity/ # Unity 交互
│ │ └── vampire/ # 游戏逻辑
│ │ ├── configs/ # 配置
│ │ ├── funcs/ # 功能函数
│ │ ├── mgrs/ # 管理器
│ │ ├── objs/ # 对象定义
│ │ ├── scripts/ # 脚本
│ │ └── sys/ # 系统
│ ├── Plugins/ # 第三方插件
│ └── XLua/ # XLua 框架 (勿修改)
├── Packages/
└── ProjectSettings/
- Unity 2022.3.62f3
- .NET Framework 4.7.1
- Windows 10/11
- 使用 IDE (Rider/Visual Studio) 打开
Project/Project.sln - 在 Unity Editor 中打开
Project文件夹作为项目 - 打开场景
Assets/_Project/Scenes/SampleScene.unity - 点击 Play 运行游戏
| 按键 | 功能 |
|---|---|
| W/A/S/D | 移动 |
| Z | 主要交互 (捡东西/攻击) |
| X | 次要交互 (商店/翻牌) |
| F | 冲刺/特殊技能 |
-
Object Pooling
- Implement
- Connection
-
Asset Management
-
Sound Utils
- WASD 移动控制
- 常规加减速 (Vampire 风格手感)
- 玩家状态组件 (PlayerStatus)
- 玩家朝向检测 (AD 控制左右,WS 不改变)
- flipX 镜像翻转
- 可扩展虚拟摇杆支持
- 敌人生成器 C# (SpawnerBase, EnemySpawner)
- 环绕玩家随机生成
- 追踪玩家 AI
- 物理推开机制 (防止重叠)
- Lua 简单刷怪循环
- Lua Enemy Manager (obj_enemy.lua 待完善)
- 子弹移动组件 (BulletMove)
- 预设管理器 (PrefabManager)
- Lua 端实例化支持
- 技能脚本框架 (templates)
- 基于玩家朝向发射子弹
- ScriptableObject 配置 (SOLoader)
- 伤害系统基础 (damage.lua)
- 音效基础支持
- 技能冷却
- 技能施法循环 (skill-loop)
- 技能升级
- 角色属性 (HP/ATK/DEF/SPEED)
- 属性成长曲线
- 装备系统
- Level Manager
- 难度关联刷怪逻辑 (Task 016)
游戏逻辑主要使用 Lua 实现,支持热更新。
LuaScripts/main.lua- Lua 入口
| 模块 | 路径 | 说明 |
|---|---|---|
| 游戏管理器 | vampire/mgrs/mgr_game.lua |
全局注入、游戏初始化 |
| 技能管理器 | vampire/mgrs/mgr_skill.lua |
技能注册、冷却管理 |
| 玩家循环 | unity/player-loop.lua |
Update/Tick 逻辑 |
| 伤害系统 | vampire/sys/damage.lua |
伤害计算 |
| 函数助手 | vampire/funcs/ |
快捷函数封装 |
提供 EmmyLua 类型注解,仅用于 IDE IntelliSense,不参与代码执行:
| 文件 | 说明 |
|---|---|
types/types.unity.lua |
UnityEngine 类型 (Vector2, GameObject 等) |
types/types.vampire.lua |
Vampire 命名空间类型 (PlayerStatus, BulletMove 等) |
types/types.cs.lua |
C# 系统类型 (Action, Func, Exception 等) |
封装常用功能的快捷函数:
func_core.lua - 核心函数
ff_set_parent(go, parent) -- 设置父物体func_prefab.lua - 预设相关
ff_get_prefab_manager() -- 获取预设管理器
ff_get_prefab_of_label(label) -- 根据标签获取预设
ff_instantiate_prefab(label, x, y) -- 实例化预设func_plr.lua - 玩家相关
ff_plr_get_facing_vector2() -- 获取玩家朝向 (Vector2)
ff_plr_get_shoot_vector2() -- 获取技能发射方向 (同朝向)func_missile.lua - 导弹发射
---@param prefab_name string 预设标签
---@param x number X坐标
---@param y number Y坐标
---@param spd number 速度
---@param dis number 距离
---@param dir Vector2 方向
---@param on_collision fun(target, missile)|nil 碰撞回调
---@return GameObject missile
ff_missile_shoot(prefab_name, x, y, spd, dis, dir, on_collision)示例:
ff_missile_shoot('B000', x, y, 2.0, 10.0, ff_plr_get_facing_vector2())func_timer.lua - 定时器
完整版 API
ff_tmr_wait(duration_ms) --> TmrHandle
ff_tmr_loop(duration_ms, instant_exec?) --> TmrHandle
ff_tmr_count(duration_ms, count, instant_exec?) --> TmrHandle简化版 API(推荐)
t_wait(duration_ms, callback) --> TmrHandle
t_loop(duration_ms, callback, instant_exec?) --> TmrHandle
t_count(duration_ms, count, callback, instant_exec?) --> TmrHandleTmrHandle
handle.callback = fn -- 每次触发时执行的回调
handle:remove() -- 结束计时器,会触发 on_remove
handle.on_remove = fn -- 删除时回调
handle:count() -- 获取已执行次数示例:
-- 1秒后执行
local t = t_wait(1000, function()
print('执行完毕')
end)
-- 每500ms循环
local t = t_loop(500, function()
print('循环')
end)
-- 立即执行 + 每500ms循环
local t = t_loop(500, function()
print('立即执行')
end, true)
-- 每500ms执行10次
local t = t_count(500, 10, function()
print('第' .. t:count() .. '次')
end)
-- 结束计时器
t:remove()func_so.lua - ScriptableObject 加载
--- 从 Resources 加载 ScriptableObject
ff_so_load(path, class_type)
--- 加载技能参数 (AbilityParamsSO)
ff_so_load_ability_params(label)示例:
local params = ff_so_load_ability_params('B000')
local speed = params.Interval
local damage = params.Damage资源路径:Resources/ScriptableObjects/
[LuaCallCSharp] // 暴露给 Lua
[CSharpCallLua] // 调用 Lua 函数| 变量名 | 类型 | 说明 |
|---|---|---|
G_PlayerGO |
GameObject | 玩家对象 |
G_PrefabManager |
GameObject | 预设管理器 |
G_BulletContainer |
GameObject | 子弹容器 |
G_PlayerStatus |
PlayerStatus | 玩家状态组件 |
local PlayerStatus = CS.Vampire.PlayerStatus
-- 获取玩家朝向 (Vector2)
local dir = PlayerStatus.Instance:GetFacingVector()
-- 返回: Vector2.up, Vector2.down, Vector2.left, Vector2.right 或 Vector2.zero
-- 判断特定朝向
local isRight = PlayerStatus.Instance:IsFacing(PlayerStatus.Direction.Right)
-- 获取原始输入
local input = PlayerStatus.Instance.MoveInput-- 使用快捷函数获取玩家朝向(推荐)
local dir = ff_plr_get_facing_vector2()
bm:SetDirection(dir)
-- 或直接使用 PlayerStatus API
local PlayerStatus = CS.Vampire.PlayerStatus
local dir = PlayerStatus.Instance:GetFacingVector()
if dir.x == 0 and dir.y == 0 then
dir = Vector2(1, 0) -- 默认向右
end
bm:SetDirection(dir)遵循 AGENTS.md 中的代码规范:
- 命名:PascalCase (类/方法),_camelCase (私有字段)
- 格式:4 空格缩进,K&R 大括号风格
- 注释:中文游戏逻辑,英文技术文档
- 使用 Unity Editor 的 Play Mode 调试
- Lua 日志输出到 Console
- Hot Reload 支持修改代码即时生效
# Unity Test Runner
Window > General > Test Runner > Run All
# 命令行测试 (需安装 Unity)
"C:\Program Files\Unity 2022.3.62f3\Editor\Unity.exe" -runTests -projectPath "Project" -testResults "test-results.xml"| 资源 | 来源 | 用途 |
|---|---|---|
| Knight 2D Pixel Art | itch.io | 玩家角色 |
| DOTween | Demigiant | 动画 Tween |
| XLua | Tencent | Lua 集成 |
| UniTask | Cysharp | 异步支持 |
本项目仅供学习交流使用。游戏素材版权归原版权方所有。
- QQ: 2245735207
- GitHub Issues: 提交问题
- 完善技能系统基础设施
- 关卡系统 + 难度关联刷怪逻辑
- 实现商店/升级界面
- 添加音效和背景音乐
- 敌人 AI 增强
- 道具/装备系统
- 存档系统
- Android/iOS 构建支持
