Unity接入ChatGPT基于Python.Runtime的实现

article/2025/4/21 12:23:32

目录

前言

编译Python.Runtime.dll

Unity接入ChatGPT

1.第一步 准备环境

2.第二步 python代码的书写

3.第三步 C#调用python代码


前言:

相信各位游戏人都用过ChatGPT吧,那么怎么在unity里接入ChatGPT呢?本文章会通过一种极其简单的方式来实现,最终效果如下:

  1. 可以进行中文对话,可以记住一点的上下文(实际上几乎记不住任何上下文,可能是free版本的限制吧,等拿到万事达卡再试试plus版本的)
  2. 可调节的准确率(诚恳度越低准确度越高,但是更冷漠),Ai说话时的“温度”
  3. 简单的python和c#交互

好的,下面开始教程:

编译Python.Runtime.dll

看标题可知,这是基于Python.Runtime的,所以首先要拿到这个.dll文件

github地址
GitHub - pythonnet/pythonnet: Python for .NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and provides a powerful application scripting tool for .NET developers.Python for .NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and provides a powerful application scripting tool for .NET developers. - GitHub - pythonnet/pythonnet: Python for .NET is a package that gives Python programmers nearly seamless integration with the .NET Common Language Runtime (CLR) and provides a powerful application scripting tool for .NET developers.https://github.com/pythonnet/pythonnet

在GitHub上clone 下来的文件需要编译成dll文件,建议使用vs进行编译,下面是教程

用vs打开解决方案(根目录下的pythonnet.sln)

 

 在python.runtime项目上右键打开属性

  1. 将目标平台设置为x64
  2. 选择一个基路径,这个路径是你在编译好的dll文件的存放路径,是相对根目录而言的,我的就在这里面了,大家编译完成后直接在根目录里面找就好了
  3. 哦,忘记了,输出类型选择类库

 然后再次右键选择生成

 等待编译完成后即可在设置的基目录下看到这个dll文件

 然后把这个dll文件拖到unity里

 好了,准备工作已经完成,现在开始正式在Unity里接入ChatGPT!!!

Unity接入ChatGPT

首先要获取openai的api的使用权限,所以我们要有key才行

在openai的官网可以获取:key在这里弄

弄好key一定要复制好,保存好,因为一旦获取了之后,key就永久隐藏了。如果丢失了就只能再获取一次(虽然不麻烦,但是耗money呀)

ok废话介绍完毕,开始撸码,注意哦,教程是循循渐进的,代码都不是完整的,如果只想copy可以直接跳到底部复制完整代码自己看。

1.第一步 准备环境

首先引入using Python.Runtime的命名空间,设置好时间间隔,建议为20s,为啥,我也不知道,官网说的...

再就是要告诉这个插件python解释器的dll文件路径,这个很好弄,在官网上下载好python就直接能看到这个dll,还有环境变量别忘记配置了,有的大佬可能懒得登录,但是又想复制,所以我直接贴出来代码,hh

using System.IO;
using Python.Runtime;
using UnityEngine;public class PythonManager : MonoBehaviour
{// Start is called before the first frame update[SerializeField] public float _timer;private float _interval = 20;void Start(){_timer = _interval;// 获取python.all的路径(调用python解释器来执行python代码)string pythonPath = @"C:\Python311"; string dllPath = Path.Combine(pythonPath, "python311.dll");Runtime.PythonDLL = dllPath;}
}
using System.IO;
using Python.Runtime;
using UnityEngine;public class PythonManager : MonoBehaviour
{// Start is called before the first frame update[SerializeField] public float _timer;private float _interval = 20;void Start(){_timer = _interval;// 获取python.all的路径(调用python解释器来执行python代码)string pythonPath = @"C:\Python311"; string dllPath = Path.Combine(pythonPath, "python311.dll");Runtime.PythonDLL = dllPath;}
}

2.第二步 python代码的书写

这里我先说一下我的实现思路,免得大家看不懂。

