栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 游戏开发 > Unity3D

Unity 基础 之 Unity 简单调用 Python (传递多个参数并接收返回值)

Unity3D 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Unity 基础 之 Unity 简单调用 Python (传递多个参数并接收返回值)

 

Unity 基础 之 Unity 简单调用 Python (传递多个参数并接收返回值)

 

目录

Unity 基础 之 Unity 简单调用 Python (传递多个参数并接收返回值)

一、简单介绍

二、实现原理

三、注意事项

四、效果预览

五、实现步骤

六、关键代码


 

一、简单介绍

Unity中的一些基础知识点。

本节介绍,在Unity 应用的时候,可能遗忘了安装 VS,或者想安装其他版本的VS供Unity使用;这里演示,单独安装 Visual Studio 工具,然后配置给 Unity 使用的方法;不过建议还是在 Unity 安装的使用一起安装。

 

二、实现原理

1、Process 配置 Python 路径、参数等,实现调用 python 脚本的功能

2、Process.StartInfo.Arguments 的值是 路径+参数组合设置,可以没有参数

3、Python 返回结果在 Process.OutputDataReceived 添加委托获取

本质:在窗口执行 python 脚本一样,其实就是调用窗口执行 python

Python 脚本的参数传递

1、调用python脚本直接使用shell或bat命令可以:

python xxx/xxx/xxx/test.python

2、需要传递参数就变为:

python xxx/xxx/xxx/test.python param1 param2

3、只需要在python文件路径后面加上参数即可,用空格分割。

在python脚本中接收参数需要用:

import sys

param1 = sys.argv[1]

param2 = sys.argv[2]

sys.argv 是将shell命令中除去‘python’后以空格分割的数组,index=0是python脚本的路径,index=1之后的是对应为的参数。

 

三、注意事项

1、由于是执行 python 脚本,得到返回值,所以对应的函数结果一定要在 python 打印出来,Unity 从打印中得到结果

2、python 脚本调用函数的脚本,尽量在同一个文件夹,以避免出现不必要的问题哈

 

四、效果预览

 

五、实现步骤

1、打开 Pycharm (可以是其他的编辑器),新建脚本,实现代码功能

 

2、打开Unity,新建空工程

 

3、工程中新建脚本,实现调用 Python 的代码逻辑

 

4、把脚本挂载到 场景中

 

5、运行场景,调用Python成功,效果如上

 

六、关键代码

1、UnityCallPython.cs


using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using UnityEngine;

/// 
/// 简单的Unity 直接调用 Python 的方法
/// 
public class UnityCallPython : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        string basePath = @"D:MySoftwareProjectsPycharmProjectsHelloWorld";

        //CallPythonHW(basePath+ "HelloWorld.py");
        CallPythonAddHW(basePath+ "AddHelloWorld.py",3.6f,5.9f);
    }

    void CallPythonHW(string pyScriptPath) {
        CallPythonBase(pyScriptPath);
    }

    void CallPythonAddHW(string pyScriptPath,float a,float b)
    {
        CallPythonBase(pyScriptPath,a.ToString(),b.ToString());
    }

    /// 
    /// Unity 调用 Python
    /// 
    /// python 脚本路径
    /// python 函数参数
    public void CallPythonBase(string pyScriptPath, params string[] argvs) {
        Process process = new Process();

        // ptython 的解释器位置 python.exe
        process.StartInfo.FileName = @"D:MySoftwareAnaconda3envsUnityPython_3p6python.exe";

        // 判断是否有参数(也可不用添加这个判断)
        if (argvs != null)
        {
            // 添加参数 (组合成:python xxx/xxx/xxx/test.python param1 param2)
            foreach (string item in argvs)
            {
                pyScriptPath += " " + item;
            }
        }
        UnityEngine.Debug.Log(pyScriptPath);

        process.StartInfo.UseShellExecute = false;
        process.StartInfo.Arguments = pyScriptPath;     // 路径+参数
        process.StartInfo.RedirectStandardError = true;
        process.StartInfo.RedirectStandardInput = true;
        process.StartInfo.RedirectStandardOutput = true;
        process.StartInfo.CreateNoWindow = true;        // 不显示执行窗口

        // 开始执行,获取执行输出,添加结果输出委托
        process.Start();
        process.BeginOutputReadLine();
        process.OutputDataReceived += new DataReceivedEventHandler(GetData);
        process.WaitForExit();
    }

    /// 
    /// 输出结果委托
    /// 
    /// 
    /// 
    void GetData(object sender, DataReceivedEventArgs e){        

        // 结果不为空才打印(后期可以自己添加类型不同的处理委托)
        if (string.IsNullOrEmpty(e.Data)==false)
        {
            UnityEngine.Debug.Log(e.Data);
        }
    }
}

 

2、HelloWorld.py

def hw():
    print('Hello World')


if __name__ == '__main__':
    hw()

 

3、AddHelloWorld.py

import HelloWorld
import sys


def add(a, b):
    return float(a) + float(b)


if __name__ == '__main__':
    print(add(sys.argv[1], sys.argv[2]))
    HelloWorld.hw()

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/900658.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号