Skip to content
游戏世界地形纹理 · 机制与百科资料

等级、经验与死亡 ​

等级不是简单的数字——它直接影响你的力量、防御、速度和饥饿消耗。死亡会带来沉重的代价,但每次重生都是一次重新规划的机会。理解这套系统,你就能在生存之路上走得更远。

等级系统 ​

等级是衡量玩家成长的核心指标,它不像传统游戏那样给你技能点,而是直接提升你的基础属性乘数。每升一级,力量、防御、速度和饥饿消耗都会得到改善。

等级基础 ​

玩家初始等级为 1,等级以浮点数形式存储在存档中,UI 上显示为整数(向下取整)。

等级上限对于乘数计算而言为 21 级,超过 21 级后属性不再增长——但等级本身可以继续累积。

经验获取 ​

经验值增加的核心逻辑如下:

升级所需经验=0.0121.08⌊等级−1⌋\text{升级所需经验} = \frac{0.012}{1.08^{\lfloor \text{等级} - 1 \rfloor}}

floor(x):向下取整。这里把等级转为整数用于指数计算。

其中:0.012 是基础经验值;1.08 是每级的衰减系数。等级越高,获取相同经验值带来的等级增量越小。

因此,玩家等级越高,升级所需经验越多,在本节最下方附录可见2~21级所需经验宝珠数目

经验来源:

来源详述
自动获取每 180 游戏秒(约 3 现实分钟)自动获得 1 点经验,无论玩家在做什么
击杀生物击杀生物时掉落经验球,数量为 (攻击抗性 / 12)(向上取整),拾取后自动增加经验
挖矿掉落挖矿或挖掘方块时掉落,掉落数量为 1~3 点
挖掘坟墓挖掘坟墓时概率掉落

说明:攻击抗性会受攻击抗性系数加成(默认 1.0),实际掉落数量按加成后的值计算。只有被玩家击杀的生物才会掉落经验球,自然死亡或其他原因死亡不会掉落。

经验球拾取:经验球弹射出后会散落在生物尸体周围,玩家只需走近即可自动拾取。拾取时播放拾取音效,经验球数量直接累加到玩家经验值上。

经验效率对比:

来源单次经验
自动获取1
击杀弱小生物(鸟/鱼)1
击杀中型生物(狼/马/牛)2~3
击杀大型生物(熊/犀牛/虎鲸)6~25

提示:击杀一只虎鲸即可获得 25 点经验,相当于 75 分钟的自动获取量。因此积极狩猎是快速升级的关键。

升级表现:升级时屏幕中央显示"你的等级提升了"提示,并播放一段升级音效(由多个音调渐升的短音组成)。

等级对属性的影响 ​

等级通过四个乘数影响玩家属性。每个乘数由多个因子相乘得到,玩家可以在游戏内面板中查看详细构成。

力量乘数——影响攻击伤害和挖掘速度:

因子条件值说明
玩家性别男性1.0默认
女性0.8女性力量 80%
等级等级 11.0/
等级 212.0每级 +0.05,最多 +100%
体力体力 0~0.45体力越低力量越弱
体力 11.0满体力时力量正常
是否生病健康1.0无影响
生病0.75生病时力量降低 25%
是否呕吐未呕吐1.0无影响
呕吐中0呕吐时完全无法攻击/挖掘
是否患流感无流感1.0无影响
患流感0.75流感时力量降低 25%
是否咳嗽未咳嗽1.0无影响
咳嗽中0咳嗽时完全无法攻击/挖掘
游戏模式挑战/生存1.0无影响
无害1.25无害模式力量 +25%

防御乘数——影响受到的伤害:

因子条件值说明
玩家性别男性1.0默认
女性0.8女性防御 80%
等级等级 11.0/
等级 212.0每级 +0.05,最多 +100%
是否生病生病0.75防御降低 25%
是否患流感患流感0.75防御降低 25%
游戏模式挑战1.0无影响
生存1.25生存模式防御 +25%
无害1.5无害模式防御 +50%
创造∞创造模式无敌

