[unity]C#脚本调用外部exe

在unity下对照背景图片调整物体的位姿,想要调整好之后把位姿用opencv处理一下。opencv这部分已经有现成的C++代码,每次都要把位移旋转6个参数复制到VS里面去再编译运行,效率太低。又不想再去C#下重写了,打算VS直接生成exe让unity调用。

脚本在编辑模式下执行

首先在C#脚本添加

[ExecuteInEditMode]

让该脚本在编辑模式下也可以被调用,不用每次都启动才运行脚本。

创建一个“Button”

设置一个public的布尔变量,初始化为false,在Update()中写一个if语句,为true就执行exe,执行后将布尔变量重设为false。这样就相当于一个button,点击一次就启动一次exe。

public bool run_exe = false;

    ...

    void Update()
    {
        if (run_exe)
        {
            //运行函数
            run_exe = false;
            
            //调用exe
            //...
        }

Process类调用exe(不止exe)

using System.Diagnostics;

...

    Process foo = new Process();
    foo.StartInfo.FileName = "D://UnityPoseTransform.exe";
    foo.StartInfo.Arguments = "TEST";
    foo.Start();

关于StartInfo,可以看到通过改变StartInfo.Filename的值,可以调用任何类型的文件,并不只局限于exe,py,doc,txt等等都行。这个后面会说。

Arguments是字符串类型。

在被调用的exe中可以打印看一下

    cout << "argc = " << argc << endl;
	for (int i = 0; i < argc; i++)
		cout << argv[i] << endl;
	cout << "argv end" << endl;

第一个参数是Filename,第二个是Arguments,然后就可以通过分割字符串进一步处理。 

问题:StartInfo中包含空格

如果StartInfo中包含空格,比如“3_Vampire queen”,就会以空格为分界变成两个参数。

为什么会出现这种情况?

参考:Spaces in file path passed as command line argument c#

p1是一个Process类示例

Process p1 = new Process();

 下面的代码

p1.StartInfo.Filename = "test.exe";
p1.StartInfo.Arguments = "arg";
p1.Start()

等同于

p1.Start("test.exe","arg");

等同于在cmd中敲

test.exe arg

因此,当参数中有空格时,例如“arg1 arg2”

test.exe arg1 arg2

在cmd中执行时,空格会被视为分隔符

参数中包含 ' * '等符号也是同理

解决办法
1.对空格使用转义\
    但这样并不友好,需要检查参数中是否有空格
2.使用单引号(没测试)

3.开头添加@,让转义字符表示原意,不要进行转义。

4.给参数加双引号

简单粗暴

p1.StartInfo.Arguments = "\""+arg+"\"";

相当于test.exe "arg1 arg2"

测试一下

int main(int argc, char* argv[])
{
	cout << "argc = " << argc << endl;
	
    for (int i = 0; i < argc; i++)
		cout << argv[i] << endl;
	
    cout << "argv end" << endl;

    return 0;
}
不加双引号
加双引号 p1.StartInfo.Arguments = "\""+arg+"\"";

读取其他组件的属性值

现在我保存到txt时使用的是模型的name,但今天需要处理很多一样的图片,这些图片使用的模型都是Cat,但是图像名不同,于是需要取读取背景的图像名称

 调用exe的脚本绑定在1_Cat上,背景图存储在RawImage2中

 目标就是获得complex_fix_handled_6_....这个值

由于GetComponent只能获得自身包含的组件,因此声明一个public GameObject,将RawImage2链接上

 

 通过GetComponent获得RawImage2下的RawImage对象,要引入RawImage,使用

using UnityEngine.UI;
private RawImage rawImage;
...
rawImage = Img.GetComponent<RawImage>();
UnityEngine.Debug.Log(rawImage.texture.name);

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值