Back to Blog
·Summer Team

如何在 Godot 4 中构建带记忆和个性的 AI NPC

学习如何在 Godot 4 中利用 AI 创建能记住玩家、保持人设并动态反应的 NPC。

大多数游戏里的 NPC 都是状态机。它们沿着路线巡逻,发现玩家,切换到攻击模式,再循环回去。这套对敌人管用,但对那些本该让人觉得活生生的角色来说就撑不住了。

一个铁匠铺老板,不管你在游戏里做过什么事,都只会说那三句台词。一个任务发布者,完全不认你上周救过他的村子。一个同伴,每段对话一结束就把所有内容忘个精光。

AI 在这里改变了可能性的边界。并不是说要用聊天机器人去取代游戏设计,而是在传统 NPC 系统之上叠加记忆、个性和动态反应这些层次。

AI NPC 到底是什么

AI NPC 并不是把一个聊天机器人塞进游戏世界里。这是最常见的误解,也正是它让那些 NPC 感觉和它们所在的游戏完全脱节。

一个做得好的 AI NPC 把语言模型和游戏系统结合在一起。它具备:

  • 一段人设提示词,定义它怎么说话,在意什么,以及面对不同情境时如何反应。一个粗犷的铁匠和一个紧张的学徒说话方式就不一样。
  • 一套记忆系统,用来记录和玩家的互动。说过什么话,交易过什么东西,给过哪些任务、完成了哪些。
  • 目标和动机,影响行为方式。商人想赚钱。卫兵想保护城镇。小偷想不被逮到。
  • 对游戏世界的感知能力,这样它才能引用真实发生过的事件、物品、地点和其他角色。“我听说你把东边路上的强盗清了”这句话,只有当 NPC 能查询游戏状态时才说得通。

最终的结果是一个前后一致、记得上下文、对玩家的反应自然又扎根于游戏世界的角色。

AI NPC 的三个层次

每一个 AI NPC 都可以拆成三个清晰的层次。你可以三层都实现,也可以只从其中一到两层开始。

第 1 层:行为

这就是传统的游戏 AI。巡逻路线、反应触发器、战斗逻辑、日常作息。一棵行为树或一台状态机负责处理 NPC 在世界里的物理动作。

这一层在本地运行,不需要联网。它是确定的、可预测的。铁匠白天站在锻炉旁,晚上回家。卫兵在城墙上巡逻。商人在黎明时开店。

在 Godot 4 里,你通常会用 AnimationTree 处理状态切换,用 Area3D 节点做检测区域,再加一段脚本来管理状态机或行为树。

enum State { IDLE, WORKING, SLEEPING, TALKING }
var current_state: State = State.IDLE
var schedule: Dictionary = {
    6: State.WORKING,
    20: State.IDLE,
    22: State.SLEEPING
}

这一层是地基。即使你再加上 AI 对话和记忆,行为层依然用一致、可靠的动作把 NPC 稳稳钉在游戏世界里。

第 2 层:对话

LLM 就是在这一层登场的。NPC 不再是从预先写好的台词里挑一句来说,而是基于自己的人设、当前的上下文以及对话历史,现场生成回复。

人设提示词是最关键的一块。它定义了这个角色的语气、知识范围和边界:

You are Tormund, a blacksmith in the village of Ashford.
You are gruff but fair. You take pride in your craft.
You charge reasonable prices and give discounts to repeat customers.
You have a side quest: you need rare ore from the northern mines
to forge a legendary blade. You will ask trusted customers for help.
You know about: village gossip, weapon quality, mining locations.
You do not know about: magic, politics, events outside Ashford.

对话层需要一个 AI 模型。可以是云端 API(OpenAI、Anthropic、Google),也可以是通过 Ollama 运行的本地模型。本地模型延迟更高,但没有持续成本,并且完全保护隐私。

一个关键的设计决策:NPC 的回复必须有边界。一个不受约束的聊天机器人会幻觉出根本不存在的地点、引用游戏里没有的物品,甚至彻底跳出人设。人设提示词配合一套把当前游戏状态注入进去的系统,能把回复牢牢拴在现实里。

第 3 层:记忆

记忆,才是把一个令人信服的 AI NPC 和一个只是新奇玩意的 NPC 区分开的东西。没有记忆,每次对话都是从零开始。NPC 完全不知道玩家是谁,也不知道之前发生过什么。