我没有使用文件读取的方式来提交prompt和获取gpt回答的内容,因为我很菜,hhh,用python调用resources里的文件实在是麻烦透顶,研究了一会就放弃了,当然也可以使用绝对路径的方式来用,但是这样一打包就彻底废了,因为路径全乱了,所以干脆放弃使用文件读取的方式。然后怎么办呢???突然我想到了一个极其极其的野路子,哈哈哈哈,就是用游戏物体的名字来当临时储存“文件”,这样就方便多了,而且还不用开线程去读文件,性能也高了不少,哈哈哈哈哈快夸我。

其实呢。。。我这个文章的缺陷也很多,就是应该只能在pc上运行,我用安卓测试的时候会闪退,应该和python解释器的调用有关系,没有去研究....要是有大佬知道怎么解决的话欢迎提供解决方案哈,嘻嘻嘻嘻。

然后这是python代码的部分(纯享版,没有注释)

import UnityEngine as ue
import openai
import random
objects = ue.Object.FindObjectsOfType(ue.GameObject)
duiBaQis = []
for obj in objects:if obj.tag == 'duiBaQi':duiBaQis.append(obj)
openai.api_key = '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'
model_engine = 'gpt-3.5-turbo' 
prompt = 'hello'
temperature = random.uniform(0.1,2)
for o in duiBaQis:if('@temperature:' in o.name):temperatureStr = format(temperature,'.2f')o.name = '@temperature:' + temperatureStr;
max_tokens = 255
for o in duiBaQis:if('@prompt:' in o.name):promptText = o.name.replace('@prompt:','');prompt = promptText
completion = openai.ChatCompletion.create(model='gpt-3.5-turbo',messages=[{'role': 'user', 'content': prompt}],temperature = temperature,max_tokens = max_tokens
)
print(completion.choices[0].message.content)
for o in duiBaQis:if('@ai:' in o.name):o.name = '@ai:'+ completion.choices[0].message.content;
import UnityEngine as ue
import openai
import random
objects = ue.Object.FindObjectsOfType(ue.GameObject)
duiBaQis = []#这个数组是储存所有含有duibaqi标签的游戏物体,为了加快查找速度用的,当然要是大家熟悉python的话,应该可以使用一个全局管理器来管理每一个用到的游戏物体,这样就只需要查找一遍就行了(思路就是定义几个bool值,查找完毕后设置为false,检测到false就跳过for in 循环),但是我不太会用python,hhh,没有学过...所以就放弃了,大家完全可以不比这样做
for obj in objects:if obj.tag == 'duiBaQi':duiBaQis.append(obj)#将这三个游戏物体推进这里面,哪怕是提高一丢丢的效率也是好的...
openai.api_key = '这里填在官网拿到的key'#这里是在官网得到的key
model_engine = 'gpt-3.5-turbo' #在这里选择gpt的模型,因为不同模型的使用方法有点不同,所以这里最好和我一样,等这个实现了以后大家再去琢磨别的。
prompt = 'hello'#这里是prompt,就是大家在用ChatGPT的时候给问他的那些问题
temperature = random.uniform(0.1,2)#这里就是可调节“温度”了,也就是gpt的语气
for o in duiBaQis:#查找temperature物体if('@temperature:' in o.name):temperatureStr = format(temperature,'.2f')o.name = '@temperature:' + temperatureStr;
max_tokens = 255#这个是gpt回答内容的最大字符,因为我们用的是游戏物体的名字来存储这个数据,但是在unity里游戏物体的名字最多也就能存255个字符,所以....就这样咯。
for o in duiBaQis:#查找prompt物体if('@prompt:' in o.name):promptText = o.name.replace('@prompt:','');#需要把"@prompt:"这个字符串替换掉才能作为prompt使用,不要忘记了,不然的话prompt都成啥了,笑死。prompt = promptText
#最核心的代码,调用openai提供的api,将我们设置好的model,prompt,temperature,max_tokens参数严格按照官方文档给出的格式填入,然后用completion接受返回结果。返回的是一个对象,结构比较复杂,包含很多细节,大家有兴趣可以打印出来看看,这里我们只需要使用choices[0].message.content这个数据即可。
completion = openai.ChatCompletion.create(model='gpt-3.5-turbo',messages=[{'role': 'user', 'content': prompt}],temperature = temperature,max_tokens = max_tokens
)
print(completion.choices[0].message.content)
for o in duiBaQis:#查找ai物体if('@ai:' in o.name):o.name = '@ai:'+ completion.choices[0].message.content;#直接更改ai物体的名字为gpt回答的内容,注意前缀不要忘记加上"@ai:",因为我们不是只用一次,不要卸磨杀驴了,hhh

 代码讲解我都放在注释里面了,大家可以对照着代码一起看,我觉得还是蛮清晰的,哈哈。

 好了,python代码的部分就是这么多,还是挺简单的,下面是用c#来调用python的部分