速度乘数——影响移动速度:

因子条件值说明
玩家性别男性1.0默认
女性1.03女性速度 +3%
等级等级 11.0/
等级 211.4每级 +0.02,最多 +40%
衣物依衣物0.5~1.0笨重衣物降低速度,轻便衣物无影响
体力体力 0~0.45体力越低速度越慢
体力 11.0满体力时速度正常
是否生病生病0.75速度降低 25%
是否呕吐呕吐中0无法移动
是否患流感患流感0.75速度降低 25%
是否咳嗽咳嗽中0无法移动

饥饿乘数——影响饥饿消耗速度(已在食物与腐败篇详述,这里简列):

因子条件值
玩家性别男性1.0
女性0.7
等级等级 11.0
等级 210.8
游戏模式无害0.66
生存0.75
挑战1.0
创造0

举例:一个女性玩家,等级 21,无害模式,则:

  • 力量 = 0.8 × 2.0 × 1.25 = 2.0(不考虑体力/疾病)
  • 防御 = 0.8 × 2.0 × 1.5 = 2.4
  • 速度 = 1.03 × 1.4 = 1.442(不考虑衣物/体力/疾病)
  • 饥饿消耗 = 0.7 × 0.8 × 0.66 ≈ 0.37,仅为基准的 37%

生命系统 ​

生命值不是简单的"血条"——它受到多种抗性的影响,不同伤害类型各自独立计算。理解伤害机制,你才能有针对性地提升生存能力。

生命值 ​

生命值在游戏画面上显示为 10 颗心,即 0~20 点生命值(1 颗心 = 2 点)。生命值会自动恢复,恢复速度取决于多种因素:

状态每秒恢复约等于回满时间
无害模式0.33 点1 点 / 3 秒约 60 秒
睡觉中且有食物0.033 点1 颗心 / 60 秒约 10 分钟
清醒且食物 > 50%0.022 点1 颗心 / 90 秒约 15 分钟
非玩家生物0.022 点1 颗心 / 90 秒约 15 分钟

说明:游戏内部生命值以 0~1 浮点数存储(1.0 = 满血),画面上换算为 10 颗心。上表已换算为玩家熟悉的"点"和"颗心"单位。恢复量受生命恢复系数(默认 1.0)加成。

伤害类型 ​

游戏中有多种独立的伤害类型,每种都有自己的抗性:

伤害类型抗性来源计算公式说明
攻击伤害攻击抗性攻击力 / 防御乘数来自生物或玩家的直接攻击
跌落伤害跌落抗性(速度变化 - 抗性)² / 15 / 防御乘数速度变化超过抗性时才受伤
火焰伤害火焰抗性1 / 抗性 / 防御乘数每秒判定一次
岩浆伤害岩浆抗性1 / 抗性 × 浸入度 × dt浸入岩浆时持续受伤
溺水伤害缺氧抗性1 / 抗性 / 防御乘数空气值归零后每秒判定
虚空伤害虚空伤害系数系数 × 0.1Y<0 或 Y>296 时每 2 秒判定
挤压伤害挤压抗性1 / 抗性被方块挤压时每秒判定
尖刺伤害尖刺抗性取决于尖刺方块踩到仙人掌等尖刺方块
爆炸伤害爆炸抗性取决于爆炸源被爆炸波及

防御乘数会降低所有伤害类型的实际伤害量。

特殊状态 ​

  • 空气值:范围 0~1,在水中逐渐下降,归零后开始溺水伤害
  • 着火状态:持续受到火焰伤害,可被水扑灭
  • 挤压:被移动的方块挤压时受到伤害,屏幕变红
  • 鱼类搁浅:水生生物离开水后受到伤害

死亡系统 ​

死亡不是终点,但代价高昂——你会失去所有物品,等级减半。理解不同模式下的死亡规则,能帮你选择最适合自己的游戏方式。

