godot-genre-survival
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseGenre: Survival
类型:生存类
Resource scarcity, needs management, and progression through crafting define survival games.
资源稀缺、需求管理以及通过制作系统推进游戏进度,是生存类游戏的核心特征。
Available Scripts
可用脚本
inventory_slot_resource.gd
inventory_slot_resource.gd
Expert inventory slot pattern using Resources for save compatibility.
基于Resource实现的专家级背包格子模式,支持存档兼容。
Core Loop
核心循环
- Harvest: Gather resources (Wood, Stone, Food)
- Craft: Convert resources into tools/items
- Build: Construct shelter/base
- Survive: Manage needs (Hunger, Thirst, Environmental threats)
- Thrive: Automation and tech to transcend early struggles
- 采集:收集资源(木材、石材、食物)
- 制作:将资源转化为工具/物品
- 建造:搭建庇护所/基地
- 生存:管理需求(饥饿、口渴、环境威胁)
- 发展:通过自动化和科技摆脱前期生存困境
NEVER Do in Survival Games
生存类游戏绝对不能做的事
- NEVER make gathering tedious without scaling — 50 clicks for 1 wood = fun-killer. Tool tiers MUST multiply yield: Stone Axe = 3 wood, Steel = 10 wood. Respect player time.
- NEVER use instant death for starvation — 0% hunger → instant death = cheap. Use gradual HP drain (2 HP/sec). Player should see death coming and scramble for food.
- NEVER allow infinite inventory stacking — 999 stacks of everything removes resource management strategy. Use weight systems OR stack limits (64 per slot).
- NEVER make crafting recipes a guessing game — Trial-and-error crafting = 1990s design. Show discovered recipes. Discovery can exist, but once learned, must be persistent.
- NEVER let needs decay at constant rate regardless of activity — Hunger drains same speed while sleeping/running? Unrealistic. Sprint = 3x drain, idle = 0.5x drain.
- NEVER spawn enemies near player's bed/spawn point — Dying, respawning into 3 enemies = rage quit. Enforce safe zone radius (50m) around respawn.
| Phase | Skills | Purpose |
|---|---|---|
| 1. Data | | Item data (weight, stack size), Recipes |
| 2. UI | | Inventory management, crafting menu |
| 3. World | | Procedural terrain, resource spawning |
| 4. Logic | | Player stats (Needs), Interaction system |
| 5. Save | | Saving world state, inventory, player stats |
- 绝对不要让资源采集过程单调且无成长空间 — 点击50次才获得1块木材完全是乐趣杀手。工具等级必须能提升采集效率:石斧每次获得3块木材,钢斧每次获得10块木材。请尊重玩家的时间。
- 绝对不要让饥饿直接导致即时死亡 — 饥饿值归0就直接死亡过于敷衍。应该采用渐进式生命值流失(每秒2点生命值)。玩家应该能预见死亡的来临并紧急寻找食物。
- 绝对不要允许物品无限堆叠 — 所有物品都能堆叠999个会彻底消除资源管理策略。应采用重量系统或堆叠上限(每个格子最多64个)。
- 绝对不要让制作配方成为猜谜游戏 — 反复试错的制作方式是90年代的过时设计。应展示已解锁的配方。可以保留配方发现机制,但一旦解锁就必须永久可用。
- 绝对不要让需求值消耗速率不随玩家活动变化 — 睡觉和奔跑时饥饿值消耗速度一样?这不现实。奔跑时消耗速率应为3倍,空闲时为0.5倍。
- 绝对不要在玩家的床/重生点附近刷新敌人 — 死亡后重生就面对3个敌人会直接让玩家愤怒退游。应在重生点周围设置50米的安全区。
| 阶段 | 技术 | 用途 |
|---|---|---|
| 1. 数据层 | | 物品数据(重量、堆叠上限)、制作配方 |
| 2. 界面层 | | 背包管理、制作菜单 |
| 3. 世界层 | | 程序化地形、资源生成 |
| 4. 逻辑层 | | 玩家状态(需求系统)、交互系统 |
| 5. 存档层 | | 保存世界状态、背包、玩家数据 |
Architecture Overview
架构概述
1. Item Data (Resource-based)
1. 物品数据(基于Resource实现)
Everything in the inventory is an Item.
gdscript
undefined背包中的所有物品均为Item类型。
gdscript
undefineditem_data.gd
item_data.gd
extends Resource
class_name ItemData
@export var id: String
@export var name: String
@export var icon: Texture2D
@export var max_stack: int = 64
@export var weight: float = 1.0
@export var consumables: Dictionary # { "hunger": 10, "health": 5 }
undefinedextends Resource
class_name ItemData
@export var id: String
@export var name: String
@export var icon: Texture2D
@export var max_stack: int = 64
@export var weight: float = 1.0
@export var consumables: Dictionary # { "hunger": 10, "health": 5 }
undefined2. Inventory System
2. 背包系统
A grid-based data structure.
gdscript
undefined基于网格的数据源结构。
gdscript
undefinedinventory.gd
inventory.gd
extends Node
signal inventory_updated
var slots: Array[ItemSlot] = [] # Array of Resources or Dictionaries
@export var size: int = 20
func add_item(item: ItemData, amount: int) -> int:
# 1. Check for existing stacks
# 2. Add to empty slots
# 3. Return amount remaining (that couldn't fit)
pass
undefinedextends Node
signal inventory_updated
var slots: Array[ItemSlot] = [] # Array of Resources or Dictionaries
@export var size: int = 20
func add_item(item: ItemData, amount: int) -> int:
# 1. 检查已有堆叠
# 2. 添加至空格子
# 3. 返回无法装入的剩余数量
pass
undefined3. Interaction System
3. 交互系统
A universal way to harvest, pickup, or open things.
gdscript
undefined实现采集、拾取或打开物体的通用方式。
gdscript
undefinedinteractable.gd
interactable.gd
extends Area2D
class_name Interactable
@export var prompt: String = "Interact"
func interact(player: Player) -> void:
_on_interact(player)
func _on_interact(player: Player) -> void:
pass # Override this
undefinedextends Area2D
class_name Interactable
@export var prompt: String = "Interact"
func interact(player: Player) -> void:
_on_interact(player)
func _on_interact(player: Player) -> void:
pass # 重写此方法
undefinedKey Mechanics Implementation
核心机制实现
Needs System
需求系统
Simple float values that deplete over time.
gdscript
undefined随时间递减的简单浮点值系统。
gdscript
undefinedneeds_manager.gd
needs_manager.gd
var hunger: float = 100.0
var thirst: float = 100.0
var decay_rate: float = 1.0
func _process(delta: float) -> void:
hunger -= decay_rate * delta
thirst -= decay_rate * 1.5 * delta
if hunger <= 0:
take_damage(delta)undefinedvar hunger: float = 100.0
var thirst: float = 100.0
var decay_rate: float = 1.0
func _process(delta: float) -> void:
hunger -= decay_rate * delta
thirst -= decay_rate * 1.5 * delta
if hunger <= 0:
take_damage(delta)undefinedCrafting Logic
制作逻辑
Check if player has ingredients -> Remove ingredients -> Add result.
gdscript
func craft(recipe: Recipe) -> bool:
if not has_ingredients(recipe.ingredients):
return false
remove_ingredients(recipe.ingredients)
inventory.add_item(recipe.result_item, recipe.result_amount)
return true检查玩家是否拥有材料 → 扣除材料 → 添加制作结果。
gdscript
func craft(recipe: Recipe) -> bool:
if not has_ingredients(recipe.ingredients):
return false
remove_ingredients(recipe.ingredients)
inventory.add_item(recipe.result_item, recipe.result_amount)
return trueGodot-Specific Tips
Godot专属技巧
- TileMaps: Use (Godot 3) or
TileMap(Godot 4) for the world.TileMapLayer - FastNoiseLite: Built-in noise generator for procedural terrain (trees, rocks, biomes).
- ResourceSaver: Save the resource directly to disk if it's set up correctly with
Inventoryvars.export - Y-Sort: Essential for top-down 2D games so player sorts behind/in-front of trees correctly.
- TileMaps:使用(Godot 3)或
TileMap(Godot 4)构建游戏世界。TileMapLayer - FastNoiseLite:内置的噪声生成器,用于创建程序化地形(树木、岩石、生物群系)。
- ResourceSaver:如果背包系统正确配置了变量,可以直接将
export资源保存到磁盘。Inventory - Y-Sort:对于俯视角2D游戏至关重要,能确保玩家角色正确显示在树木等物体的前后方。
Common Pitfalls
常见陷阱
- Tedium: Harvesting takes too long. Fix: Scale resource gathering with tool tier (Stone Axe = 1 wood, Steel Axe = 5 wood).
- Inventory Clutter: Too many unique items that don't stack. Fix: Be generous with stack sizes and storage options.
- No Goals: Player survives but gets bored. Fix: Add a tech tree or a "boss" to work towards.
- 单调乏味:采集过程耗时过长。解决方法:根据工具等级提升采集效率(石斧每次获得1块木材,钢斧每次获得5块木材)。
- 背包杂乱:过多无法堆叠的独特物品。解决方法:放宽堆叠上限并提供更多存储选项。
- 缺乏目标:玩家存活后感到无聊。解决方法:添加科技树或最终BOSS作为目标。
Reference
参考资料
- Master Skill: godot-master
- 核心技能:godot-master