C#编程——在Unity脚本中与Python通信

提示:若本篇文章对您有帮助,欢迎点赞支持。

文章目录

前言

一、方法(一)——通过命令行调用Python代码

1、命令行运行Python程序的方法

2、C#中运行Python程序

3、该方法的不足之处

二、方法(二)——通过套接字调用Python代码

1、套接字通信方法简介

2、引用套接字通信包


前言

Unity是一款十分优秀的游戏引擎,许多个人开发者都在尝试使用该软件自己喜爱的应用。如果在Unity中使用一些先进的人工智能算法则可能需要借助Python代码

Unity官方推出的ML-Agents就是使用Python代码写AI算法,在Unity中使用C#脚本调用AI算法的输出来为应用开发增加了更多有趣的功能。


一、方法(一)——通过命令行调用Python代码

1、命令行运行Python程序的方法

在初学Python的过程中,大部分教程都会教开发者如何通过命令行来运行Python程序:

python xxx/xxx/xxx/test.python

众所周知,该过程就是通过命令行指定一个Python脚本路径,然后启动一个Python解释器程序(Python.exe)运行该Python脚本。

当然,我们也可以在运行该脚本时在命令行中传入参数,只需要在python文件路径后面加上用空格分割的参数即可:

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

如果我们想要在Python脚本中使用这两个参数,就可以通过数组sys.argv

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

即我们可以这样得到上述命令行传入的参数param1param2

import sys

param1 = sys.argv[1]

param2 = sys.argv[2]

2、C#中运行Python程序

现在我们已经知晓了如何通过shell命令来传入一个命令行来运行Python脚本。

首先假设我们有一个可以通过命令行传入参数的HelloWorld.py脚本:

import HelloWorld
import sys
# 定义一个简单加法函数
def add(a, b):
    return float(a) + float(b)
 
if __name__ == '__main__':
    # 获取传入脚本的参数
    param1 = sys.argv[1]
    param2 = sys.argv[2]
    # 输出日志
    print('Hello World')
    print(add(param1,param2))

同样,我们可以在C#脚本中创建一个进程来运行一个Python程序来传入参数12并运行该Python脚本:

Process process = new Process();// 创建一个进程对象
// 设置启动程序为指定路径下的Python解释器,该程序可以运行Python脚本
process.StartInfo.FileName = @"E:\Anaconda3\envs\Unity_Lab\python.exe";
// 进行进程其他的设置
process.StartInfo.UseShellExecute = false;
// 设置Python脚本路径和传入的参数
process.StartInfo.Arguments = @"D:\Projects\PycharmProjects\HelloWorld.py 1 2";
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;        // 不显示执行窗口
// 启动进程
process.Start();

现在已经可以为Python脚本传入参数,我们还要获取Python脚本返回的输出,只需要获取该进程的输出即可:

// 获取进程运行的输出,
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);
        }
    }

如此我们就实现了C#程序向Python代码传入参数及获取返回值的方法。

3、该方法的不足之处

不过该方法的不足之处也十分明显:

(1)依赖命令行来一次性传入参数,如果运行函数过多,则传入参数复杂。

(2)Python脚本打印出的信息才能被C#脚本捕捉。

所以,我们推荐使用套接字通信来调用Python代码。

二、方法(二)——通过套接字调用Python代码

1、套接字通信方法简介

在C#脚本中调用Python代码的方法有很多种,套接字通信方法应该是其中较好的一种。

最简单的实现方式就是以Python服务端,C#脚本作为客户端,两者通过绑定IP地址进行本地通信。

该方法的好处就是之后也可以很方便地升级到多客户端或者远程登录的方式。

2、引用套接字通信包

我之前的两篇博客已经讲解了如何用C#Python来分别实现TCP套接字通信,并且给出了开源地址

相关博客 开源通信包

Python编程——基于TCP的套接字通信包【开源】

MNetSocket-Python

C#编程——基于TCP的套接字通信包【开源】

MNetSocket-CSharp

所以现在实现该功能也是十分简单,只需要使用C#的客户端和Python的服务端,保证IP地址和端口号一致即可进行参数传递。

当然读者也可以选择其他更加优秀的TCP通信包。

 

 

你可能感兴趣的:(C#程序设计,Python程序设计,python,shell,c#,unity,socket)