死亡判定 ​

当生命值降至 0 时,游戏执行以下流程:

  1. 记录死亡时间:记录当前游戏时间作为死亡时间戳
  2. 播放死亡粒子效果:在尸体位置生成死亡粒子系统
  3. 掉落所有物品:遍历玩家所有背包栏位,将全部物品丢出
  4. 记录死亡信息:在玩家统计中添加一条死亡记录(包含天数、位置、死因)
  5. 尸体存在期间:一定时间后尸体消失(生物被刷掉)

玩家死亡后的流程 ​

玩家死亡后进入"死亡状态",屏幕变暗,等待操作。

当玩家死亡(生命值 ≤ 0)后:

  1. 玩家数据的状态机切换到死亡状态
  2. 等级惩罚立即执行:等级减半(最低保留 1 级)
  3. 等待 1.5 秒现实时间后,玩家可以点击屏幕重生
  4. 重生等待时间:2.0 秒(地形加载时间)

不同模式下的死亡处理:

游戏模式死亡后行为
创造不会死亡(无敌状态)
无害/生存/挑战等待 1.5 秒后,点击屏幕重生
残酷弹出游戏菜单,无法直接重生
冒险若不允许冒险重生,则重新开始冒险关卡

等级惩罚 ​

死亡时等级会减半(向下取整,最低为 1):

复活后等级=max⁡(⌊死亡前等级2⌋, 1)\text{复活后等级} = \max\big(\lfloor \frac{\text{死亡前等级}}{2} \rfloor,\ 1\big)

max(a, b):取较大值。这里保证等级不会低于 1。

举例:

  • 等级 10 → 复活后等级 5
  • 等级 21 → 复活后等级 10
  • 等级 1 → 复活后等级 1(无损失)

注意:等级是浮点数,惩罚时先对当前等级取整再除以 2。例如等级 15.7 先取整为 15,除以 2 得 7.5,再取整为 7。

重生位置 ​

重生时系统会在存档的出生点附近搜索安全位置(范围 17×17×17 格),优先选择:

  • 不卡在方块内
  • 不处于危险地形中
  • 接近原始出生点

经验球 ​

击杀生物后掉落的绿色光球,拾取后自动增加经验值。

击杀生物时,经验球掉落数量为:

经验球数量=⌈攻击抗性12⌉\text{经验球数量} = \lceil \frac{\text{攻击抗性}}{12} \rceil

  • 经验球超过 100 个时会成组掉落,防止卡顿(每组最多 100 个)
  • 经验球在生物死亡时生成,通过掉落物子系统添加到世界

玩家统计数据 ​

游戏会记录你从开档以来的所有行为数据,在游戏菜单中可以查看。这些数据没有实际用途,纯粹是满足好奇心和成就感。

游戏会记录以下数据:

类别统计项
移动总移动距离、步行距离、飞行距离、游泳距离、骑行距离、攀爬距离、坠落距离
高度最高海拔、最低海拔、最深潜水
动作跳跃次数、睡眠次数、总睡眠时间
挖掘挖掘方块数、放置方块数、交互次数
战斗近战攻击/命中次数、远程攻击/命中次数、受到攻击次数
击杀玩家击杀、陆地生物击杀、水生生物击杀、飞行生物击杀
生存进食次数、生病次数、患流感次数、呕吐次数
制作合成物品数、制作家具数
死亡死亡记录列表(天数、坐标、死因)
等级最高到达等级
模式使用过的最简单模式

附录 部分等级经验值表 ​

等级所需经验值等级所需经验值
284121387
3174131581
4271141791
5376152018
6489162264
7612172527
8744182812
9887193111
101041203454
111207213813

附录 各生物掉落经验表 ​