3.第三步 C#调用python代码

string code = @"那一坨python代码"
PythonEngine.Initialize();
using (Py.GIL())
{PythonEngine.Exec(code);
}
        string code = @"那一坨python代码"PythonEngine.Initialize();using (Py.GIL()){PythonEngine.Exec(code);}

code就是刚才写的那一坨python代码 ,注意@不要忘记写了哈,不然就没法缩进。

就这么简单?对!就这么简单,哈哈哈哈。

没了,完了,调用成功了,接入完成了,哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈哈。(博主已疯)

至于怎么gpt和游戏进行交互,怎么弄出好玩的效果,就靠各位大佬就自己发挥想象力吧~。

下面贴上我自己的代码给大家,这部分我就放在code里面了,就不贴出来凑字数了,hhh。

这是PythonManager.cs文件

using System.IO;
using Python.Runtime;
using UnityEngine;public class PythonManager : MonoBehaviour
{[SerializeField] public float _timer;private float _interval = 20;void Start(){_timer = _interval;// 获取python.all的路径(调用python解释器来执行python代码)string pythonPath = @"C:\Python311"; string dllPath = Path.Combine(pythonPath, "python311.dll");Runtime.PythonDLL = dllPath;}void Update(){_timer += Time.deltaTime;UIManager.Instance.timer.fillAmount = _timer / _interval;if (_timer < _interval) return;//控制代码执行顺序if (GameManager.Instance.canReadPy && GameManager.Instance.typeDone){ExecCode();}}public void ExecCode(){   string code = @"
import UnityEngine as ue
import openai
import random
objects = ue.Object.FindObjectsOfType(ue.GameObject)
duiBaQis = []
for obj in objects:if obj.tag == 'duiBaQi':duiBaQis.append(obj)
openai.api_key = '这里填在官网拿到的key'
model_engine = 'gpt-3.5-turbo' 
prompt = 'hello'
temperature = random.uniform(0.1,2)
for o in duiBaQis:if('@temperature:' in o.name):temperatureStr = format(temperature,'.2f')o.name = '@temperature:' + temperatureStr;
max_tokens = 255
for o in duiBaQis:if('@prompt:' in o.name):promptText = o.name.replace('@prompt:','');prompt = promptText
completion = openai.ChatCompletion.create(model='gpt-3.5-turbo',messages=[{'role': 'user', 'content': prompt}],temperature = temperature,max_tokens = max_tokens
)
print(completion.choices[0].message.content)
for o in duiBaQis:if('@ai:' in o.name):o.name = '@ai:'+ completion.choices[0].message.content;
";GameManager.Instance.canReadPy = false;GameManager.Instance.typeDone = false;_timer = 0;PythonEngine.Initialize();using (Py.GIL()){PythonEngine.Exec(code);}}
}

 这是DialogueManager.cs文件

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;public class DialogueManager : MonoBehaviour
{public static DialogueManager Instance;public string taDialogue;private float _timer;//缓冲时间private float _interval = 1.6f;private bool _writeDone;private string prompt;public GameObject promptObj;public GameObject aiObj;public GameObject temperatureObj;private void Awake(){Instance = this;}private void FixedUpdate(){//判断是不是点击完成了,如果点击了,就开始计时,然后执行readfile函数,放出ai的内容if (_writeDone){_timer += Time.deltaTime;if (_timer >= _interval){_writeDone = false;_timer = 0;ReadFile();}}}public void ReadFile(){//读取在temperature游戏物体的名字,来显示诚恳度,然后更改进度条。float temperature = float.Parse(temperatureObj.name.Replace("@temperature:", ""));GameManager.Instance.volume = temperature;//读取ai游戏物体的名字,来显示ai的内容string aiText = aiObj.name.Replace("@ai:", "");//哈哈哈,这里就体现我的菜了,不会正则,正能这样傻瓜式的校验if (aiText.Contains("AI") || aiText.Contains("ai") || aiText.Contains("语言模型") || aiText.Contains("开发") || aiText.Contains("人工智能")|| aiText.Contains("程序")){aiText = aiText.Replace("AI", UIManager.Instance.taName.text);aiText = aiText.Replace("ai", UIManager.Instance.taName.text);aiText = aiText.Replace("语言模型", "玩伴");aiText = aiText.Replace("开发", "培育出来");aiText = aiText.Replace("人工智能", "超级聪明");aiText = aiText.Replace("程序", "人");}taDialogue = aiText;Debug.Log("@ReadSuccess");StartCoroutine(Type(taDialogue));Debug.Log(taDialogue);}//这个函数是在玩家输入完毕以后调用的,用的是On End Edit事件,在input field这个组件里面可以看到public void Ask(string ask){prompt = ask;}//这个函数是按下准备按钮以后调用的,调用的是On Click事件,在button这个组件里可以看到public void WriteFile(){//加个判断条件,免得玩家们太多兴奋一直按个不停,导致我们的钱钱不断流失,哈哈哈,因为每次发请求都是要收费的呀!!!if (UIManager.Instance.timer.fillAmount < 0.99f){UIManager.Instance.warning.SetActive(true);return;}UIManager.Instance.taDialogue.text = UIManager.Instance.taName.text + "正在思考哦~";if (prompt == ""){prompt = "hello";}promptObj.name = "@prompt:" + prompt;//这里就是更改游戏物体的名字为我们设置好的prompt了,注意"@prompt:"不要忘记了,因为我们在python里是通过这个来查找的GameManager.Instance.canReadPy = true;GameManager.Instance.typeDone = true;_writeDone = true;Debug.Log("@WriteSuccess");}private IEnumerator Type(string str){UIManager.Instance.taDialogue.text = "";for (int i = 0; i < str.Length; i++){UIManager.Instance.taDialogue.text += str[i];yield return null;}}
}

既然都贴出来了,那就讲一下吧(其实都在注释里写上了),大家完全可以不用看的,就是我自己想写一下,hh,上面讲的那些就是核心了,这部分大家可以自己发挥创意的。

我的思路就是玩家可以输入文字(那个输入框),然后输入完以后会调用ask函数,然后把输入的内容传到prompt里,然后接着玩家点击小爪子(那个按钮)就会执行writefile函数(但是呢?还要先校验一下是不是在冷却时间里,我的ui改变都是在UIManager里完成的)

然后这是代码:

using System.Collections;
using UnityEngine;
using UnityEngine.UI;public class UIManager : MonoBehaviour
{public static UIManager Instance;public Image chenKenDu;private float _value;public Text youName;public Text taName;public Text taDialogue;public Image timer;public GameObject warning;public Text error;public bool useGpt;private void Awake(){Instance = this;_value = useGpt ? 2 : 200;}public IEnumerator ChangeValueToUI(){chenKenDu.fillAmount = 0;var filla = GameManager.Instance.volume / _value;var f = filla / 60;for (float i = 0; i < filla; i += f){yield return null;chenKenDu.fillAmount += f;}}
}

接着上面的讲,执行完WriteFile这个函数以后,就会把这三个bool值改成true,一旦为true了,PythonManager里马上就会检测到,然后执行ExceCod函数,运行python代码。这个时候_writeDone也成true了,然后开始计时,计时1.6s以后执行readfile函数,读取游戏物体的名字,然后在UI里显示出来。

至此,ChatGPT的接入就完全结束了,感谢大家能读到  3.第三步 C#调用python代码 或者能坚持读到这里,哈哈哈,那就不浪费大家时间了,就这样,结束!拜拜!


http://chatgpt.dhexx.cn/article/rcatp1FU.shtml

相关文章

如何用ChatGPT进行剧本/广告脚本写作?

【ChatGPT】前些天发现了一个巨牛的人工智能学习电子书&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;无广告&#xff0c;忍不住分享一下给大家。&#xff08;点击查看学习资料&#xff09; 该场景对应的关键词库&#xff08;23个&#xff09;&#xff1a; 剧本、广告…

chatGPT能干什么?给大家分享一些实用的例子

下面给大家列举了一些实际的使用例子。 01 如果你是开发人员 chatGPT可以帮你辅助写一些原子功能的函数&#xff0c;提高开发效率 &#xff0c;效果如下&#xff1a; 打印9*9乘法表 手机号脱敏&#xff0c;项目中能够直接用 最头疼的变量命名&#xff0c;直接帮你搞定 想要体…

『干货』文案策划如何利用ChatGPT创作一篇热文?4步快速生成,1分钟搞定……

文案有多苦&#xff0c;大家心里都清楚。 组长会骂你文章没写到点子上&#xff0c; 项目负责人会觉得你没能力&#xff0c; 品牌方更是需要你说个一二三来…… 文案更是改了又改&#xff0c;调了又调&#xff01; 谁都可以对你指指点点&#xff0c;谁都可以骑在你头上拉S……

如何用ChatGPT 写了篇文章!

这几天大家应该看到很多人&#xff0c;尤其做技术的&#xff0c;互联网圈子的人都在刷屏一个ai玩意&#xff0c;叫 ChatGPT。在写这篇之前&#xff0c;我也试了试&#xff0c;感觉还挺好玩。看到很多人在问这是个啥&#xff0c;今天就来简单说说。 1、 ChatGPT 是什么&#x…

ChatGPT横空出世|超强大功能写代码、写情书、写文章、做设计火爆全网

会被人工智能替代的行业 不是孩子未来的发展方向 因为我们在有限的时间里 无法穷尽对技术的学习 那么人工智能无法替代的是什么&#xff1f; 最近火热的ChatGPT&#xff0c;是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型&#xff0c;它能够通过学习和理解人…

ChatGPT大封号,注册功能关闭!亚洲成重灾区,网友喊话:不要登录,不要登录...

Datawhale干货 最新&#xff1a;GPT封号情况&#xff0c;来源&#xff1a;量子位 “不要登录ChatGPT&#xff01;” “暂时远离人工智能和ChatGPT概念板块高位股&#xff01;” 就在这两天&#xff0c;一些关于ChatGPT的疾呼突然在各种社交平台和群聊刷屏了。 而看到这些消息的…

玩转系统|完美替代ChatGPT!Claude注册教程及出现问题解决方案

目录 1、什么是ChatGPT&#xff1f; 2、什么是Claude&#xff1f; 3、为什么推荐Claude? 3.1、Claude特性 4、注册 slack 5、Claude添加到Slack 6、出现APP Unavailable问题 7、如何解决该问题 8、使用感受 8、1代码测试 8、2文学测试 8、3英语测试 1、什么是ChatGPT&a…

新消息,ChatGPT停止注册、大面积封号?

4 月 2 日&#xff0c;ChatGPT 大面积封号&#xff01;尤其封亚洲地区的号&#xff0c;不少国内用户的号都被封(deactive)了 。 同多位当事人证实&#xff0c;情况属实&#xff0c;而且目前 ChatGPT 停止注册。 搜『V起来助手』公zz号&#xff0c;体验由V起来团队打造的ChatGPT…

ChatGPT 大规模封号,并停止注册!

责编 | 王子彧 出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcloud&#xff09; 4 月 2 日&#xff0c;大量用会反馈 ChatGPT 账号被封&#xff0c;其中亚洲地区成为重灾区。据相关统计&#xff0c;已有数百万用户的账号受到了影响。 一时间&#xff0c;各种关于 ChatGPT 的…

干货 | ChatGPT使用指南,让你轻松上车AI世界!

Hello&#xff0c;大家好&#xff01; 这里是壹脑云科研圈&#xff0c;我是喵君姐姐~ 聊天机器人&#xff08;Chatbot&#xff09;是一种人工智能应用&#xff0c;可以模拟人类对话行为&#xff0c;以自然语言进行交互。 在过去的几年里&#xff0c;随着自然语言处理技术和深…

ChatGPT商业运营版系统源码 全开源 站长亲测

介绍&#xff1a; 最新ChatGPT商业运营版系统源码 全开源 站长亲测 测试环境&#xff1a;PHP7.4MySQL5.6 用是没问题的&#xff0c;支持暗黑模式&#xff0c;反应也是很快的&#xff0c;充值方面使用的是后台生成卡密方式&#xff0c;有能力的可以对接一下在线支付&#x…

ChatGPT - ChatPPT快速生成PPT

文章目录 PreChatPPT Pre ChatGPT - 使用chatgpt mindshow 快速生成PPT ChatPPT 访问 https://www.chat-ppt.com/ 按需优化即可

chatgpt提示词生成器

1、在网站上找到提示词模板 https://www.explainthis.io/zh-hant/chatgpt 2、在chatgpt界面输入&#xff1a;把以下文字翻译成简体中文。然后改成想要的内容就可以了

LLM - 基于 Vicuna-13B 参数计算搭建私有 ChatGPT 在线聊天

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://blog.csdn.net/caroline_wendy/article/details/131312366 LLaMA 和 Vicuna 都是大语言模型(LLM)&#xff0c;两者的差异如下&#xff1a; LLaMA (Large Language Model Meta AI)&#…

Keep chatgpt alive, 安装插件,保持chatgpt在线

前言 ChatGPT是一种基于自然语言处理&#xff08;NLP&#xff09;的人工智能技术&#xff0c;可以帮助我们实现智能聊天。 然而&#xff0c;在使用ChatGPT插件过程中&#xff0c;我们可能会遇到频繁的网络错误&#xff0c;这会导致我们需要不断刷新网页&#xff0c;重复进行一…

chatgpt prompt 在线生成器

1. Hugging Face ChatGPT Prompt Generator &#xff08;有时候需要等很久&#xff09; ChatGPT-prompt-generator是一个特殊的ChatGPT prompt 生成器应用程序&#xff0c;允许用户生成适合其所需角色的提示。 左边输入&#xff0c;然后提交以后右边出prompt 该应用程序生成…

ChatGPT在线个人小助手应用搭建

ChatGPT在线个人小助手应用搭建 在线体验 点我在线体验 因为openAI账户申请后会默认有18美元的账户, openAI每次调用大概会花掉0.01美元, 所以为了防止恶意刷api,无意义聊天, 页面做了密码限制,如果密码不对,是不会启用openAI智能回复的.代码此文就不讲解了,源码面前,了无秘密…

chatgptH5源码开发

hatGPTH5源码开发需要以下步骤&#xff1a; 确定需求&#xff1a;在开发ChatGPTH5应用之前&#xff0c;需要明确用户的需求和目标&#xff0c;以便进行合理的设计和开发。 技术选型&#xff1a;选择适合的前端技术框架和工具&#xff0c;如React、Vue、Angular等&#…

ChatGPT: 智能对话时代的未来展望与应用实践

ChatGPT: 智能对话时代的未来展望与应用实践 简介 ChatGPT 是一种基于深度学习和自然语言处理技术的人工智能对话模型。它可以通过生成自然语言文本的方式&#xff0c;与用户进行交互式的对话。作为一种先进的对话生成模型&#xff0c;ChatGPT 在近年来快速发展的人工智能领域中…