Unity中运行Python —集成— 解决可能会遇到的问题

Unity-Python 运行接口

  • 一. 在Unity中引入Python模块
  • 1. 打开文件
  • 2. 修改文件
  • 3. Unity中的Python控制面板
  • 4. 测试一下
  • 二. 在Unity中脚本调用Python
  • 1. 存放Python文件夹
  • 2. Unity调用
  • 三. 实操中的问题
  • 1. 运行Python文件中出现的 gbk 问题
  • 2. com.unity.scripting.python 版本
  • 3. 程序之前运行的环境 和 Unity中Python环境不一致
  • 该文章旨在介绍如何在Unity中调用和执行Python程序。与以往只能事先运行Python程序不同,集成的方法可以根据Unity中某些参数的变化,自由的控制Python程序的开启。此外,我们还对过程中,可能会遇到的问题给出解决方法。

    希望能帮助到你。✿✿ヽ(°▽°)ノ✿


    一. 在Unity中引入Python模块

    1. 打开文件

    在Unity程序Assets同一目录下找到 Package 文件夹;以记事本方式打开 packages-lock.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的实际情况,来选择解决方法吧。
    最后,有什么问题欢迎大家留言交流哦~


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

    物联沃分享整理
    物联沃-IOTWORD物联网 » Unity中运行Python —集成— 解决可能会遇到的问题

    发表评论