生物攻击抗性经验球数量
麻雀1.51
鸽子21
小鸟2.51
玩家101
鹤鸵、鬣狗、食人鱼、鳐鱼152
羊驼、梭鱼、鲈鱼、海鲈、鸵鸟、狼202
驴、马、豹、驯鹿、野猪303
牛、美洲豹、斑马353
骆驼、角马、狮子、公牛鲨404
狼人454
老虎505
公牛、驼鹿605
熊706
野牛757
长颈鹿、虎鲨807
犀牛15013
白鲸、大白鲨24020
虎鲸30025

写给开发者 ​

资料暂存

本小节内容暂时存放于此,后续会移动至"MOD开发"章节。

开发概览

经验获取公式(ComponentLevel.cs) ​

AddExperience 方法:增加玩家经验值的核心方法。参数 count(数量)表示增加的经验点数;playSound(是否播放音效)控制是否播放拾取音效。

csharp
public virtual void AddExperience(int count, bool playSound) {
    // playSound = 是否播放拾取音效
    if (playSound) {
        // m_subsystemAudio = 音频子系统,播放经验拾取音效
        // 0.2f = 音量;m_random.Float(-0.1f, 0.4f) = 随机音调偏移
        m_subsystemAudio.PlaySound("Audio/ExperienceCollected", 0.2f, m_random.Float(-0.1f, 0.4f), 0f, 0f);
    }
    for (int i = 0; i < count; i++) {
        // num = 本次增加的等级增量(浮点数)
        // 0.012f = 基础经验值;1.08f = 每级衰减系数
        // m_componentPlayer.PlayerData.Level = 玩家当前等级(浮点数)
        // MathF.Floor = 向下取整,把等级转为整数用于指数计算
        float num = 0.012f / MathF.Pow(1.08f, MathF.Floor(m_componentPlayer.PlayerData.Level - 1f));
        // 判断是否跨过整数边界(即是否升级)
        if (MathF.Floor(m_componentPlayer.PlayerData.Level + num) > MathF.Floor(m_componentPlayer.PlayerData.Level)) {
            // 播放升级音效(7个音调渐升的短音)
            // 显示"你的等级提升了"提示
        }
        m_componentPlayer.PlayerData.Level += num;  // 累加等级
    }
}

自动经验获取 ​

PeriodicGameTimeEvent:周期性游戏时间事件。参数 1 为事件周期(180 秒),参数 2 为初始偏移(179 秒)。每 180 游戏秒触发一次,自动给玩家增加 1 点经验。

csharp
// m_subsystemTime = 时间子系统
// 每 180 游戏秒(约 3 现实分钟)自动获得 1 点经验
if (m_subsystemTime.PeriodicGameTimeEvent(180.0, 179.0)) {
    AddExperience(1, false);  // false = 不播放音效
}

乘数系统框架(ComponentFactors.cs) ​

每个**乘数(Factor)由多个因子(Factor)组成,每个因子可以是乘算(Multiply)或加算(Add)**类型。最终乘数值 = 所有因子按类型累乘或累加的结果。

csharp
public class Factor {
    public string Description;     // Description = 显示名称(在游戏内面板中展示)
    public float Value;            // Value = 数值(该因子的乘数值或加算值)
    public string Name;            // Name = 索引名称(用于内部查找)
    // FactorAdditionType = 因子累加方式,默认为乘算
    public FactorAdditionType FactorAdditionType = FactorAdditionType.Multiply;  // Multiply=乘算, Add=加算
}

// CalculateFactorsResult = 计算所有因子的最终结果
// factors = 因子集合
public static float CalculateFactorsResult(ICollection<Factor> factors) {
    float ans = 1f;  // ans = 累积结果,初始为 1
    foreach (var factor in factors) {
        switch (factor.FactorAdditionType) {
            case FactorAdditionType.Multiply: ans *= factor.Value; break;  // 乘算:累乘
            case FactorAdditionType.Add: ans += factor.Value; break;       // 加算:累加
        }
    }
    return ans;  // 返回最终乘数值
}

等级对各乘数的贡献 ​

