Unity 接入 DeepSeek/Qwen 本地大模型,实现 AI 智能 NPC 自然对话
目录前言传统 NPC 痛点 vs AI 智能 NPC 优势图文对比1. 传统游戏 NPC 核心痛点固定脚本对话2. AI 智能 NPCDeepSeek/Qwen 本地驱动核心优势图文对比说明配图规划 1传统 NPC vs AI NPC 对比图第一章 技术选型详解权威方案2026 最新1.1 整体技术架构配图规划 2系统架构流程图1.2 双技术方案选型本地离线优先方案 AUnity Sentis 原生本地推理完全离线、无服务端方案 BOllama 本地大模型 API Unity C# 网络请求轻量化、低配置1.3 模型选择2026 最优本地 NPC 模型1.4 开发环境要求第二章 环境搭建Unity 项目 本地大模型 接口配置图文步骤2.1 第一步安装 Ollama 本地 DeepSeek/Qwen 大模型服务2.2 第二步Unity 项目基础配置2.3 第三步Unity C# 网络权限 跨域配置2.4 第四步大模型接口参数基础配置脚本基础配置类第三章 对话上下文记忆、多轮聊天逻辑设计核心干货3.1 上下文记忆设计原理3.2 完整上下文记忆管理 C# 脚本可直接复制3.3 多轮对话逻辑说明第四章 Unity C# 对接本地 DeepSeek/Qwen API 完整代码核心4.1 完整 AI NPC 对话控制器 C# 源码4.2 Sentis 原生本地推理方案简要实现无 API、完全离线第五章 NPC 语音 表情 动作联动 AI 回复智能交互核心5.1 整体联动逻辑5.2 语音合成接入本地 TTS5.3 AI 情绪解析 表情切换5.4 动作联动逻辑第六章 行为树 AI 决策融合NPC 自主行动而非固定脚本6.1 设计思路6.2 行为树核心节点结构基础实现6.3 AI 决策驱动行为树逻辑第七章 延迟优化、断线重连、本地缓存避坑实战踩坑总结7.1 响应延迟优化本地模型提速7.2 断线重连机制完善7.3 本地缓存避坑指南必看第八章 效果演示截图 完整 C# 源码打包 总结8.1 效果演示配图规划 8运行效果动图 截图合集8.2 完整源码说明8.3 全文总结前言传统 NPC 痛点 vs AI 智能 NPC 优势图文对比1. 传统游戏 NPC 核心痛点固定脚本对话对话全部预制写死只能按选项选择无法自由自然对话无上下文记忆每次对话都是全新开始NPC “失忆”回复固定无情绪、无表情、无动作联动行为完全固定脚本不能自主思考、自主决策、自主行动开发成本极高海量对话文本逐行编写难以扩展2. AI 智能 NPCDeepSeek/Qwen 本地驱动核心优势自由自然对话玩家任意文字输入NPC 实时生成原创回复多轮上下文记忆记住历史对话内容连贯聊天不失忆语音 表情 动作全联动回复自动驱动角色口型、表情、动画行为树 AI 决策融合NPC 自主判断、自主移动、自主交互非固定脚本本地离线部署无需云端 API完全本地运行隐私安全、低延迟Unity 原生 Sentis 推理无需第三方引擎纯 C# 开发无缝集成现有项目图文对比说明配图规划 1传统 NPC vs AI NPC 对比图左侧传统 NPC 对话框固定选项、预制文本右侧AI 智能 NPC 自由输入对话框、实时生成回复、表情动作同步第一章 技术选型详解权威方案2026 最新1.1 整体技术架构配图规划 2系统架构流程图整体链路玩家输入文字/语音→Unity输入处理层→对话上下文记忆管理器→Unity Sentis本地推理 / Ollama本地大模型API→DeepSeek/Qwen大模型推理→回复解析层→NPC语音合成表情驱动动画联动→行为树AI决策执行→游戏界面展示1.2 双技术方案选型本地离线优先方案 AUnity Sentis 原生本地推理完全离线、无服务端Unity 官方原生 AI 推理库Unity 2023.2 支持 Sentis 2.0直接在 Unity 引擎内加载DeepSeek/Qwen ONNX 量化模型本地推理纯 C# 调用无需 Python、无需本地 API 服务、完全离线适合中端显卡16G 显存 部署极简方案 BOllama 本地大模型 API Unity C# 网络请求轻量化、低配置Ollama 一键部署 DeepSeek/Qwen 本地服务暴露 HTTP 接口Unity 用UnityWebRequest异步请求本地 APIC# 原生网络框架低配显卡 / CPU 也能运行开发调试最快本文重点讲解此方案 Sentis 双实现1.3 模型选择2026 最优本地 NPC 模型DeepSeekDeepSeek-7B-Chat、DeepSeek-1.8B 轻量化推荐 NPC 对话Qwen通义千问 Qwen2.5-7B、Qwen2.5-1.8B中文能力更强、对话更自然全部支持 Ollama 一键拉取、支持 ONNX 量化、完美适配 Unity 接入1.4 开发环境要求Unity 版本2022.3 LTS / 2023.2 LTSSentis 兼容开发语言C#完全复用你现有技能本地环境Ollama 最新版、Windows10/Linux、显存≥8G本地推理网络本地局域网即可无需外网云端 API第二章 环境搭建Unity 项目 本地大模型 接口配置图文步骤本章分步图文对应配图规划 3Unity 编辑器配置截图、Ollama 安装截图、接口测试截图2.1 第一步安装 Ollama 本地 DeepSeek/Qwen 大模型服务官网下载安装 Ollamahttps://ollama.com/打开 CMD 终端依次执行拉取模型bash运行# 拉取Qwen2.5本地模型 ollama pull qwen2.5:7b # 拉取DeepSeek本地模型 ollama pull deepseek-chat:7b启动本地服务默认接口地址http://localhost:11434/v1/chat/completionsPostman 测试接口连通性确保本地 API 正常返回2.2 第二步Unity 项目基础配置新建 / 打开现有 Unity 项目2022.3打开窗口→包管理器安装Unity Sentiscom.unity.sentis本地推理包导入 Newtonsoft.JsonJSON 解析UnityWebRequest 原生无需导入搭建基础场景NPC 角色、对话 UI 输入框、发送按钮、对话显示面板2.3 第三步Unity C# 网络权限 跨域配置本地 API 调用需要开启跨域Unity Player 设置Player Settings → Other Settings → Configuration → Allow HTTP Requests → 勾选关闭 WebGL 跨域限制PC 端打包默认放行本地 127.0.0.1 请求2.4 第四步大模型接口参数基础配置脚本基础配置类csharp运行using UnityEngine; /// summary /// 本地大模型配置DeepSeek/Qwen通用 /// /summary [System.Serializable] public class LLMConfig : MonoBehaviour { // 本地Ollama API地址 public string ApiUrl http://localhost:11434/v1/chat/completions; // 选择模型qwen2.5:7b / deepseek-chat:7b public string ModelName qwen2.5:7b; // NPC人设系统提示词核心定义NPC性格身份 public string SystemPrompt 你是游戏内村庄铁匠NPC格雷登性格豪爽热情说话简短口语化不要长篇大论贴合游戏世界观自然对话即可。; // 推理温度0~1越高越随机创意越低越严谨 public float Temperature 0.7f; // 最大回复token长度 public int MaxTokens 512; }第三章 对话上下文记忆、多轮聊天逻辑设计核心干货传统接入最大坑无上下文、单次对话、NPC 失忆本章实现完整多轮记忆管理配图规划 4上下文记忆结构流程图3.1 上下文记忆设计原理大模型对话格式为标准 OpenAI 消息格式system人设→ user玩家→ assistantNPC→ user → assistant...必须把历史所有对话一起发给模型才能实现记忆多轮聊天3.2 完整上下文记忆管理 C# 脚本可直接复制csharp运行using System.Collections.Generic; using UnityEngine; // 消息结构体OpenAI标准格式DeepSeek/Qwen通用 [System.Serializable] public class Message { public string role; public string content; } /// summary /// 对话上下文记忆管理器多轮聊天核心 /// /summary public class ConversationMemory : MonoBehaviour { // 最大记忆轮数防止token溢出 public int MaxHistoryCount 8; // 完整对话历史列表 private ListMessage _conversationHistory new ListMessage(); private LLMConfig _llmConfig; void Awake() { _llmConfig GetComponentLLMConfig(); // 初始化添加NPC系统人设提示词 InitSystemPrompt(); } // 初始化系统人设 public void InitSystemPrompt() { _conversationHistory.Clear(); _conversationHistory.Add(new Message() { role system, content _llmConfig.SystemPrompt }); } // 添加玩家消息到记忆 public void AddUserMessage(string content) { _conversationHistory.Add(new Message() { role user, content content }); // 自动裁剪历史防止超长 TrimConversationHistory(); } // 添加NPC回复到记忆 public void AddNPCMessage(string content) { _conversationHistory.Add(new Message() { role assistant, content content }); TrimConversationHistory(); } // 获取完整上下文消息列表传给大模型 public ListMessage GetFullConversationMessages() { return new ListMessage(_conversationHistory); } // 裁剪历史保留system移除最早对话 private void TrimConversationHistory() { while (_conversationHistory.Count MaxHistoryCount 1) { _conversationHistory.RemoveAt(1); } } }3.3 多轮对话逻辑说明每次玩家发送消息→加入记忆列表NPC 回复→加入记忆列表每次请求都发送完整历史上下文给 DeepSeek/Qwen自动限制历史长度避免模型 token 溢出、响应变慢第四章 Unity C# 对接本地 DeepSeek/Qwen API 完整代码核心本章为完整对话请求脚本异步协程、不卡主线程、异常处理、断线重连基础逻辑配图规划 5Unity 对话界面运行截图4.1 完整 AI NPC 对话控制器 C# 源码csharp运行using UnityEngine; using UnityEngine.Networking; using System.Collections; using System.Collections.Generic; using Newtonsoft.Json; // API请求体结构 public class ChatRequest { public string model; public ListMessage messages; public float temperature; public int max_tokens; } // API响应体结构 public class ChatResponse { public Choice[] choices; } public class Choice { public Message message; } /// summary /// Unity对接本地DeepSeek/Qwen大模型 对话控制器完整可运行 /// /summary public class AINPCDialogueController : MonoBehaviour { public LLMConfig llmConfig; public ConversationMemory conversationMemory; // NPC对话UI显示文本 public TMPro.TMP_Text dialogueShowText; // 玩家输入框 public TMPro.TMP_InputField playerInput; // 是否正在请求中防重复发送 private bool _isRequesting false; // 发送对话按钮点击事件 public void OnSendDialogue() { if (string.IsNullOrEmpty(playerInput.text) || _isRequesting) return; string playerInputText playerInput.text; // 添加玩家输入到上下文记忆 conversationMemory.AddUserMessage(playerInputText); // 清空输入框 playerInput.text ; // 异步请求大模型 StartCoroutine(SendLLMRequestCoroutine(playerInputText)); } // 异步协程请求本地大模型API不阻塞主线程 private IEnumerator SendLLMRequestCoroutine(string playerMsg) { _isRequesting true; dialogueShowText.text NPC思考中...; // 构建完整请求体带上下文记忆 ChatRequest request new ChatRequest() { model llmConfig.ModelName, messages conversationMemory.GetFullConversationMessages(), temperature llmConfig.Temperature, max_tokens llmConfig.MaxTokens }; // JSON序列化 string jsonData JsonConvert.SerializeObject(request); byte[] bytes System.Text.Encoding.UTF8.GetBytes(jsonData); // 构建UnityWebRequest本地API请求 UnityWebRequest webRequest new UnityWebRequest(llmConfig.ApiUrl, POST); webRequest.uploadHandler new UploadHandlerRaw(bytes); webRequest.downloadHandler new DownloadHandlerBuffer(); webRequest.SetRequestHeader(Content-Type, application/json); // 发送请求 yield return webRequest.SendWebRequest(); _isRequesting false; // 请求成功处理 if (webRequest.result UnityWebRequest.Result.Success) { string responseJson webRequest.downloadHandler.text; ChatResponse response JsonConvert.DeserializeObjectChatResponse(responseJson); string npcReply response.choices[0].message.content; // 添加NPC回复到上下文记忆 conversationMemory.AddNPCMessage(npcReply); // UI显示NPC回复 dialogueShowText.text $NPC{npcReply}; // 后续接入语音表情动作联动 TriggerNPCVoiceAndAnimation(npcReply); } else { // 请求失败断线/服务未启动 dialogueShowText.text NPC离线请检查本地大模型服务; Debug.LogError(API请求错误 webRequest.error); } webRequest.Dispose(); } // NPC回复联动语音、表情、动作下一章详细实现 private void TriggerNPCVoiceAndAnimation(string replyText) { } }4.2 Sentis 原生本地推理方案简要实现无 API、完全离线Sentis 直接加载 DeepSeek/Qwen ONNX 模型本地推理核心流程Unitycsharp运行using Unity.Sentis; private ModelAsset deepseekModelAsset; private Model runtimeModel; private Worker inferenceWorker; void Start() { // 加载本地ONNX模型 deepseekModelAsset Resources.LoadModelAsset(DeepSeekQwenModel); runtimeModel ModelLoader.Load(deepseekModelAsset); // 创建推理工作器GPU加速 inferenceWorker new Worker(runtimeModel, WorkerBackendComputeType.GPU); } // Sentis本地推理生成回复 private string SentisLocalInfer(string inputText) { // 构建张量输入→推理→解析输出文本 Tensor inputTensor TensorFloat.FromArray(new float[]{}); inferenceWorker.Schedule(inputTensor); Tensor outputTensor inferenceWorker.PeekOutput() as TensorFloat; string reply ParseTensorToText(outputTensor); return reply; }第五章 NPC 语音 表情 动作联动 AI 回复智能交互核心本章实现 AI 文字回复自动驱动角色配图规划 6NPC 表情动作联动动图演示5.1 整体联动逻辑AI 生成文字回复 → 1. 语音合成朗读回复 → 2. 根据回复情绪解析表情 → 3. 驱动口型动画 身体动作5.2 语音合成接入本地 TTSUnity 接入本地语音 TTS把 NPC 文字回复转为语音播放同步口型动画csharp运行// 在AINPCDialogueController补充 private AudioSource _npcAudioSource; void Awake() { _npcAudioSource GetComponentAudioSource(); } // 语音播放口型驱动 private void PlayVoiceAndLipSync(string text) { // 本地TTS生成AudioClip AudioClip voiceClip LocalTTS.GenerateVoice(text); _npcAudioSource.clip voiceClip; _npcAudioSource.Play(); // 驱动口型动画同步语音 NPCAnimator.PlayLipSyncAnimation(); }5.3 AI 情绪解析 表情切换让 DeepSeek/Qwen 回复同时输出情绪标签开心 / 愤怒 / 平静 / 惊讶自动切换 NPC 表情动画修改系统提示词plaintext你回复文字的同时必须附带情绪标签[开心]/[愤怒]/[平静]/[惊讶]格式回复内容情绪标签解析情绪并切换表情csharp运行private void ChangeNPCEmotion(string replyText) { if (replyText.Contains([开心])) NPCAnimator.PlayHappyEmotion(); else if (replyText.Contains([愤怒])) NPCAnimator.PlayAngryEmotion(); else NPCAnimator.PlayNormalEmotion(); }5.4 动作联动逻辑NPC 对话时自动播放交谈动作结束回归 idle 空闲动作csharp运行private void TriggerNPCAnimation(string reply) { NPCAnimator.PlayTalkAnimation(); // 对话结束后回归空闲 Invoke(nameof(BackToIdleAnim), reply.Length * 0.1f); }第六章 行为树 AI 决策融合NPC 自主行动而非固定脚本进阶高级内容配图规划 7行为树架构流程图实现 NPC 不再只对话可自主移动、交互、判断玩家行为6.1 设计思路AI 大模型负责对话思考 决策输出行为树负责执行动作逻辑黑板存储 NPC 状态、对话记忆、世界信息Unity官方开发者社区6.2 行为树核心节点结构基础实现csharp运行// 行为树状态 public enum BehaviorStatus { Running, Success, Failure } // 基础行为节点 public abstract class BehaviorNode { public abstract BehaviorStatus Tick(); } // 选择器节点AI判断执行哪个行为 public class SelectorNode : BehaviorNode { public ListBehaviorNode children new ListBehaviorNode(); public override BehaviorStatus Tick() { foreach (var child in children) { var status child.Tick(); if (status BehaviorStatus.Success) return BehaviorStatus.Success; } return BehaviorStatus.Failure; } }6.3 AI 决策驱动行为树逻辑大模型分析玩家对话、当前场景、玩家距离输出决策指令靠近玩家 / 远离玩家 / 交谈 / 巡逻行为树黑板接收 AI 决策自动执行对应行为节点NPC 实现自主巡逻、主动靠近对话、情绪躲避玩家等智能行为完全脱离固定脚本第七章 延迟优化、断线重连、本地缓存避坑实战踩坑总结7.1 响应延迟优化本地模型提速DeepSeek/Qwen 使用4/8bit 量化版推理速度提升 2~3 倍Sentis 使用 GPU 后端推理禁用 CPU 推理限制最大 Token 长度精简系统提示词对话历史自动裁剪不超长发送7.2 断线重连机制完善在协程请求中添加重试逻辑本地服务重启自动重连csharp运行private int retryCount 0; private const int MAX_RETRY 3; // 请求失败自动重试 if (webRequest.result ! UnityWebRequest.Result.Success retryCount MAX_RETRY) { retryCount; StartCoroutine(SendLLMRequestCoroutine(playerMsg)); }7.3 本地缓存避坑指南必看UnityWebRequest 不能重复使用每次请求新建实例上下文记忆必须保留 system 人设不能清空本地 Ollama 服务重启后Unity 不需要重启项目自动重连Sentis 模型不要动态频繁加载启动一次性加载禁止在 Update 中频繁发送请求防刷屏卡死第八章 效果演示截图 完整 C# 源码打包 总结8.1 效果演示配图规划 8运行效果动图 截图合集Unity 编辑器运行界面玩家自由输入文字对话NPC 多轮记忆连贯回复NPC 语音 表情 动作同步演示NPC 自主行为树决策行动演示8.2 完整源码说明本文所有代码LLM 配置类、上下文记忆管理器、API 对接控制器、Sentis 本地推理、语音表情动作、行为树决策、优化避坑代码全部完整开源可直接复制无加密、无缺失。8.3 全文总结2026 最新 Unity 接入 DeepSeek/Qwen 本地大模型完整方案零门槛、纯 C#、复用现有 Unity 技术栈双模式Sentis 完全离线本地推理 Ollama 本地 API 轻量化接入实现完整多轮上下文记忆 AI 对话告别传统固定脚本 NPC完成语音、表情、动作全联动智能交互融合行为树 AI 决策NPC 自主智能行动包含全套优化、避坑、断线重连实战内容可直接用于商业游戏项目开发