RHK《Unity接入DeepSeek问答》

Unity接入DeepSeek需要在DeepSeek开放平台注册一个账号并且创建一个密钥API keys

Unity开放平台链接 : https://platform.deepseek.com/

注册一个账号并登录成功后会显示 API keys

接入DeepSeek创建密钥之前需要 充值流量(10元即可)

然后点击 API keys 再点击 创建 API key 即可

这里密钥只会显示一次要记得复制,下次只会显示部分隐藏版的Key 后续在Unity接入DeepSeek需要这个API key

有了 DeepSeek的密钥之后 在Unity中创建一个项目

创建一个铺满的黑色底板Image

创建输入文本框input Field

调试尺寸

创建按钮Button

调试尺寸

创建滚动器 Scroll View

调整尺寸

设置锚点

设置移动类型

删除掉水平条

重新设置 垂直条布局

关键点:设置 Content高度 必须要大于 Viewport高度 才能滑动

在Context下创建Text文本

设置Text文本 设置文字颜色

设置 滑动器 Image透明度为0

创建脚本:DeepSeekDialogManager.cs

cs 复制代码
using Pico.Platform;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using UnityEngine;
using UnityEngine.Networking;

public class DeepSeekDialogManager : MonoBehaviour
{
    //DeepSeek API配置
    private const string API_URL = "https://api.deepseek.com/v1/chat/completions";
    [SerializeField] private string apiKey = "自己的DeepSeek APIkey";
    [SerializeField] private string model = "deepseek-chat";

    //角色 特性要求
    [TextArea(3, 10)]
    [SerializeField] private string systemPrompt = "游戏方面";

    // 对话历史
    private List<ChatMessage> messageHistory = new List<ChatMessage>();

    // 消息结构
    [Serializable]
    private class ChatMessage
    {
        public string role;
        public string content;

        public ChatMessage(string role, string content)
        {
            this.role = role;
            this.content = content;
        }
    }

    // API请求结构
    [Serializable]
    private class ApiRequest
    {
        public string model;
        public List<ChatMessage> messages;
        public float temperature = 0.7f;

        public ApiRequest(string model,List<ChatMessage> messages)
        {
            this.model = model;
            this.messages = messages;
        }
    }

    //API响应结构
    [Serializable]
    private class ApiResponse
    { 
        public List<Choice> choices;

        [Serializable]
        public class  Choice
        {
            public Message message;

            [Serializable]
            public class Message
            {
                public string role;
                public string content;
            }
        }
    }
    private void Awake()
    {
        InitializeWithSystemPrompt();
    }

    private void InitializeWithSystemPrompt()
    { 
        messageHistory.Clear();
        if (!string.IsNullOrEmpty(systemPrompt))
        {
            messageHistory.Add(new ChatMessage("system", systemPrompt));
            Debug.Log("已设置AI角色: " + systemPrompt);
        }
    }
    //发送消息到DeepSeek并获取响应
    public IEnumerator SendMessageToAI(string userMessage, Action<string> onResponse, Action<string> onError)
    {
        //添加用户消息到历史
        messageHistory.Add(new ChatMessage("user", userMessage));

        //构建API请求
        ApiRequest request = new ApiRequest(model, messageHistory);
        string json = JsonUtility.ToJson(request);
        byte[] bodyRaw = Encoding.UTF8.GetBytes(json);

        //创建网络请求
        using (UnityWebRequest www = UnityWebRequest.PostWwwForm(API_URL, ""))
        {
            www.uploadHandler = new UploadHandlerRaw(bodyRaw);
            www.downloadHandler = new DownloadHandlerBuffer();
            www.SetRequestHeader("Content-Type", "application/json");
            www.SetRequestHeader("Authorization", "Bearer " + apiKey);

            //发送请求
            yield return www.SendWebRequest();

            if (www.result == UnityWebRequest.Result.Success)
            {
                //解析响应
                ApiResponse response = JsonUtility.FromJson<ApiResponse>(www.downloadHandler.text);
                if (response != null && response.choices.Count > 0)
                {
                    string aiMessage = response.choices[0].message.content;
                    messageHistory.Add(new ChatMessage("assistant", aiMessage));
                    onResponse?.Invoke(aiMessage);
                }
                else
                {
                    onError?.Invoke("响应解析失败: " + www.downloadHandler.text);
                }
            }
            else 
            {
                onError?.Invoke("网络错误: " + www.error);
            }
        }
    }

    // 清空对话历史
    public void ClearHistory()
    { 
        messageHistory.Clear();
    }
}

再创建脚本:DialogUIController.cs

cs 复制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class DialogUIController : MonoBehaviour
{
    [SerializeField] private DeepSeekDialogManager dialogManager;
    [SerializeField] private InputField userInputField;
    [SerializeField] private Text aiResponseText;
    [SerializeField] private Button sendButton;

    private void Start()
    {
        sendButton.onClick.AddListener(SendUserMessage);
        userInputField.onEndEdit.AddListener(HandleEndEdit);
    }

    private void SendUserMessage()
    {
        string userMessage = userInputField.text.Trim();
        if (string.IsNullOrEmpty(userMessage)) return;

        //显示加载状态
        aiResponseText.text = "思考中...";

        //发送消息到AI
        StartCoroutine(dialogManager.SendMessageToAI(userMessage,
            (response) => { aiResponseText.text = response; },
            (error) => { aiResponseText.text = "错误: " + error; }));

        //清空输入框
        userInputField.text = "";
    }

    private void HandleEndEdit(string inputText)
    {
        if (string.IsNullOrWhiteSpace(inputText)) return;
        SendUserMessage();
    }
}

然后在DeepSeekDialogManager.cs脚本中 将自己的DeepSeek创建的密钥API key 粘贴到下处

将这两个代码在Unity中绑定

输入相关问题 点击发送按钮

可以垂直下拉

并且有记忆功能

End.

相关推荐
小李也疯狂21 小时前
Unity 中的立方体贴图(Cubemaps)
unity·游戏引擎·贴图·cubemap
牛掰是怎么形成的21 小时前
Unity材质贴图引用陷阱:包体暴涨真相
unity·材质·贴图
呆呆敲代码的小Y21 小时前
【Unity工具篇】| 超实用工具LuBan,快速上手使用
游戏·unity·游戏引擎·unity插件·luban·免费游戏·游戏配置表
EQ-雪梨蛋花汤21 小时前
【Unity优化】Unity多场景加载优化与资源释放完整指南:解决Additive加载卡顿、预热、卸载与内存释放问题
unity·游戏引擎
我的offer在哪里21 小时前
用 Unity 从 0 做一个「可以玩的」游戏,需要哪些步骤和流程
游戏·unity·游戏引擎
泡泡茶壶ᐇ1 天前
Unity游戏开发入门指南:从零开始理解游戏引擎核心概念
unity·游戏引擎
YigAin1 天前
Unity中的Lock,到底在锁什么,什么时候该用?
unity
Var_al1 天前
抖小Unity WebGL分包命令行工具实践指南
unity·游戏引擎·webgl
天人合一peng1 天前
unity 通过代码修改button及其名字字体的属性
unity·游戏引擎
GLDbalala1 天前
Unity基于自定义管线实现经典经验光照模型
unity·游戏引擎