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的实际情况,来选择解决方法吧。
最后,有什么问题欢迎大家留言交流哦~


写在最后
今年过的好快啊,我也希望自己能成功,加油吧!