一套记忆系统会追踪:

  • 互动历史:玩家说了什么,NPC 回了什么,以及何时发生。
  • 关系状态:NPC 信任这个玩家吗?他们是友好、中立还是敌对?
  • 关键事件:玩家给这个 NPC 做完了一个任务。玩家偷了他们的店。玩家从危险中救下了他们的孩子。
  • 共享知识:玩家透露过的信息。“我在找那座失落的神殿”后来就成了 NPC 可以回头引用的东西。

记忆存储可以非常简单。一个 JSON 文件或一个 SQLite 数据库对大多数游戏来说都够用。真正关键的部分是记忆怎么被检索出来、又怎么被注入到对话上下文里。

var memories: Array[Dictionary] = []

func add_memory(event: String, importance: float) -> void:
    memories.append({
        "event": event,
        "importance": importance,
        "timestamp": Time.get_unix_time_from_system(),
    })

func get_relevant_memories(context: String, limit: int = 5) -> Array:
    # Sort by importance and recency, return top memories
    var sorted = memories.duplicate()
    sorted.sort_custom(func(a, b):
        return a.importance * _recency_weight(a.timestamp) > \
               b.importance * _recency_weight(b.timestamp)
    )
    return sorted.slice(0, limit)

当玩家和 NPC 说话时,相关的记忆会被拉出来,加到提示词里。“玩家三天前帮你找到了稀有矿石。你心怀感激,给了他折扣。”LLM 会利用这段上下文,生成一个能呼应共同经历的回复。

记忆要跨会话保存。玩家下次读档进来时,NPC 依然记得一切。这正是让 AI NPC 和脚本化 NPC 感觉截然不同的地方。

在 Summer Engine 里构建 AI NPC

Summer Engine 把这个过程变成了对话式的。你不再需要一层一层手动去连线,只要描述你想要的 NPC:

“加一个叫 Tormund 的铁匠 NPC。他粗犷但公道,价格合理,有一个支线任务,是要在北边矿场找稀有矿石。他会记得过去的交易,并给回头客打折。”

引擎会创建:

  • 带 CharacterBody3D、碰撞形状和网格的 NPC 节点
  • 带每日作息的行为树(白天在锻炉干活,晚上回家)
  • 一套根据你的描述生成人设提示词的对话系统
  • 一个记忆存储,用来记录玩家互动和交易历史
  • 一个带定价逻辑、会根据关系状态调整价格的商店界面

这些组件里的任何一个,你都可以通过对话继续打磨。“让 Tormund 对陌生人更多疑”会调整人设提示词和初始关系状态。“加一个战斗反应,如果被攻击他会还击”会扩展行为树。

因为 Summer Engine 兼容 Godot 4,生成出来的系统用的是标准的 Godot 节点和 GDScript。你可以检查和修改引擎创建的任何东西。AI NPC 不是一个黑箱;它就是一堆属于你的节点、脚本和资源。

AI NPC 与脚本化 NPC 的对比

两种方式都有合理的用途。选哪种取决于你的游戏。

脚本化 NPC:

  • 完全可预测。他们说的每一个字都由你掌控。
  • 可以离线运行,运行时成本为零。
  • 更容易做测试和 QA,因为行为是确定的。
  • 扩展性好。一百个脚本化 NPC 和一个的成本差不多。
  • 受限于你写的内容。玩家很快就会把对话耗尽。

AI NPC:

  • 动态且有回应。每次对话都是独一无二的。
  • 跨互动记住上下文。
  • 可以优雅地处理意料之外的玩家输入。
  • 运行时成本更高(API 调用或本地模型推理)。
  • 更难测试,因为回复会有变化。
  • 如果没有适当的护栏,有脱离人设或生成不当内容的风险。

对大多数游戏而言,混合方案效果最好。 用脚本化行为作为基础层:巡逻路线、战斗逻辑、日常作息以及关键剧情节点。用 AI 来做对话层和记忆层,动态回复在这两层能带来最大价值。

一个承载关键任务的 NPC,可以在关键剧情节拍上用脚本化对话,而在其他地方使用 AI 驱动的回复。玩家永远能拿到推进所需的信息,同时也有自由去提问、去和角色建立关系。

如何开始

Summer Engine 里的 RPG 模板 自带可定制的 AI NPC 系统。描述你想要的角色,引擎会把带人设、记忆和游戏世界感知能力的 NPC 一起做出来。

如果你想探索 AI NPC 的生成,可以看看 AI NPC 生成器,或者 下载 Summer Engine 来构建你的第一批 AI 角色。