网易首页 > 网易号 > 正文 申请入驻

Unity 接入 DeepSeek 实现 AI 对话功能

0
分享至

本文转载自 Unity 中文社区“月度全能战士”菜菜丸 Penny Lu,点击阅读原文,可以查看菜菜丸在 Unity 中文社区的个人主页,阅读博主分享的更多 Unity 学习心得、技术干货。

DeepSeek 的推出再度掀起了一波 AI 热潮,相信大家都很期待将它与自己的项目相结合。本教程就将带大家了解如何在 Unity 中接入 DeepSeek 的强大功能,通过简单设置,实现 AI 对话功能。

DeepSeek 简介

DeepSeek 是杭州深度求索人工智能基础技术研究有限公司推出的一款大语言模型。2025 年 1 月 20 日,DeepSeek-R1 正式上线,和当前市面上的主流 AI 相比,它在仅有极少标注数据的情况下,极大提升了模型推理能力。在数学、代码、自然语言推理等任务上,性能比肩 OpenAI o1 正式版。作为一款开源国产 AI 模型,它兼具普惠性和优越性能,非常适合大众开发者。我们也可以在 Unity 中调用它的强大功能,接下来将用一个简单例子介绍 DeepSeek 的接入和使用。

文档

要了解如何编写接入 DeepSeek 的代码和设置相关参数,首先要来学习它的文档。DeepSeek 的官方 API 文档地址是:

https://api-docs.deepseek.com/zh-cn/

我们希望使用它的对话 API,文档中给出了一些示例:

文档没有提供 C# 脚本示例,不过它提供了重要参数的信息,之后我们可以让 AI 协助补全脚本。

