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

生物行为与逻辑 ​

一只灰狼在远处漫无目的地游荡,忽然停下脚步,转头锁定了你——这一连串行为背后,是一套基于"重要性竞争"的行为选择系统。生存战争的生物AI不使用复杂的行为树,而是用简洁的优先级机制实现了丰富的生物AI。

核心架构 ​

重要性竞争机制 ​

生存战争的生物AI不使用复杂的行为树,而是使用重要性竞争:

每帧,所有行为计算自己的重要性数值,数值最高的那个行为被激活,其余行为全部暂停。

被激活的行为=重要性最高的行为\text{被激活的行为} = \text{重要性最高的行为}

生物在同一时刻只能做一件事——要么追击,要么逃跑,要么漫步,不会同时进行。优先级高的行为会完全压制低优先级行为,所以狼不可能边追边嚎叫。

状态机 ​

每个行为内部使用状态机管理自己的状态切换。状态机有三个关键动作:

  • 进入状态 — 刚切换到这个状态时执行一次
  • 状态更新 — 每帧持续执行
  • 离开状态 — 切换到其他状态前执行一次

生物分类 ​

类别说明
陆地掠食者狼、熊、虎、狮等陆地肉食动物
陆地普通生物牛、马、鹿、羊等陆地植食动物
水生掠食者鲨鱼、虎鲸等水中掠食者
水生普通生物鲈鱼、食人鱼等水中普通生物
鸟类鸽子、麻雀、鸭等飞禽

分类直接影响追击目标选择:掠食者的"自动追击类别"会包含对应的猎物类别。

行为组件全览 ​

游戏中共有约 26 种行为组件,每个生物只会拥有其中一部分:

行为功能常见拥有者
追击攻击发现并追击目标,发动攻击掠食者
逃跑受伤后寻找安全地点逃跑多数陆地生物
寻找玩家中立生物主动寻找玩家部分中立生物
躲避玩家从玩家附近逃离胆小的生物
随机漫步无目的的随机行走所有陆地生物
飞行漫游鸟类随机飞行鸟类
游泳漫游水生生物随机游动鱼类
兽群跟随跟随兽群中心移动群居动物
牛群驱赶被驱赶时移动牛
躲避火焰远离篝火多数生物
飞行逃跑遇到危险飞走鸟类
凝视盯着目标看多种生物
嚎叫夜间嚎叫狼
产卵鸟类产蛋鸭、鸡等
跟随召唤物跟随主人被驯服的生物
甩骑手未驯服的马甩人野马
坐骑响应响应骑手指令被驯服的马
顽固坐骑饥饿时拒绝移动饥饿的坐骑
泥地打滚猪在泥地打滚猪
离水挣扎鱼离开水后跳跃鱼类
进食寻找并吃掉食物多种生物
鲸类呼吸浮出水面呼吸鲸类
游泳逃跑水生生物逃跑鱼类

追击与攻击行为 ​

这是游戏中最核心的战斗AI,决定了掠食者如何发现、追击和攻击目标。

关键参数 ​

参数数值说明
最大攻击距离1.75 格近战攻击的有效范围
主动攻击最低血量40%生命值低于 40% 时不主动发起攻击
碰撞触发追击范围7 格被碰撞后追击的距离
碰撞追击持续时间7 秒碰撞触发的追击持续多久
被攻击后追击范围30 格被打后追多远(必定反击时)
被攻击后追击时间60 秒被打后追多久(必定反击时)
目标在范围内触发时间3 秒目标在视野内持续 3 秒才发起追击
追击行为重要性200用于行为竞争的优先级

目标必须在视野内持续 3 秒才会被追击,快速闪过的目标不会触发,给了玩家潜行溜走的机会。

三种追击触发方式 ​

方式一:自动追击(视野发现)

  • 白天和夜间的追击范围不同(夜间通常更大)
  • 目标评分公式:

目标评分=追击范围−距离\text{目标评分} = \text{追击范围} - \text{距离}

距离越近评分越高。

方式二:碰撞触发

  • 生物与你擦肩而过时,有一定概率触发追击
  • 追击范围 7 格,持续 7 秒
  • 这种追击不是持久的——7 秒后就会放弃

方式三:被攻击反击

被攻击后的反击分两种情况:

反击概率追击范围持续时间是否持久
概率 < 100%7 格7 秒否
概率 = 100%30 格60 秒是

当反击概率是 100% 时,追击范围从 7 格暴增到 30 格,持续时间从 7 秒暴增到 60 秒,而且变成持久追击——这就是为什么打了某些生物后它会死命追你。

攻击判定 ​

攻击是否命中需要同时满足:

  1. 两个生物的碰撞盒有重叠
  2. 目标在攻击方向的前方扇形区域内(面向方向点积 > 0.25)
  3. 射线检测距离 < 1.75 格

点积 > 0.25 大约对应前方 75 度的扇形区域。生物只能攻击正前方约 75 度内的目标。

击杀后行为 ​

当追击的目标死亡时,如果该生物有进食行为,会在 1-3 秒后移动到尸体位置进食。

逃跑行为 ​

