Unity中运行Python —集成— 解决可能会遇到的问题
Unity-Python 运行接口
该文章旨在介绍如何在Unity中调用和执行Python程序。与以往只能事先运行Python程序不同,集成的方法可以根据Unity中某些参数的变化,自由的控制Python程序的开启。此外,我们还对过程中,可能会遇到的问题给出解决方法。
希望能帮助到你。✿✿ヽ(°▽°)ノ✿
一. 在Unity中引入Python模块
1. 打开文件
在Unity程序Assets同一目录下找到 Package 文件夹;以记事本方式打开 manifest.json 文件。
2. 修改文件
添加一行 "com.unity.scripting.python": "5.0.0-pre.5",
注意有个逗号。保存之后回到Unity 等待自动安装相应的包。
3. Unity中的Python控制面板
在 Window/General/Python Console下打开 Python的控制面板。如果可以到这一步,就说明接口安装成功。
4. 测试一下
上方是结果输出台,下方是python脚本编写区域。点击“Execute”执行脚本。
当然,脚本也可以外部获得,点击“Load”,选择你要添加的Python脚本即可。
二. 在Unity中脚本调用Python
1. 存放Python文件夹
在Unity程序中,新建一个用于存放Python程序的文件夹。本文中python的路径如下。
该脚本的代码如下,其功能是找到Unity中的Para物体并修改它的名字。
如果,在运行时报错:‘gbk‘ codec can‘t decode byte 0x80
,快去看 3.1小节。
import UnityEngine as ue #这个会划红线报错,不用管
object =ue.Object.FindObjectsOfType(ue.GameObject) #获取Unity中所有的GameObject类型
for go in object:
if go.name =="Para": #找到一个名字是“Para”物体 就把它的名字改成“123”
go.name="123"
else:
ue.Debug.Log(go.name) # 在Unity的控制台中输出物体的名字
2. Unity调用
① 引入头文件:using UnityEditor.Scripting.Python;
② 获取Python文件路径:string python_path = Application.dataPath + "/Python/Python_Unity.py";
③ 设置开启条件:我们以按下键盘A键为例。
④ 运行Python文件:调用 PythonRunner.RunFile
整体的代码如下。回到Unity中运行,当按下A键后,场景中名为“Para”的物体,名字被修改为“123”。
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
string python_path = Application.dataPath + "/Python/Text_Sentiment.py";
PythonRunner.RunFile(python_path);
}
}
至此,在脚本中如何运行Python程序已介绍完毕。
但是,在实际的应用中还有一些问题,我们在下一章节展开。
三. 实操中的问题
1. 运行Python文件中出现的 gbk 问题
在运行时可能会报错:UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0x80 in position 0: illegal multibyte sequence
这个错误我是真的会谢!(秃头…)
解决方法:Python文件中的所有注释全部删除,即无“井号键 ”。
2. com.unity.scripting.python 版本
在 1.2 节中,我们下载的 unity.scripting.python 是 5.0.0版本,在Unity里安装的Python版本为3.9,并且这个是不能更改的。在 Project Setting/ Python Scripting 可以查看详细信息。如果你想更改其他版本可以参考这个链接 Using Python in Unity 。
3. 程序之前运行的环境 和 Unity中Python环境不一致
通常来说,想要在Unity中调用的Python程序(记为,A.py),我们都事先在Pycharm中的某个Python 环境下运行成功了(假设,A.py在Python=3.6中成功运行)。此外,它可能还依附了其他包,这些包需要与python版本对应起来,才能正常的运行。
所以,A.py 直接在Unity的python=3.9 环境下运行可能会报错
。此外,程序里需要的包在Unity下的环境中都是没有的。因为,现在的程序都依赖于一个sit-package 即 Assets/sit-package
。
为解决这个问题,我认为有三种方法:
① 在Unity的Python=3.9环境下,重新 pip install 需要的包;
在Python Scripting面板下点击 Spawn shell in enviorment ,包的安装与配置Python一致。
注意:
这种方法或许有效,但是可能还是会有错,因为毕竟是在Unity下去安装包。可能会因为Unity平台自身的原因出错。我在尝试的时候,导入某个包的时候会一直报错(具体是哪个忘记了> <)。所以,大家可以试一下后面两种方法。
② 添加site-package;
假设,A.py是在Python=3.6中运行,则添加正常运行A.py的python=3.6的环境下的sit-package。
把路径复制到 Python Scripting面板下,重启Unity生效。
注意:
这个方法,基本上没有问题,比较推荐。
但是当你在运行多个Python程序时,可能每个程序的环境都不一样,这就需要添加多个site-package。在Unity脚本执行 PythonRunner.RunFile时,可能会先执行 Element 1路径下的site-package,如果不是对应的环境信息还是会报错。这里我就没有细究PythonRunner能否指定site-package的功能了。直接开搞第三个方法!一劳永逸!
③ 重新创建一个python=3.9的环境;
最后,我自己在Unity执行Python时,还是采用了最后一种方法。在conda 下新建了一个虚拟环境,且在python=3.9版本下配置环境
。然后,在把这个环境对应的site-package添加到 ②中提及的路径中。
我用这个方法实现了自己想要达到的功能。
所以,大家还是根据 A.py的实际情况,来选择解决方法吧。
最后,有什么问题欢迎大家留言交流哦~
写在最后
今年过的好快啊,我也希望自己能成功,加油吧!