1. 核心玩法设计
割草——核心玩法设计
本章你将掌握
通过学习本章,你将了解割草类游戏(Vampire Survivors类)的核心玩法设计,为后续开发打好理论基础。
| 知识点 | 内容 | 难度 |
|---|---|---|
| 什么是"割草"游戏 | 自动攻击+大量敌人+生存计时的核心特点 | ★☆☆ |
| 为什么选择2.5D | 3D场景+俯视角正交摄像机的优势 | ★☆☆ |
| 核心游戏循环 | 移动→自动攻击→获取经验→升级选技能的循环 | ★★☆ |
| 自动战斗系统 | 武器自动攻击最近敌人的实现思路 | ★★★ |
| MVP开发思路 | 最小可玩版本的功能规划 | ★★☆ |
核心Godot节点预览:
VampireSurvivorsGame(游戏根节点)
├── Ground(地面,StaticBody3D)
├── Player(玩家,CharacterBody3D)
│ └── WeaponManager(武器管理器,Node)
│ └── Weapon_1~N(武器,Node × N)
├── EnemySpawner(敌人生成器,Node)
│ └── Enemy_1~N(敌人,CharacterBody3D × N)
├── GemPool(经验宝石对象池,Node)
│ └── Gem_1~N(宝石,Area3D × N)
├── Camera3D(俯视角正交摄像机)
└── HUD(界面,CanvasLayer)
├── HealthBar(血条)
├── ExpBar(经验条)
└── SkillSelection(技能选择界面)游戏核心节点
点击节点可跳转到对应文档查看详细说明。
1.1 什么是"割草"游戏?
你有没有过这样的体验:在院子里拿一把大扫帚,闭着眼睛一通狂扫,落叶像烟花一样四散飞溅?虽然你没有瞄准任何一片叶子,但只要扫帚挥得够快、够猛,落叶就会一片一片消失。那种"毫不费力地清除一切"的感觉,就是割草的精髓。
在游戏世界里,"割草游戏"(也叫 Vampire Survivors 类游戏)就是这种感觉的电子版。你控制一个角色站在屏幕中央,角色会自动攻击周围的所有敌人,而你只需要控制角色移动和躲避。屏幕上同时会出现成百上千个敌人,你的武器像割草机一样一波波地把它们消灭——这就是"割草"的由来。
这类游戏的代表作品
| 游戏名称 | 特色 | 简单描述 |
|---|---|---|
| Vampire Survivors | 开山鼻祖 | 用各种自动武器在成群的怪物中存活下去 |
| Brotato | 角色多样 | 马铃薯英雄,回合制选武器 |
| Holocure | 二次元风 | 爱好者角色,粉丝向内容 |
| Death Must Die | 3D割草 | 立体视角的割草体验 |
一句话总结
割草游戏 = 自动攻击 + 大量敌人 + 升级选技能 + 生存计时。你不需要"玩"战斗,你只需要"活"下去。
1.2 为什么割草游戏会火?
割草游戏看起来很简单——不就是控制小人走路嘛?但它们为什么能让成千上万的玩家停不下来?这里面藏着几个精心设计的"心理陷阱"。
1. 简单上手,零门槛
想象一下,你去学开车。如果教练第一天就教你漂移、倒车入库、手动挡换挡,你大概率第二天就不去了。但如果教练说:"你只需要踩油门,车会自己转弯",你会不会觉得"这也太简单了,我行"?
割草游戏就是这样。你只需要一根手指(或一个方向键),游戏就能跑起来。没有任何复杂的操作需要记忆,没有任何教程需要阅读。打开游戏,10秒内你就在玩了。
2. 爽快感——数字飞升的魔力
人脑天生喜欢看"数字变大"。当你的攻击从每秒打 1 下变成每秒打 50 下,当你的伤害从 1 变成 5000,当你的屏幕上同时出现几百个伤害数字——你的大脑会分泌大量的多巴胺。
| 阶段 | 屏幕效果 | 玩家感受 |
|---|---|---|
| 开局 | 一个人,一把刀,几个敌人 | "这也太弱了吧" |
| 5分钟 | 两把武器,几十个敌人 | "还行,有点意思" |
| 15分钟 | 六把武器满级,屏幕全是特效 | "太爽了!我是神!" |
| 30分钟 | 伤害数字密集到看不清画面 | "这是游戏还是烟花?" |
设计要点
爽感来自视觉密度和数字增长的叠加。武器越多、特效越密、敌人越多、数字越大 = 越爽。
3. 随机性——每次都不一样
如果每次游戏都完全一样,玩几次就没意思了。割草游戏每次升级时给你随机选择技能,这意味着每一局的搭配都不同。上一局你玩的是"旋转刀片 + 闪电链",这一局可能变成了"火焰喷射 + 冰冻光环"。这种随机性让每一局都有新鲜感。
4. "再来一局"上瘾
死了没关系,30分钟一局很快。你会想:"刚才那个选错了,这次我选另一个一定能活更久。"这种"差一点就成功了"的感觉,是让人上瘾最强的力量。
1.3 为什么选择 2.5D 方案?
你可能会问:"Vampire Survivors 是 2D 的,我们为什么要做 2.5D?"
2D vs 2.5D 对比
| 特性 | 纯 2D | 2.5D(我们的方案) |
|---|---|---|
| 视觉效果 | 平面,像纸上画画 | 有立体感,像桌面模型 |
| 敌人数量上限 | 可以很多(性能好) | 稍少一些(但仍然可以上百) |
| 制作难度 | 低,画个图片就行 | 中等,需要3D模型 |
| 玩家沉浸感 | 一般 | 更强,感觉"进入"了世界 |
| 武器特效表现 | 有限 | 更丰富,有纵深感的特效 |
什么是 2.5D?
2.5D 就是用 3D 引擎,但看起来像 2D 的技术。具体来说:
- 摄像机从正上方往下看(俯视角)
- 使用正交投影(没有近大远小,所有东西大小一样)
- 物体是 3D 模型(有厚度、有阴影、有立体感)
- 游戏逻辑在 XZ 平面上运行(只管左右和前后,不管上下)
打个比方:纯 2D 就像看一幅画,而 2.5D 就像从天花板上往下看一个桌面沙盘。沙盘上的小人是立体的,但你看不到他们的正脸,只能看到头顶。
为什么叫"2.5D"?
因为它既有 2D 的简单操作(只在一个平面上移动),又有 3D 的视觉效果(模型是立体的,有光影效果)。不是完整的 3D(不能旋转视角),所以叫 2.5D。
我们的摄像机设置思路
摄像机(在上方,往下看)
↓
↓ (视线方向)
↓
═══════════════ ← 地面(XZ平面)
🧙 💀💀 🗡️ ← 角色、敌人、武器都在地面上
💀 💀💀 💀摄像机就像一个固定在天花板上的监控摄像头,始终从上往下拍。你控制角色在地面上移动,敌人从四面八方涌来。
1.4 核心游戏循环
每个游戏都有一个"核心循环"——就是玩家反复做的事情。割草游戏的核心循环非常简单,但设计得极其精妙:
循环流程图
┌──────────────────────────────────────────────────────┐
│ │
│ 移动躲避 ──→ 自动攻击 ──→ 获取经验 ──→ 升级选技能 │
│ ↑ │ │
│ │ ↓ │
│ ←────────── 坚持更久 ←────────── 变得更强 │
│ │
│ 最终:死亡 ──→ 结算 ──→ 再来一局 │
└──────────────────────────────────────────────────────┘循环拆解
让我们把这个循环的每一步拆开来看:
第一步:移动躲避
你用方向键或摇杆控制角色移动。角色不能攻击,只能跑。你需要躲避敌人的包围,同时跑到经验宝石附近去捡。
生活化比喻:你是一个在操场上跑步的人,周围有一群僵尸在追你。你不能打它们(它们会被自动消灭),但你不能让它们碰到你。
第二步:自动攻击
角色身上装备的武器会自动攻击最近的敌人。你不需要按任何攻击键。武器会按照自己的节奏发射——比如旋转刀片每 0.5 秒转一圈,弹幕每 0.3 秒射一发。
第三步:获取经验
敌人被消灭后会掉落经验宝石(蓝色小菱形)。你需要走过去捡起来。就像吸铁石吸铁屑一样,靠近了就会自动吸入。
第四步:升级选技能
经验值攒够后,角色升级。此时游戏暂停,弹出 3~4 个随机技能让你选。选完后游戏继续。这是整个循环中唯一的策略决策点。
第五步:坚持更久
选了新技能后,你的角色变得更强——攻击更多、伤害更高、移动更快。这样你就能在越来越多的敌人中活得更久。
第六步:死亡重来
最终你一定会死(这是游戏设计的一部分)。死了之后,显示结算画面(存活时间、击杀数、收集经验),然后可以选择再来一局。
为什么这个循环让人上瘾?
| 心理学原理 | 在割草游戏中的体现 |
|---|---|
| 即时反馈 | 每走一步都能看到敌人被消灭,经验宝石飞过来 |
| 成长感 | 升级时数字变大、特效变华丽、武器变多 |
| 随机奖励 | 每次升级给的技能是随机的,像开盲盒 |
| 损失厌恶 | 快打破记录时死了,很不甘心,想再来一次 |
| 心流状态 | 简单操作 + 适度挑战 = 大脑进入沉浸状态 |
设计陷阱
注意不要让玩家觉得"死了是游戏的问题"。死亡应该是"我自己的选择导致了死亡"(比如选错了技能、走错了路线),这样玩家才会想"下次我选对就好了"。
1.5 本项目的技术方案概览
在动手写代码之前,我们先看看整个项目需要哪些核心系统:
| 系统 | 功能 | 复杂度 |
|---|---|---|
| 2.5D 摄像机 | 俯视角正交摄像机,跟随玩家 | ★☆☆ |
| 角色移动 | CharacterBody3D,XZ平面移动 | ★★☆ |
| 自动战斗 | 武器自动攻击最近敌人 | ★★★ |
| 敌人生成 | 在屏幕外生成,逐渐增多 | ★★☆ |
| 经验与升级 | 收集宝石,升级选技能 | ★★★ |
| 道具装备 | 武器槽位,进化合成 | ★★★ |
| 地图生成 | 大地图,随机装饰 | ★★☆ |
| 生存计时 | 计时器,难度递增 | ★☆☆ |
| UI 系统 | 血条、经验条、技能选择界面 | ★★☆ |
| 音效特效 | 打击感、背景音乐 | ★★☆ |
开发路线图
我们建议按照以下顺序逐步开发:
- 项目搭建 — 创建项目,设置摄像机和场景结构
- 角色移动 — 让角色能动起来
- 自动战斗 — 加入一把基础武器
- 敌人生成 — 让敌人从四面八方涌来
- 经验升级 — 加入成长系统
- 道具装备 — 完善武器和道具系统
- 地图生成 — 创建大地图
- 生存计时 — 加入计时和难度递增
- 打磨发布 — 优化、音效、导出
从小开始
不要一上来就想做一个完整的游戏。先让角色能动,再让武器能打,再让敌人能来。每一步都确保能运行,再进行下一步。这就是所谓的"增量开发"。
1.6 技术演示:理解核心循环的伪代码
虽然我们还没开始写真正的代码,但先看一下核心循环的大致逻辑,帮助你建立整体概念:
// 伪代码:核心游戏循环
public class GameLoop
{
// 游戏状态
public bool IsPlaying { get; set; }
public float SurvivalTime { get; set; }
public int KillCount { get; set; }
public void Update(float delta)
{
if (!IsPlaying) return;
// 1. 更新计时器
SurvivalTime += delta;
// 2. 玩家移动(根据输入)
Player.Move(GetInputDirection());
// 3. 武器自动攻击
foreach (var weapon in Player.Weapons)
{
weapon.AutoAttack(Enemies);
}
// 4. 敌人AI(朝玩家移动)
foreach (var enemy in Enemies)
{
enemy.ChasePlayer(Player.Position);
}
// 5. 检测碰撞(敌人碰到玩家扣血)
CheckCollisions();
// 6. 检查是否升级
if (Player.HasEnoughExperience())
{
PauseGame();
ShowSkillSelection();
}
// 7. 检查是否死亡
if (Player.Health <= 0)
{
GameOver();
}
}
}# 伪代码:核心游戏循环
extends Node
# 游戏状态
var is_playing: bool = false
var survival_time: float = 0.0
var kill_count: int = 0
func _process(delta):
if not is_playing:
return
# 1. 更新计时器
survival_time += delta
# 2. 玩家移动(根据输入)
var direction = get_input_direction()
player.move(direction)
# 3. 武器自动攻击
for weapon in player.weapons:
weapon.auto_attack(enemies)
# 4. 敌人AI(朝玩家移动)
for enemy in enemies:
enemy.chase_player(player.position)
# 5. 检测碰撞(敌人碰到玩家扣血)
check_collisions()
# 6. 检查是否升级
if player.has_enough_experience():
pause_game()
show_skill_selection()
# 7. 检查是否死亡
if player.health <= 0:
game_over()1.7 总结
割草游戏的核心魅力在于:
- 操作极简 — 只需要控制移动
- 视觉爽快 — 大量敌人被消灭的特效
- 策略深度 — 升级时的技能搭配选择
- 重复可玩 — 随机性保证每局都不同
- 短局快节奏 — 30分钟一局,随时可以玩
我们选择 2.5D 方案,既保留了 2D 的简单操作,又增加了 3D 的视觉立体感,让游戏看起来更高级。
接下来,我们就正式开始搭建项目吧!