下表展示了等级对四个核心乘数的贡献。level = 玩家当前等级;floor = 向下取整;clamp(x, min, max) = 限制函数,将 x 限制在 min~max 之间。

乘数(英文)乘数(中文)每级增量公式21 级总值
Strength(力量)力量乘数+0.051 + 0.05 × floor(clamp(level,1,21) - 1)2.0
Resilience(防御)防御乘数+0.051 + 0.05 × floor(clamp(level,1,21) - 1)2.0
Speed(速度)速度乘数+0.021 + 0.02 × floor(clamp(level,1,21) - 1)1.4
Hunger(饥饿)饥饿乘数-0.011 - 0.01 × floor(clamp(level,1,21) - 1)0.8

说明:level 被限制在 1~21 之间(clamp(level,1,21)),超过 21 级后乘数不再增长。floor 函数将等级取整后参与计算,确保每级增量固定。

死亡惩罚(PlayerData.cs) ​

PlayerDead 状态:玩家死亡后进入的状态机分支。ReduceLevelUponDeath(死亡时是否降低等级)为 true 时执行等级减半;PreviousState(前一状态)为 "Playing"(游戏中)时才执行惩罚。

csharp
// m_stateMachine = 状态机,管理玩家状态切换
// "PlayerDead" = 玩家死亡状态
m_stateMachine.AddState("PlayerDead",
    // 进入状态时执行(入口委托)
    delegate {
        HideSpawnDialog();  // HideSpawnDialog = 隐藏重生对话框
        // ReduceLevelUponDeath = 是否在死亡时降低等级(默认 true)
        // PreviousState = 前一个状态,必须是 "Playing"(游戏中)才惩罚
        if (ReduceLevelUponDeath && m_stateMachine.PreviousState == "Playing") {
            // Level = 玩家等级;MathF.Floor = 向下取整;MathUtils.Max = 取较大值
            // 等级减半,最低保留 1 级
            Level = MathUtils.Max(MathF.Floor(Level / 2f), 1f);
        }
    },
    // 每帧更新时执行(更新委托)
    delegate {
        // Time.RealTime = 现实时间(秒)
        // m_playerDeathTime = 玩家死亡时刻(现实时间)
        // 等待 1.5 秒现实时间后才允许重生
        if (Time.RealTime - (m_playerDeathTime ?? 0) > 1.5) {
            if (GameMode == Cruel) {
                // Cruel = 残酷模式,弹出游戏菜单,无法重生
            }
            else if (GameMode == Adventure && !IsAdventureRespawnAllowed) {
                // Adventure = 冒险模式
                // IsAdventureRespawnAllowed = 是否允许冒险重生,为 false 则重启关卡
            }
            else {
                respawn = true;  // respawn = 是否重生标志
            }
        }
        if (respawn) {
            LastDeadPlayer = ComponentPlayer.Entity;  // LastDeadPlayer = 记录最后死亡的玩家实体
            ComponentPlayer = null;  // 置空以触发重生流程
        }
    },
    null  // 退出状态时执行(出口委托),此处无操作
);

经验球掉落(ComponentHealth.cs) ​

Die 方法:生物死亡时调用。Injury(伤害信息)包含伤害来源和类型;AttackResilience(攻击抗性)决定经验球掉落数量;StackExperienceOnKill(击杀时是否叠加经验)控制是否掉落经验球。

