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()