触发条件 ​

触发条件说明
生命值下降受到伤害后
攻击者在 6 格内距离足够近才有威胁
高分贝噪音听到巨大响声也会逃跑

逃跑重要性 ​

逃跑重要性={300生命值 < 低血量阈值100其他情况\text{逃跑重要性} = \begin{cases} 300 & \text{生命值 < 低血量阈值} \\ 100 & \text{其他情况} \end{cases}

低血量逃跑的重要性(300)高于追击的重要性(200),受伤严重的生物会优先逃跑而非反击。打得过就打,打不过就跑。

寻找安全地点 ​

逃跑时,生物会搜索 30 个候选位置,选择评分最高的作为逃跑目标:

安全地点评分=3×距攻击者距离−距兽群距离+1.5×距噪音源距离−4×水方块惩罚\text{安全地点评分} = 3 \times \text{距攻击者距离} - \text{距兽群距离} + 1.5 \times \text{距噪音源距离} - 4 \times \text{水方块惩罚}

  • 距攻击者越远越好
  • 距兽群太远会扣分(不想离群太久)
  • 距噪音源越远越好
  • 水方块有惩罚(陆地生物不愿跳入水中)

兽群行为 ​

兽群中心计算 ​

每个生物定期计算自己所属兽群的中心位置:

兽群中心=1n∑i=1n同伴位置i\text{兽群中心} = \frac{1}{n} \sum_{i=1}^{n} \text{同伴位置}_i

只有距离在"兽群范围"内的同名称同伴才参与计算。

距离与重要性 ​

距兽群中心距离重要性说明
≤ 10 格0不触发
> 10 格1极低
> 12 格3低
> 16 格50中等
> 20 格250极高

距离兽群越远,归队的重要性越高。20 格时重要性达到 250,高于追击的 200——离群太远的掠食者会放弃追击,先回兽群。

呼叫同伴 ​

被攻击时,生物会呼叫 16 格范围内的同兽群同伴来帮忙。

这就是为什么攻击一只狼会引来整群狼——16 格范围内的同伴都会被呼叫过来一起攻击你。

坐骑行为 ​

坐骑响应 ​

被驯服的坐骑有 5 级速度:

等级速度值说明
0-0.33后退
10停止
20.33慢速行走
30.66中速奔跑
41.0全速飞驰

速度衰减:

  • 最高速度维持 8-12 秒后自动减速一级
  • 最大速度 0.75 秒无碰撞时自动降速
  • 停滞时(速度为 0 且碰撞变化小)0.75 秒后自动加速到 1 级

骑手寻找范围:

  • 主动寻找骑手:7 格
  • 等待状态:6 格

甩骑手 ​

未驯服的马会试图把骑手甩下来:

行为说明
乱跳随机乱跑 + 频繁跳跃
狂奔快速直线冲刺 15 格
呆立呆立不动,每 2 秒随机切换行为

概率:

  • 5% 概率直接把骑手甩下
  • 25% 概率伤害骑手(0.05 伤害)
  • 25% 概率随机切换甩人方式

顽固坐骑 ​

当坐骑饱食度为 0 时,会变得"顽固":

  • 骑手发出移动指令时,摇头并发出痛苦的声音
  • 拒绝移动
  • 持续时间:随机 60-120 秒
  • 随机概率触发

饿着肚子的坐骑不会听话。

其他行为详解 ​

躲避火焰 ​

参数值
检查间隔1 秒
忽略概率1.5%
高分时重要性250

躲避火焰有两种模式:

  • 远离:直接朝远离篝火的方向走
  • 绕行:围绕篝火转圈

1.5% 的概率生物会无视火焰冲过来——这就是为什么偶尔有动物会穿过你的篝火攻击你。

凝视行为 ​

参数值
触发延迟8 秒后随机触发
持续时间6-12 秒
凝视玩家概率100%
凝视其他生物概率25%

凝视玩家时评分 ×100,所以生物更容易盯着玩家看。这就是为什么你总觉得动物在看你——因为它们真的在看。

嚎叫行为 ​

参数值
触发条件夜晚(天光 < 0.1)
触发概率1.5% × 每帧
持续时间5-6 秒
传播范围10 格

产卵行为 ​

参数值
寻路范围0.5 格
行走速度0.4-0.6
产卵时间3 秒
产卵位置前方 3 格,有随机偏移

进食行为 ​

参数值
觅食范围16 格
搜索间隔2-4 秒
进食时间4-5 秒
饱食度增加+1
饥饿时速度0.5-0.7
不饿时速度0.5

离水挣扎 ​

鱼离开水 3 秒后开始疯狂挣扎:

  • 重要性设为 1000(全游戏最高)
  • 使用噪声函数计算摆动角度
  • 2.5% 概率每帧跳跃一次

鱼离水后的挣扎是全游戏最高优先级的行为——比任何行为都高,确保鱼一定会拼命想跳回水里。

鲸类呼吸 ​

鲸鱼需要定期浮出水面呼吸:

呼吸重要性=clamp(0,400,sat(0.75−空气值0.75))\text{呼吸重要性} = \text{clamp}(0, 400, \text{sat}(\frac{0.75 - \text{空气值}}{0.75}))

饱和函数(sat(x))等价于 clamp(x, 0, 1),把值限制在 0 到 1 之间。

当空气值从 0.75 降到 0 时,呼吸的重要性从 0 线性增加到 400。这是全游戏第二高的优先级,仅次于鱼的离水挣扎。

寻路系统 ​

寻路状态 ​

状态说明
停止不移动
直接移动直线朝目标走(无障碍时)
搜索路径寻找绕开障碍的路径
沿路径移动按路径点逐点前进
随机移动找不到路径时随机乱走,最多 3 次
卡住完全无法移动

沿路径行走时速度被限制为 0.75,即使生物的最高速度大于 0.75。这就是为什么生物在复杂地形上看起来比平地上慢。

寻路拥堵机制 ​

为了防止大量生物同时寻路导致卡顿,系统有"寻路拥堵"机制:

  • 每次路径搜索增加拥堵值
  • 拥堵值每 0.08-0.12 秒衰减 20
  • 拥堵值超过 500 时,新的寻路请求会被跳过

当区域内生物太多时,寻路会变慢。这是一种性能保护机制。

影响因素系统 ​

生物有多种属性因素影响其行为和属性:

因素说明
力量因素影响攻击力等
速度因素影响移动速度
饥饿因素影响饥饿相关行为
韧性因素影响伤害抵抗
其他因素攻击速度、挖掘速度、追击范围等

因素的累积方式:

最终值=基础值×∏(乘法因素)+∑(加法因素)\text{最终值} = \text{基础值} \times \prod (\text{乘法因素}) + \sum (\text{加法因素})

乘法因素相乘叠加,加法因素相加叠加。多个增益的效果是相乘的,所以两个 +20% 的速度增益加起来不是 +40%,而是 ×1.2 × 1.2 = +44%。

重要性优先级总览 ​

行为重要性触发条件
离水挣扎1000鱼离水 > 3 秒
鲸类呼吸0-400空气值 < 0.75 时线性增长
低血量逃跑300生命值低于低血量阈值
躲避火焰250火焰评分 > 0.5
兽群归队(>20格)250离兽群中心超过 20 格
追击攻击200有目标或被攻击
普通逃跑100受伤或有噪音
兽群归队(>16格)50离兽群中心超过 16 格
凝视低8 秒后随机触发
漫步极低默认行为

优先级最高的是生存必需的行为(呼吸、挣扎),其次是安全相关(逃跑、躲避火焰),然后是攻击和社交,最低的是漫步等默认行为。

写给开发者 ​

开发者概览

如果你计划开发模组或修改生物AI,以下技术细节将帮助你快速理解系统架构,避免踩坑。

核心文件索引 ​

文件职责
ComponentBehavior.cs行为抽象基类
ComponentBehaviorSelector.cs行为选择器(重要性竞争)
StateMachine.cs状态机框架
ComponentChaseBehavior.cs追击/攻击行为
ComponentRunAwayBehavior.cs逃跑行为
ComponentHerdBehavior.cs兽群行为
ComponentSteedBehavior.cs坐骑行为
ComponentPathfinding.cs寻路系统
ComponentLocomotion.cs移动控制
ComponentFactors.cs影响因素
CreatureCategory.cs生物分类

关键常量速查表 ​

常量值文件
最大攻击距离1.75ChaseBehavior
主动攻击最低血量0.4ChaseBehavior
碰撞追击范围7ChaseBehavior
碰撞追击时间7ChaseBehavior
被攻击追击范围30ChaseBehavior(必定反击)
被攻击追击时间60ChaseBehavior(必定反击)
目标触发时间3ChaseBehavior
兽群呼叫范围16HerdBehavior
寻路拥堵阈值500Pathfinding
寻路速度限制0.75Pathfinding
坐骑速度等级5 级SteedBehavior
甩骑手成功概率5%DumpRiderBehavior

模组扩展接口 ​

钩子用途
OnChaseBehaviorStartChasing追击开始时
OnChaseBehaviorStopChasing追击结束时
OnChaseBehaviorAttacked攻击命中时
ChaseBehaviorScoreTarget目标评分时
CallNearbyCreaturesHelp呼叫附近生物
FindHerdCenter查找兽群中心
OnEatPickable进食时
OnCreatureAttackHit攻击命中
OnFactorsUpdate影响因素更新
IsPredator判定掠食者

行为选择流程图 ​

ComponentBehaviorSelector.Update()(每帧)
    │
    ├── 遍历所有行为组件
    │     └── 取 ImportanceLevel 最高的 → 胜者
    │
    ├── 胜者.IsActive = true(激活)
    └── 其余 behavior.IsActive = false(停用)
    │
    ▼
胜者.Update(dt)
    │
    ├── 状态机 TransitionTo()
    │     └── Enter → Update → Leave
    │
    └── 通过移动控制下发移动指令
          └── 寻路系统寻路
                └── 直接移动 / 搜索路径 / 沿路径移动
参与共建发现错误或有建议?两种零门槛方式,无需本地环境

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