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: 可執行文件的ÿ…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

Linux 文件类型,目录与路径,文件与目录管理
文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

企业大模型服务合规指南:深度解析备案与登记制度
伴随AI技术的爆炸式发展,尤其是大模型(LLM)在各行各业的深度应用和整合,企业利用AI技术提升效率、创新服务的步伐不断加快。无论是像DeepSeek这样的前沿技术提供者,还是积极拥抱AI转型的传统企业,在面向公众…...