在“对话补全”(https://api-docs.deepseek.com/zh-cn/api/create-chat-completion)中,提供了更详细的参数含义和示例。

重要准备

(1) API Key

要在 Unity 中调用 DeepSeek,首先需要申请一个 API Key。申请地址为:

https://platform.deepseek.com/api_keys

注意:成功申请 Key 后,要在本地妥善保存。DeepSeek 后台只能查看 Key 的列表和 token 余额等信息,完整的 Key 只会在申请成功后显示一次。

(2)API 请求地址

我们希望使用 DeepSeek 的对话补全功能,它的 API 请求地址是:

https://api.deepseek.com/v1/chat/completions

(3)token

每个 DeepSeek 账号有官方赠送的 10 元余额,可以用它来兑换 token。

token 是模型用来表示自然语言文本的基本单位,也是我们的计费单元,可以直观的理解为“字”或“词”;通常 1 个中文词语、1 个英文单词、1 个数字或 1 个符号计为 1 个 token。

一般情况下模型中 token 和字数的换算比例大致如下:

1 个英文字符 ≈ 0.3 个 token。

1 个中文字符 ≈ 0.6 个 token。

DeepSeek 目前的收费标准如下:

建议大家根据自己的需求来估算消耗的 token 和费用,在控制台可以查看余额:

https://platform.deepseek.com/

模型与 UI

示例中,我们使用 Unity-Chan 模型作为对话角色,该模型可以从 Unity 资源商店中免费下载。

同时,还需要准备简单的 UI,如图:

下方的提问框是用 InputField 组件制作的,右上方的回答框是用 ScrollView 组件搭配 Text 组件制作的。为了方便显示更多内容,要将 ScrollView 的窗口做大一些。美观起见,隐藏了滚动条。

脚本与参数设置

我尝试了用 DeepSeek 来生成相关脚本,最初生成的脚本有可能报错,这时就要根据报错内容让 AI 来进行修改,要求它严格遵循官方文档来编写。

首先是对话管理器脚本:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System.Collections.Generic;

public class DeepSeekDialogueManager : MonoBehaviour
{
// API配置
[Header("API Settings")]
[SerializeField] private string apiKey = "在此处填入你申请的API密钥";// DeepSeek API密钥
[SerializeField] private string modelName = "deepseek-chat";// 使用的模型名称
[SerializeField] private string apiUrl = "https://api.deepseek.com/v1/chat/completions";// API请求地址

// 对话参数
[Header("Dialogue Settings")]
    [Range(0, 2)] public float temperature = 0.7f;// 控制生成文本的随机性(0-2,值越高越随机)
    [Range(1, 1000)] public int maxTokens = 150;// 生成的最大令牌数(控制回复长度)

// 角色设定
[System.Serializable]
public class NPCCharacter
{
public string name;
[TextArea(3, 10)]
public string personalityPrompt = "你是虚拟人物Unity-Chan,是个性格活泼,聪明可爱的女生。擅长Unity和C#编程知识。";// 角色设定提示词
}

[SerializeField] public NPCCharacter npcCharacter;

// 回调委托,用于异步处理API响应
public delegate void DialogueCallback(string response, bool isSuccess);
///

/// 发送对话请求
///
/// 玩家的输入内容
/// 回调函数,用于处理API响应
public void SendDialogueRequest(string userMessage, DialogueCallback callback)
{
StartCoroutine(ProcessDialogueRequest(userMessage, callback));
}
///

/// 处理对话请求的协程
///
/// 玩家的输入内容
/// 回调函数,用于处理API响应
private IEnumerator ProcessDialogueRequest(string userInput, DialogueCallback callback)
{
// 构建消息列表,包含系统提示和用户输入
List messages = new List
{
new Message { role = "system", content = npcCharacter.personalityPrompt },// 系统角色设定
new Message { role = "user", content = userInput }// 用户输入
};

// 构建请求体
ChatRequest requestBody = new ChatRequest
{
model = modelName,// 模型名称
messages = messages,// 消息列表
temperature = temperature,// 温度参数
max_tokens = maxTokens// 最大令牌数
};

string jsonBody = JsonUtility.ToJson(requestBody);
Debug.Log("Sending JSON: " + jsonBody); // 调试用,打印发送的JSON数据

UnityWebRequest request = CreateWebRequest(jsonBody);
yield return request.SendWebRequest();

if (IsRequestError(request))
{
Debug.LogError($"API Error: {request.responseCode}\n{request.downloadHandler.text}");
callback?.Invoke(null, false);
yield break;
}

DeepSeekResponse response = ParseResponse(request.downloadHandler.text);
if (response != null && response.choices.Length > 0)
{
string npcReply = response.choices[0].message.content;
callback?.Invoke(npcReply, true);
}
else
{
callback?.Invoke(name + "(陷入沉默)", false);
}
}
///

/// 创建UnityWebRequest对象
///
/// 请求体的JSON字符串
/// 配置好的UnityWebRequest对象
private UnityWebRequest CreateWebRequest(string jsonBody)
{
byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonBody);
var request = new UnityWebRequest(apiUrl, "POST");
request.uploadHandler = new UploadHandlerRaw(bodyRaw);// 设置上传处理器
request.downloadHandler = new DownloadHandlerBuffer();// 设置下载处理器
request.SetRequestHeader("Content-Type", "application/json");// 设置请求头
request.SetRequestHeader("Authorization", $"Bearer {apiKey}");// 设置认证头
request.SetRequestHeader("Accept", "application/json");// 设置接受类型
return request;
}
///

/// 检查请求是否出错
///
/// UnityWebRequest对象
/// 如果请求出错返回true,否则返回false
private bool IsRequestError(UnityWebRequest request)
{
return request.result == UnityWebRequest.Result.ConnectionError ||
request.result == UnityWebRequest.Result.ProtocolError ||
request.result == UnityWebRequest.Result.DataProcessingError;
}
///

/// 解析API响应
///
/// API响应的JSON字符串
/// 解析后的DeepSeekResponse对象
private DeepSeekResponse ParseResponse(string jsonResponse)
{
try
{
return JsonUtility.FromJson (jsonResponse);
}
catch (System.Exception e)
{
Debug.LogError($"JSON解析失败: {e.Message}\n响应内容:{jsonResponse}");
return null;
}
}

// 可序列化数据结构
[System.Serializable]
private class ChatRequest
{
public string model;// 模型名称
public List messages; // 消息列表
public float temperature;// 温度参数
public int max_tokens;// 最大令牌数
}

[System.Serializable]
public class Message
{
public string role;// 角色(system/user/assistant)
public string content;// 消息内容
}

[System.Serializable]
private class DeepSeekResponse
{
public Choice[] choices;// 生成的选择列表
}

[System.Serializable]
private class Choice
{
public Message message;// 生成的消息
}
}

将该脚本挂在场景中的任何一个物体(如主摄像机)上,并给相关参数赋值。

API 设置

API Key:你申请的 API 密钥

Model Name:希望使用的模型。一般情况下用 deepseek-chat 即可,如需深度推理,可使用 deepseek-reasoner。

API Url:

https://api.deepseek.com/v1/chat/completions

对话设置

