Skip to content

Leginion/unity-vampire-demo

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

47 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Vampire Survivors-Like 2D 割草游戏

开发状态

开发路线图
任务计划
里程碑

简介

这是一个使用 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

运行项目

  1. 使用 IDE (Rider/Visual Studio) 打开 Project/Project.sln
  2. 在 Unity Editor 中打开 Project 文件夹作为项目
  3. 打开场景 Assets/_Project/Scenes/SampleScene.unity
  4. 点击 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 脚本说明

游戏逻辑主要使用 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/ 快捷函数封装

类型定义 (types)

提供 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 等)

函数助手 (funcs)

封装常用功能的快捷函数:

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?) --> TmrHandle

TmrHandle

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/

XLua 属性

[LuaCallCSharp]    // 暴露给 Lua
[CSharpCallLua]     // 调用 Lua 函数

全局注入 (Injection)

变量名 类型 说明
G_PlayerGO GameObject 玩家对象
G_PrefabManager GameObject 预设管理器
G_BulletContainer GameObject 子弹容器
G_PlayerStatus PlayerStatus 玩家状态组件

PlayerStatus Lua API

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 异步支持

许可证

本项目仅供学习交流使用。游戏素材版权归原版权方所有。

联系方式

Roadmap

  • 完善技能系统基础设施
  • 关卡系统 + 难度关联刷怪逻辑
  • 实现商店/升级界面
  • 添加音效和背景音乐
  • 敌人 AI 增强
  • 道具/装备系统
  • 存档系统
  • Android/iOS 构建支持

About

Vampire Survivors-Like Game Demo, crafted by Leginion, with Unity 2022.3.62f3.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors