godot-genre-survival

Compare original and translation side by side

🇺🇸

Original

English
🇨🇳

Translation

Chinese

Genre: 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

核心循环

  1. Harvest: Gather resources (Wood, Stone, Food)
  2. Craft: Convert resources into tools/items
  3. Build: Construct shelter/base
  4. Survive: Manage needs (Hunger, Thirst, Environmental threats)
  5. Thrive: Automation and tech to transcend early struggles
  1. 采集:收集资源(木材、石材、食物)
  2. 制作:将资源转化为工具/物品
  3. 建造:搭建庇护所/基地
  4. 生存:管理需求(饥饿、口渴、环境威胁)
  5. 发展:通过自动化和科技摆脱前期生存困境

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.

PhaseSkillsPurpose
1. Data
resources
,
custom-resources
Item data (weight, stack size), Recipes
2. UI
grid-containers
,
drag-and-drop
Inventory management, crafting menu
3. World
tilemaps
,
noise-generation
Procedural terrain, resource spawning
4. Logic
state-machines
,
signals
Player stats (Needs), Interaction system
5. Save
file-system
,
json-serialization
Saving world state, inventory, player stats
  • 绝对不要让资源采集过程单调且无成长空间 — 点击50次才获得1块木材完全是乐趣杀手。工具等级必须能提升采集效率:石斧每次获得3块木材,钢斧每次获得10块木材。请尊重玩家的时间。
  • 绝对不要让饥饿直接导致即时死亡 — 饥饿值归0就直接死亡过于敷衍。应该采用渐进式生命值流失(每秒2点生命值)。玩家应该能预见死亡的来临并紧急寻找食物。
  • 绝对不要允许物品无限堆叠 — 所有物品都能堆叠999个会彻底消除资源管理策略。应采用重量系统或堆叠上限(每个格子最多64个)。
  • 绝对不要让制作配方成为猜谜游戏 — 反复试错的制作方式是90年代的过时设计。应展示已解锁的配方。可以保留配方发现机制,但一旦解锁就必须永久可用。
  • 绝对不要让需求值消耗速率不随玩家活动变化 — 睡觉和奔跑时饥饿值消耗速度一样?这不现实。奔跑时消耗速率应为3倍,空闲时为0.5倍。
  • 绝对不要在玩家的床/重生点附近刷新敌人 — 死亡后重生就面对3个敌人会直接让玩家愤怒退游。应在重生点周围设置50米的安全区。

阶段技术用途
1. 数据层
resources
,
custom-resources
物品数据(重量、堆叠上限)、制作配方
2. 界面层
grid-containers
,
drag-and-drop
背包管理、制作菜单
3. 世界层
tilemaps
,
noise-generation
程序化地形、资源生成
4. 逻辑层
state-machines
,
signals
玩家状态(需求系统)、交互系统
5. 存档层
file-system
,
json-serialization
保存世界状态、背包、玩家数据

Architecture Overview

架构概述

1. Item Data (Resource-based)

1. 物品数据(基于Resource实现)

Everything in the inventory is an Item.
gdscript
undefined
背包中的所有物品均为Item类型。
gdscript
undefined

item_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 }
undefined
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 }
undefined

2. Inventory System

2. 背包系统

A grid-based data structure.
gdscript
undefined
基于网格的数据源结构。
gdscript
undefined

inventory.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
undefined
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. 检查已有堆叠 # 2. 添加至空格子 # 3. 返回无法装入的剩余数量 pass
undefined

3. Interaction System

3. 交互系统

A universal way to harvest, pickup, or open things.
gdscript
undefined
实现采集、拾取或打开物体的通用方式。
gdscript
undefined

interactable.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
undefined
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 # 重写此方法
undefined

Key Mechanics Implementation

核心机制实现

Needs System

需求系统

Simple float values that deplete over time.
gdscript
undefined
随时间递减的简单浮点值系统。
gdscript
undefined

needs_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)
undefined
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)
undefined

Crafting 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 true

Godot-Specific Tips

Godot专属技巧

  • TileMaps: Use
    TileMap
    (Godot 3) or
    TileMapLayer
    (Godot 4) for the world.
  • FastNoiseLite: Built-in noise generator for procedural terrain (trees, rocks, biomes).
  • ResourceSaver: Save the
    Inventory
    resource directly to disk if it's set up correctly with
    export
    vars.
  • Y-Sort: Essential for top-down 2D games so player sorts behind/in-front of trees correctly.
  • TileMaps:使用
    TileMap
    (Godot 3)或
    TileMapLayer
    (Godot 4)构建游戏世界。
  • FastNoiseLite:内置的噪声生成器,用于创建程序化地形(树木、岩石、生物群系)。
  • ResourceSaver:如果背包系统正确配置了
    export
    变量,可以直接将
    Inventory
    资源保存到磁盘。
  • Y-Sort:对于俯视角2D游戏至关重要,能确保玩家角色正确显示在树木等物体的前后方。

Common Pitfalls

常见陷阱

  1. Tedium: Harvesting takes too long. Fix: Scale resource gathering with tool tier (Stone Axe = 1 wood, Steel Axe = 5 wood).
  2. Inventory Clutter: Too many unique items that don't stack. Fix: Be generous with stack sizes and storage options.
  3. No Goals: Player survives but gets bored. Fix: Add a tech tree or a "boss" to work towards.
  1. 单调乏味:采集过程耗时过长。解决方法:根据工具等级提升采集效率(石斧每次获得1块木材,钢斧每次获得5块木材)。
  2. 背包杂乱:过多无法堆叠的独特物品。解决方法:放宽堆叠上限并提供更多存储选项。
  3. 缺乏目标:玩家存活后感到无聊。解决方法:添加科技树或最终BOSS作为目标。

Reference

参考资料

  • Master Skill: godot-master
  • 核心技能:godot-master