Temperature:采样温度,介于 0 和 2 之间。更高的值,如 0.8,会使输出更随机,而更低的值,如 0.2,会使其更加集中和确定。可参考官方文档的推荐( https://api-docs.deepseek.com/zh-cn/quick_start/parameter_settings )进行设置,本例中设为 0.7。

Max Tokens:介于 1 到 8192 间的整数,限制一次请求中模型生成 completion 的最大 token 数。输入 token 和输出 token 的总长度受模型的上下文长度的限制。本例中设为 150。

NPC Character

Name:角色姓名,本 例中设为 “Unity-Chan”。

Personality Prompt:性格描述。本例中设为“你是虚拟人物 Unity-Chan,一个性格活泼,聪明可爱的女生,擅长 Unity 和 C# 编程知识。”

第二个脚本是角色互动脚本,它用来显示 AI 生成的回复。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;

public class NPCInteraction : MonoBehaviour
{
//引用和配置
[Header("References")]
[SerializeField] private DeepSeekDialogueManager dialogueManager;//对话管理器
[SerializeField] private InputField inputField;//玩家问题输入框
[SerializeField] private Text dialogueText;//角色回复的文本内容
private string characterName;

[Header("Settings")]
[SerializeField] private float typingSpeed = 0.05f; // 打字机效果的字符显示速度


void Start()
{
characterName = dialogueManager.npcCharacter.name;//角色姓名赋值
//输入框提交后执行的回调函数
inputField.onSubmit.AddListener((text) =>
{
dialogueManager.SendDialogueRequest(text, HandleAIResponse);//发送对话请求到DeepSeek AI
});
}
///

/// 处理AI的响应
///
/// AI的回复内容
/// 请求是否成功
private void HandleAIResponse(string response, bool success)
{
StartCoroutine(TypewriterEffect(success ? characterName +":" + response : characterName +":(通讯中断)"));//启动打字机效果协程
}
///

/// 打字机效果协程
///
/// 角色的回复内容
///
private IEnumerator TypewriterEffect(string text)
{
string currentText = "";//当前显示的文本
foreach (char c in text)//遍历每个字符
{
currentText += c;//添加字符到当前文本
dialogueText.text = currentText;//更新显示文本
yield return new WaitForSeconds(typingSpeed);//等待一定时间
}
}
}

将这个脚本挂在角色模型上,并给参数赋值。

Reference

Dialogue Manager:拖入挂载了对话控制器的物体。

Input Field:拖入提问对话框对应的 InputField 控件。

Dialogue Text:拖入回复对话框对应的 Text 控件。

Settings

Typing Speed:打字机效果的字符显示速度。

Demo 视频

Unity 中文社区持续征集内容投稿,欢迎与 Unity 官方分享你的技术笔记、项目 demo、行业经验、有趣案例,加入社区建设,繁荣内容生态,带领百万 Unity 中文开发者一同学习。

投稿方式:

方式一:在 Unity 中文社区首页(https://developer.unity.cn/)创建个人账号,点击【写文章】,发表文章;

方式二:联系邮箱 learn-cn@unity.cn , 投稿技术内容。

Unity 官方微信

第一时间了解Unity引擎动向,学习进阶开发技能

每一个“点赞”、“在看”,都是我们前进的动力

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
《功夫女足》超越《镖人》夺2026年票房季军,中国影史票房第70名

《功夫女足》超越《镖人》夺2026年票房季军,中国影史票房第70名

动物奇奇怪怪
2026-07-20 01:15:01
他曾是广东省委第一书记,遭免职审查后,仍按副大军区职待遇安置

他曾是广东省委第一书记,遭免职审查后,仍按副大军区职待遇安置

蒋南强读历史
2026-07-20 08:10:12
女人偷吃后晚上跟丈夫同房是什么体验?这位46岁出轨女人说出答案

女人偷吃后晚上跟丈夫同房是什么体验?这位46岁出轨女人说出答案

混音情感
2026-07-20 14:31:45
巴勒斯坦官方社媒祝贺西班牙夺得世界杯,并嘲讽以色列

巴勒斯坦官方社媒祝贺西班牙夺得世界杯,并嘲讽以色列

懂球帝
2026-07-20 10:51:16
中方开门迎贵客,高市早苗提到中国,商务部反手甩出29号公告

中方开门迎贵客,高市早苗提到中国,商务部反手甩出29号公告

古史青云啊
2026-07-20 16:38:20
终于迎来反噬!封号五个月后,曲婉婷再传噩耗,身患癌症无人陪伴

终于迎来反噬!封号五个月后,曲婉婷再传噩耗,身患癌症无人陪伴

深析古今
2026-07-20 16:52:07
雷克萨斯新车!降价8万,2L发动机

雷克萨斯新车!降价8万,2L发动机

手机评测室
2026-07-20 12:05:09
西班牙主教练德拉富恩特点评梅西!

西班牙主教练德拉富恩特点评梅西!

体育哲人
2026-07-19 22:18:20
新冠卷土重来?医生建议:家中常备这5个东西,关键时刻能救命

新冠卷土重来?医生建议:家中常备这5个东西,关键时刻能救命

健康之光
2026-07-16 18:40:07
比导弹便宜万倍!中国 LW30 一出场,无人机当场变废铁

比导弹便宜万倍!中国 LW30 一出场,无人机当场变废铁

小兰聊历史
2026-04-18 14:25:14
宜家集中出售上海、广州、天津、哈尔滨、南通、徐州、贵阳、宁波的8座商场:已全面清空,7家商场今年2月刚关停

宜家集中出售上海、广州、天津、哈尔滨、南通、徐州、贵阳、宁波的8座商场:已全面清空,7家商场今年2月刚关停

鲁中晨报
2026-07-18 15:08:02
西安雁塔区通报“一商场发生人员坠楼”已联合调查组开展调查工作

西安雁塔区通报“一商场发生人员坠楼”已联合调查组开展调查工作

叮当当科技
2026-07-20 14:54:10
卫报:本届世界杯收入或创纪录破150亿美元,最初预估为110亿美元

卫报:本届世界杯收入或创纪录破150亿美元,最初预估为110亿美元

懂球帝
2026-07-19 16:11:18
肺病专家郭亚雄:肺结节不是突然长的,爱长肺结节的人,多半都有这三个共同点!

肺病专家郭亚雄:肺结节不是突然长的,爱长肺结节的人,多半都有这三个共同点!

大明爱养生
2026-07-19 14:30:33
央视一套开播!于和伟等12戏骨领衔现实题材,预定2026黑马

央视一套开播!于和伟等12戏骨领衔现实题材,预定2026黑马

陈意小可爱
2026-07-20 15:57:22
“能不能对员工好点!” 盒马被曝三伏天员工集体在店外“扒盒饭”:体感40℃,官方称调整优化

“能不能对员工好点!” 盒马被曝三伏天员工集体在店外“扒盒饭”:体感40℃,官方称调整优化

新浪财经
2026-07-19 16:07:12
义乌医院顶风引进长沙争议女医生曾琦引争议

义乌医院顶风引进长沙争议女医生曾琦引争议

尘埃里的看客
2026-07-20 12:20:09
吃十只鸽子,不如吃一只它,补足气阴两虚,清热生津,虚火降

吃十只鸽子,不如吃一只它,补足气阴两虚,清热生津,虚火降

白米饭怎么吃
2026-07-20 07:32:52
智商3岁“天才指挥家”舟舟,繁华逝去,谎言过后又是怎样的人生

智商3岁“天才指挥家”舟舟,繁华逝去,谎言过后又是怎样的人生

感恩每一刻
2026-07-17 03:54:55
真没想到,53岁的郑秀文公开说,自己连胸围都要换新的了

真没想到,53岁的郑秀文公开说,自己连胸围都要换新的了

动物奇奇怪怪
2026-07-20 16:47:36
2026-07-20 17:43:00
Unity incentive-icons
Unity
Unity中国官方帐户
2488文章数 6735关注度
往期回顾 全部

科技要闻

中兴阶跃荣耀齐出手,AI手机争夺系统入口

头条要闻

谢贤遗产超1亿港元 九成留给张柏芝和谢霆锋两个儿子

头条要闻

谢贤遗产超1亿港元 九成留给张柏芝和谢霆锋两个儿子

体育要闻

65岁肌肉男,世界杯最年长冠军主帅

娱乐要闻

谢霆锋发文确认父亲谢贤去世 享年89岁

财经要闻

AI开始挤泡沫

汽车要闻

无线控不旗舰 谁说的?

态度原创

教育
艺术
数码
时尚
本地

教育要闻

锚定特色办学 赋能创新培育——2026普通高中多样化特色发展研讨会深度观察

艺术要闻

敦煌发现王羲之最早法帖,比圣教序早300年

数码要闻

日本推出“人体冰箱”:5分钟快速降温 售价约150万日元

看来看去夏天还是穿T恤最合适,不用买太贵,舒适百搭又经典

本地新闻

2026暑期旅行新灵感:跟着影视去旅行

无障碍浏览 进入关怀版