csharp
// injury = 伤害信息(包含伤害来源、类型等)
public virtual void Die(Injury injury) {
    Health = 0f;  // Health = 生命值,归零
    // experienceOrbDropCount = 经验球掉落数量
    // m_componentCreature.ComponentHealth.AttackResilience = 被击杀生物的攻击抗性
    // MathF.Ceiling = 向上取整,除以 12 后取整确保至少掉 1 个
    int experienceOrbDropCount = (int)MathF.Ceiling(m_componentCreature.ComponentHealth.AttackResilience / 12f);
    // attacker = 攻击者;StackExperienceOnKill = 是否允许击杀叠加经验
    if (attacker != null && StackExperienceOnKill) {
        // 超过 100 个时分组掉落,防止卡顿
        for (int i = 0; i < Math.Min(100, experienceOrbDropCount); i++) {
            // dropInWave = 每组掉落数量
            int dropInWave = experienceOrbDropCount / 100;
            if (i < experienceOrbDropCount % 100) dropInWave++;  // 余数补到前几组
            // m_subsystemPickables = 掉落物子系统
            // ExperienceOrbBlockIndex = 经验球方块索引(值为 8)
            // dropInWave = 每组数量
            // m_componentCreature.ComponentBody.Position = 掉落位置(生物位置)
            // new Vector3(...) = 掉落初速度(随机水平 + 向上 6)
            m_subsystemPickables.AddPickable(
                ExperienceOrbBlockIndex,  // 8
                dropInWave,
                m_componentCreature.ComponentBody.Position,
                new Vector3(random.Vector2(2.5f, 3.5f), 6f),
                null,
                Entity
            );
        }
    }
}

死亡掉落(ComponentHealth.cs) ​

死亡掉落逻辑:当生命值归零且生命值变化为负(受到致命伤害)或尚未记录死亡时间时,触发死亡流程。DeathTime(死亡时间戳)记录死亡时刻;KillParticleSystem(死亡粒子系统)播放死亡特效;DropAllItems(掉落全部物品)将背包内所有物品丢出。

csharp
// Health = 生命值;HealthChange = 本帧生命值变化量
// DeathTime = 死亡时间戳(可空,HasValue 表示是否已记录)
if (Health == 0f && (HealthChange < 0f || !DeathTime.HasValue)) {
    // m_subsystemGameInfo.TotalElapsedGameTime = 游戏总经过时间
    DeathTime = m_subsystemGameInfo.TotalElapsedGameTime;
    // KillParticleSystem = 死亡粒子系统(播放死亡特效)
    // m_subsystemTerrain = 地形子系统;position2 = 死亡位置;x = 粒子参数
    KillParticleSystem killParticleSystem = new(m_subsystemTerrain, position2, x);
    // m_subsystemParticles = 粒子系统,添加死亡粒子效果
    m_subsystemParticles.AddParticleSystem(killParticleSystem);
    // position3 = 掉落中心位置(生物包围盒中心点)
    // BoundingBox.Min / Max = 包围盒最小/最大角点
    Vector3 position3 = (m_componentCreature.ComponentBody.BoundingBox.Min + m_componentCreature.ComponentBody.BoundingBox.Max) / 2f;
    // Entity.FindComponents<IInventory>() = 查找实体上所有实现 IInventory 接口的组件(背包)
    // DropAllItems = 掉落全部物品到指定位置
    foreach (IInventory item in Entity.FindComponents<IInventory>()) {
        item.DropAllItems(position3);
    }
}

游戏模式枚举 ​

GameMode 枚举:定义游戏的所有模式。数值从 0(最简单)到 5(最严格),影响玩家属性、死亡规则和世界行为。

csharp
public enum GameMode {
    Creative = 0,       // Creative = 创造模式,无敌、无限资源、可飞行
    Harmless = 1,       // Harmless = 无害模式,不会饥饿、属性加成、死亡可重生
    Survival = 2,       // Survival = 生存模式,正常饥饿、防御 +25%、死亡可重生
    Challenging = 3,    // Challenging = 挑战模式,正常属性、死亡可重生
    Cruel = 4,          // Cruel = 残酷模式,死亡后无法重生,只能删除存档重来
    Adventure = 5       // Adventure = 冒险模式,用于自定义冒险关卡,重生规则由关卡设定
}
参与共建发现错误或有建议?两种零门槛方式,无需本地环境

玩家共建文档 · 原版、插件版、联机版与插件联机版请注意区分