Unity集成GPT
GPT想必是最近互联网最火的话题了,作为一个Unity开发者,今天来介绍一下如何在Unity中使用GPT。
一、API 密钥
使用GPT的API首先要获得密钥,如下进入OpenAI官网(https://platform.openai.com/account/api-keys)–>选择自己的账号–>查看API密钥,然后创建一个自己的密钥(创建的后要记得复制好密钥)。

二、GPT模型
进入OpenAI文档(https://platform.openai.com/docs/models)页面可以看到目前主要可以使用的AI模型,如下从GPT3.0到GPT4.0。

目前可以免费使用的最高版本就是GPT-3.5,所以这里主要来介绍一下如何集成 gpt-3.5-turbo。
三、gpt-3.5-turbo 集成

进入API文档(https://platform.openai.com/docs/api-reference/chat/create)选择Chat,就是gpt-3.5-turbo的使用文档。
OpenAI的接口访问主要都是使用Post请求,这里gpt-3.5-turbo的Post地址是:
https://api.openai.com/v1/chat/completions
请求与回调内容都是Json。
发送请求格式Request:
{"model": "gpt-3.5-turbo","messages": [{"role": "user", "content": "Hello!"}]
}
回调相应格式Respond:
{"id": "chatcmpl-123","object": "chat.completion","created": 1677652288,"choices": [{"index": 0,"message": {"role": "assistant","content": "\n\nHello there, how may I assist you today?",},"finish_reason": "stop"}],"usage": {"prompt_tokens": 9,"completion_tokens": 12,"total_tokens": 21}
}
在Unity中则可以直接使用UnityWebRequest来实现Post请求:
UnityWebRequest request = new UnityWebRequest(m_ApiUrl, "POST")
m_ApiUrl就是前面的Post地址。
在发送的信息中"model"就是使用示例中的"gpt-3.5-turbo",这是最新的可以免费使用的AI模型。
发送的消息"messages"中每个message都包含一个"role"(角色)和一个"content"(角色对于的内容)。
"role"可以选择 “system”, “user”, 或 “assistant”:
- "system"一般作为角色设定,比如NPC扮演的话可以设定NPC的身份、特点等;
- "user"就是用户角色;
- "assistant"就是AI的角色身份。
这里可能会好奇,为什么我们向GPT请求要发送AI角色的内容,其实这里我们主要是把上一次的提问和AI的回答都传回去,这样GPT就相当于有了记忆,知道我们前面对话说了啥,因此对话就不会是一个个孤立的问答了,官方的ChatGPT聊天同样是使用了这个原理。
这里给上完整的gpt-3.5-turbo示例请求代码
public class GptTurboScript : MonoBehaviour
{/// <summary>/// api地址/// </summary>public string m_ApiUrl = "https://api.openai.com/v1/chat/completions";/// <summary>/// gpt-3.5-turbo/// </summary>public string m_gptModel = "gpt-3.5-turbo";/// <summary>/// 缓存对话/// </summary>[SerializeField]public List<SendData> m_DataList = new List<SendData>();/// <summary>/// AI人设/// </summary>public string Prompt;private void Start(){//运行时,添加人设m_DataList.Add(new SendData("system", Prompt));}public /// <summary>/// 调用接口/// </summary>/// <param name="_postWord">发送的消息</param>/// <param name="_openAI_Key">密钥</param>/// <param name="_callback">GPT的回调</param>/// <returns></returns>IEnumerator GetPostData(string _postWord,string _openAI_Key, System.Action<string> _callback){//缓存发送的信息列表m_DataList.Add(new SendData("user", _postWord));using (UnityWebRequest request = new UnityWebRequest(m_ApiUrl, "POST")){PostData _postData = new PostData{model = m_gptModel,messages = m_DataList};string _jsonText = JsonUtility.ToJson(_postData);byte[] data = System.Text.Encoding.UTF8.GetBytes(_jsonText);request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();request.SetRequestHeader("Content-Type", "application/json");request.SetRequestHeader("Authorization", string.Format("Bearer {0}", _openAI_Key));yield return request.SendWebRequest();if (request.responseCode == 200){string _msg = request.downloadHandler.text;MessageBack _textback = JsonUtility.FromJson<MessageBack>(_msg);if (_textback != null && _textback.choices.Count > 0){string _backMsg = _textback.choices[0].message.content;//添加记录m_DataList.Add(new SendData("assistant", _backMsg));_callback(_backMsg);}}}}#region 数据包[Serializable]public class PostData{public string model;public List<SendData> messages;}[Serializable]public class SendData{public string role;public string content;public SendData() { }public SendData(string _role,string _content) {role = _role;content = _content;}}[Serializable]public class MessageBack{public string id;public string created;public string model;public List<MessageBody> choices;}[Serializable]public class MessageBody{public Message message;public string finish_reason;public string index;}[Serializable]public class Message{public string role;public string content;}#endregion
}
使用只需要调用GetPostData这个方法,传入你要发送的消息和你的API密钥,然后在_callback回调中获取到GPT返回的信息就可以了。
四、GPT绘画

和gpt-3.5-turbo类似,画图的Post接口为:
https://api.openai.com/v1/images/generations
发送请求格式Request:
{"prompt": "A cute baby sea otter","n": 2,"size": "1024x1024"
}
"prompt"为要绘制的图片描述;"n"为绘制数量;"size"为图片大小。
回调相应格式Respond:
{"created": 1589478378,"data": [{"url": "https://..."},{"url": "https://..."}]
}
返回的"url"就是图片的路径地址。
同样赋上完整的请求代码:
public class GPTImage : MonoBehaviour
{//API key[SerializeField] private string m_OpenAI_Key = "填写你的Key";/// <summary>/// api地址/// </summary>public const string m_ApiUrl = "https://api.openai.com/v1/images/generations";/// <summary>/// 调用接口/// </summary>/// <param name="_postWord"></param>/// <param name="_openAI_Key"></param>/// <param name="_callback"></param>/// <returns></returns>public IEnumerator GetPostData(string _postWord, Action<List<string>> _callback){using (UnityWebRequest request = new UnityWebRequest(m_ApiUrl, "POST")){PostData _postData = new PostData(_postWord, 10, "512x512");string _jsonText = JsonUtility.ToJson(_postData);byte[] data = System.Text.Encoding.UTF8.GetBytes(_jsonText);request.uploadHandler = (UploadHandler)new UploadHandlerRaw(data);request.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();request.SetRequestHeader("Content-Type", "application/json");request.SetRequestHeader("Authorization", string.Format("Bearer {0}", m_OpenAI_Key));yield return request.SendWebRequest();if (request.responseCode == 200){string _msg = request.downloadHandler.text;MessageBack _textback = JsonUtility.FromJson<MessageBack>(_msg);if (_textback != null && _textback.data.Count > 0){List<string> urlList= new List<string>();for (int i = 0; i < _textback.data.Count; i++){Debug.Log(_textback.data[i].url); //图片路径urlList.Add(_textback.data[i].url);}_callback(urlList);}}}}#region 数据包[Serializable]public class PostData{public string prompt;public int n;public string size;public PostData(string _prompt, int _n, string _size){prompt = _prompt;n = _n;size = _size;}}[Serializable]public class MessageBack{public string created;public List<Data> data;}[Serializable]public class Data{public string url;}#endregion
}
五、AICommand
AICommand是一位日本的开发者keijiro通过使用gpt-3.5-turbo来实现命令操控Unity,比如输入:创建物体、创建灯光、添加组件、改变颜色等。但这些命令使用英语才比较准确,通过下载源码(https://github.com/keijiro/AICommand)研究后,把发送给GPT的前置提示改成中文后就能比较好的识别中文命令了。

static string WrapPrompt(string input)=> "Write a Unity Editor script.\n" +" - It provides its functionality as a menu item placed \"Edit\" > \"Do Task\".\n" +" - It doesn’t provide any editor window. It immediately does the task when the menu item is invoked.\n" +" - Don’t use GameObject.FindGameObjectsWithTag.\n" +" - There is no selected object. Find game objects manually.\n" +" - I only need the script body. Don’t add any explanation.\n" +"The task is described as follows:\n" + input;
如上,"input"为我们要输入的命令,前面部分为对命令的一些解释要求,其主要逻辑是让GPT先生成一个Editor模式下运行的脚本,脚本里面来实现我们描述的功能,比如“创建10个立方体”,当执行完这个脚本的功能后再把脚本删除,这样在感观上就像GPT能在Unity做一些操作。
在使用过程中遇到一些问题:
1.GPT给的脚本中时常给你一些使用提示,而我们需要的是存脚本才能正常运行,所以就需要在前置描述里面特别强调我们只需要纯代码文本。
2.因描述不准确、理解偏差或功能复杂等情况导致GPT生成的脚本并不能正常运行,其实这个目前并不好解决,AICommand能实现的也是一些简单基础的操作,但可以通过一些人为的操作,让GPT半自动的来实现一些更复杂的工作,比如可以让GPT在Unity生成脚本后我们在去挂载或修改脚本,这样加上人的操作虽然感觉不是那么智能,但也能提高很多效率。目前Unity商店中就有人做了一款类似的插件。
六、总结
目前GPT在Unity的应用虽还不能很高的智能化,但可以使用他生产代码、修改代码、以及给出一些优化、设计建议等,从而很大程度的提升我们的工作效率。
相关文章:
Unity集成GPT
GPT想必是最近互联网最火的话题了,作为一个Unity开发者,今天来介绍一下如何在Unity中使用GPT。 一、API 密钥 使用GPT的API首先要获得密钥,如下进入OpenAI官网(https://platform.openai.com/account/api-keys)–>选择自己的账号–>查…...
Xilinx FPGA Multiboot设计与实现(Spartan-6和Kintex-7为例)
文章目录 1. FPGA固件升级方案2. Golden镜像和Multiboot镜像简介3. ISE环境下实现(XC6SLX9)4. Vivado环境下实现(XC7K325T)5. Golden镜像Header分析6. 参考资料7. 示例工程ISE、Vivado、MicroBlaze系列教程 1. FPGA固件升级方案 FPGA的硬件可编程性给设计带来了很高的灵活…...
14、SpringMVC执行流程
文章目录14、SpringMVC执行流程14.1、SpringMVC常用组件1 DispatcherServlet(前端控制器)2 HandlerMapping(处理器映射器)3 Handler(处理器)4 HandlerAdapter(处理器适配器)5 ViewRe…...
2步搞定拼版!AD通用拼版技巧分享!
你是不是也看过很多拼版教程,一整篇文章全部都是文字说明和各种图示,照着一步步去做,都需要一些时间才能勉强搞定。 之前我用过AD20的自带拼版工具,功能上比较简单,而且菜单没有全部汉化,对于新手来说&…...
再学C语言47:字符串输出
C中有3个用于输出字符串的标准库函数:puts(),fputs(),printf() 一、puts()函数 示例代码: /* test of puts() function */ #include <stdio.h>#define ARR_T "I am an array."int main(void) {char str1[100] …...
银行数字化转型导师坚鹏:如何制定银行数字化转型年度培训规划
如何制定银行数字化转型年度培训规划 ——以推动银行数字化转型战略落地为核心,实现知行果合一课程背景: 很多银行都在开展银行数字化转型培训工作,目前存在以下问题急需解决:缺少针对性的银行数字化转型年度培训规划不清楚如…...
RFID技术在物流行业中的应用:优化物流流程,提高效率
随着物流行业的不断发展,如何优化物流流程、提高效率成为了每个物流从业者关注的重点。RFID技术作为一种先进的自动识别技术,正逐渐被广泛应用于物流行业,帮助企业降低成本、提高运营效率。本文将重点介绍RFID技术在物流行业中的应用…...
安卓机器学习框架学习:Android Neural Networks API (NNAPI)
Android Neural Networks API (NNAPI) 简介: 1、Android Neural Networks API (NNAPI) 是一个 Android C API,在 Android 设备上实现机器学习; 2、NNAPI 旨在为更高层级的机器学习框架(如 TensorFlow Lite 和 Caffe2)…...
阿里云GPU服务器收费标准、学生价格及一个小时费用大全
阿里云GPU租用费用价格表,GPU计算卡包括NVIDIA V100计算卡、T4计算卡、A10计算卡和A100计算卡,GPU云服务器gn6i可享受3折优惠,阿里云百科分享阿里云GPU服务器学生优惠价格、GPU服务器收费价格表、GPU服务器多少钱一个小时等费用明细表&#x…...
Asp.net core 依赖注入 (带案例以及注释理解)
1.很多朋友不知道什么是依赖注入,接下来我用比较通俗易懂的话语 来帮助大家理解 依赖注入(Dependency Injection,简称DI)是一种设计模式,用于减少组件之间的耦合度。它的核心思想是,将组件之间的依赖关系从…...
【微信小程序】-- uni-app 项目-- 购物车 -- 首页 - 轮播图效果(五十二)
💌 所属专栏:【微信小程序开发教程】 😀 作 者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! &…...
GO实现Redis:GO实现Redis集群(5)
采用一致性hash算法将key分散到不同的节点,客户端可以连接到集群中任意一个节点https://github.com/csgopher/go-redis本文涉及以下文件: consistenthash:实现添加和选择节点方法 standalone_database:单机database client&#x…...
高阶数据结构之 B树 B+树 B*树
文章目录B树B树节点的设计插入key的过程B树的验证B树的性能分析B树和B*树B树B*树总结B树、B树、B*树B树的应用做索引MySQL索引MyISAMInnoDBB树 在前面几章中我们介绍了AVL树和红黑树,简单复习一下,我们说到原本的二叉搜索树会存在缺陷(不能保…...
CSS3之动画属性
系列文章目录 前端系列文章——传送门 CSS系列文章——传送门 文章目录系列文章目录CSS3 中的动画第一步:定义一个动画第二步:执行这个动画第三步:暂停或启动这个动画过渡和动画的区别CSS3 中的动画 CSS3 动画是使元素从一种样式逐渐变化为…...
python --Matplotlib详解
安装 pip install matplotlib导包 import matplotlib.pyplot as plt绘制散点图 如果输入的是两个列表,一个表示 x 轴的值,一个表示 y 轴的值,那么就可以在直角坐标系中划出很多个点,然后将这些点用指定的线段连接起来就得到了散…...
手机(Android)刷NetHunter安装指南,无需ssh执行kali命令, NetHunter支持的无线网卡列表!
一、安装NetHunter 前提:确保手机已经root,已装上magisk。如果没有root,可用尝试magisk root 后执行此文 1、下载Nethunter:Get Kali | Kali Linux 然后push 到sdcard 里, 2、打开magisk,选择刚刚下好的…...
教育行业ChatGPT的新挑战
随着科技不断发展,AI的水平越来越高,尤其是最近火出圈的ChatGPT不仅仅可以与人类对话,而且还可以为人们提供关于各种信息帮助。 作为一个先进的“聊天”AI,无论是正苦恼,还是只是需要一些关于如何更有效地管理时间的建…...
内存泄漏 定位方法
目录 内存概念 物理内存 虚拟内存 内存泄漏 定位方法和手段 1.MemInFo MemTotal MemFree MemAvailable Cached 2 vmalloc info 3.Kmemleak 算法原理 使用方法 参考文献与链接: 如果你点进这篇文章,那么要么你是一个C\C程序员,…...
es-head插件插入查询以及条件查询(五)
es-head插件插入查询以及条件查询 1.es-head插件页面介绍 页面详细介绍 2.es-head查询语句 2.1.查询索引中的全部数据 curl命令交互,采用GET请求 语法格式: curl -XGET es地址:9200/索引名/_search?pretty [rootelaticsearch ~]# curl -XGET 192…...
安装python教程并解决Python安装完没有Scripts文件夹问题
安装python教程 并解决Python安装完没有Scripts文件夹问题 ** 一背景 **首先要了解这个出现的原因是下载安装的版本问题 系統是32 bit 的版本还是 64bit 的 web-based: 透过网络安装的,就是执行安装后才透过网络下载python executable: 可執行文件的ÿ…...
粒子物理实验中的异构计算与AI技术应用
1. 粒子物理实验的计算挑战与机遇 粒子物理实验正经历前所未有的数据爆炸时代。以大型强子对撞机(HL-LHC)为例,其升级后的数据采集率将达到每秒数PB级别,这相当于每天产生约1亿张高清照片的数据量。传统基于CPU的串行计算架构已无…...
量子计算中的辛基理论与MBQC实现
1. 量子计算中的辛基基础概念在量子计算领域,辛基(Symplectic Basis)是描述多量子比特系统的重要数学工具。它本质上是一个满足特定对易关系的基组,能够简洁地表示量子态和量子操作。理解辛基需要从有限域上的向量空间开始——具体…...
为什么顶尖社会学期刊编辑开始拒收未使用AI辅助验证的民族志推论?(NotebookLM可复现性协议首曝)
更多请点击: https://intelliparadigm.com 第一章:NotebookLM社会学研究辅助 面向质性研究的语义增强工作流 NotebookLM 是 Google 推出的基于用户上传文档进行“可信引用”的 AI 助手,特别适用于社会学研究中对访谈转录稿、田野笔记、政策…...
自建轻量级Web监控信标:前端性能与错误数据采集实践
1. 项目概述:一个轻量级、可扩展的Web应用监控信标最近在梳理个人项目和团队内部工具链时,我重新审视了一个名为“beacon”的小工具。这个项目源自一个非常具体的痛点:在开发和运维Web应用时,我们常常需要一种简单、无侵入的方式来…...
紫光Pango EDA工具链实战:从License申请到Synplify避坑,一个FPGA工程师的踩坑笔记
紫光Pango EDA工具链实战:从License申请到Synplify避坑指南 第一次接触紫光Pango工具链时,我像大多数FPGA工程师一样,以为这不过是又一个需要熟悉的开发环境。直到在项目deadline前三天,Synplify突然报出"exit code 4"错…...
为防数据泄露!教你拆除2024款RAV4混动汽车调制解调器和GPS
拆除2024款RAV4混动汽车调制解调器和GPS,从源头上阻止数据传输!现代汽车就像装在轮子上的电脑,配备众多传感器,会回传位置、速度等遥测数据。其车内和车外摄像头、麦克风及调制解调器默认开启,且难关闭,数据…...
普通人 0 基础能转网安吗?转行路径全面拆解,告诉你到底值不值得
前言 最近在后台有看到很多朋友问我关于网络安全转行的问题,今天做了一些总结,其中最多的是,觉得目前的工作活多钱少、不稳定、一眼望到头,还有一些就是目前工作稳定但是缺乏上升空间的。总的来说,大家主要的问题是&a…...
AMD处理器硬件深度调试终极方案:SMUDebugTool完全实战手册
AMD处理器硬件深度调试终极方案:SMUDebugTool完全实战手册 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:…...
电源扰动测试与功率分析仪应用实践
1. 电源扰动测试的核心价值与行业需求在电力电子产品的研发验证阶段,电源扰动测试是评估设备可靠性的关键环节。我曾在某工业电源模块项目中,因忽视电源扰动测试导致产品在东南亚市场出现大规模故障——当地电网电压频繁跌落至170V,使得我们的…...
终极指南:Seal中Kotlin协程上下文组合的实用技巧
终极指南:Seal中Kotlin协程上下文组合的实用技巧 【免费下载链接】Seal 🦭 Video/Audio Downloader for Android, based on yt-dlp 项目地址: https://gitcode.com/gh_mirrors/se/Seal Seal是一款基于yt-dlp的Android音视频下载器,在其…...
