Unity3D启动外部程序并传递参数的实现

之前开发项目,一直都使用的是外壳程序加子程序的模式,通过外壳程序去启动子程序,外壳程序和子程序之间的通信,是使用配置文件完成的。

我总觉得这样通信很麻烦,因为外壳程序需要对配置文件进行更改和写入,然后子程序又要读取信息。而且整合的时候,会导致有很多配置文件,而且需要对路径做很多处理和限制。

我发现Process.Start()函数中,是可以传递参数的。

也就是说,我们是可以在使用Process.Start()函数启动外部程序时,传递参数的进行通信的。

具体操作如下:

public void StartEXE()
    {
        ProcessStartInfo processStartInfo = new ProcessStartInfo();
        processStartInfo.FileName = "C:/Users/Administrator/Desktop/Test/Demo.exe";
        processStartInfo.Arguments = "启动 程序 1 2  3";
        Process.Start(processStartInfo);
    }

需要注意的是,如果存在多个参数的话,参数之间需要使用空格进行分隔。

外壳程序已经传递了参数,那么子程序如何接受参数呢?具体操作如下:

private void Start()
    {
        string[] args = Environment.GetCommandLineArgs();
        text.text = args.Length.ToString();
        for (int i = 0; i < args.Length; i++)
        {
            text.text += "\n" + "Arg" + i + ":  " + args[i];
        }
    }

我将所有的参数信息,打印在了一个Text上面。运行效果图如下:

补充:Unity3D:启动外部exe传参以及设置窗口位置和大小

好久没有更新博客了,最近项目上没有太大的突破,也没有涉及到新东西,所以想写博客,但是无奈没有新东西,好在最近有点新的功能要做,之前也做过,但是并没有整理成博客,现在就记录一下。省的还要去百度找。(最近好像新的Unity版本不能破解了,官网有时候也上不去,不知道Unity要搞什么东东。)

今天要说的是Unity启动外部exe,并且传递参数,改变外部exe窗口位置以及窗口大小。启动exe这个百度搜一大堆,主要是怎么设置窗口位置及大小。窗口大小的方法Unity有自己的方法,但是位置就没法设置了,我今天用的方法是Windows原生的方法。需要引用user32.dll。

废话不多说了,下面上代码

using UnityEngine;
using System.Runtime.InteropServices;
using System;
using System.Diagnostics;
public class ProperWindows : MonoBehaviour
{
    [DllImport("user32.dll")]
    static extern IntPtr SetWindowLong(IntPtr hWnd, int _nIndex, int dwNewLong);
    [DllImport("user32.dll")]
    static extern bool SetWindowPos(IntPtr hWnd, int hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags);
    [DllImport("user32.dll")]
    static extern IntPtr GetForegroundWindow(); //获取最前端窗体句柄
    [DllImport("user32.dll")]
    static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
    //[DllImport("user32.dll")]
    //static extern IntPtr GetWindowThreadProcessld();
    private void Awake()
    {
        //启动时传过来的string数组,下标为0的是启动的外部exe程序的完整路径,下标为1及之后的参数是想要传过来的参数。
        string[] args = Environment.GetCommandLineArgs();
        var winInfo = JsonUtility.FromJson<WinInfo>(args[1]);
        // 设置屏大小和显示位置
        SetWindowPos(GetForegroundWindow(), 0, winInfo.x, winInfo.y, winInfo.width, winInfo.height, 0x0040);
    }
    // Use this for initialization
    void Start()
    {
        //启动外部exe程序,第一个参数为exe完整路径,第二个参数为要传入的参数。
        string winInfo = JsonUtility.ToJson(new WinInfo(0, 0, 1000, 500));
        Process.Start(@"C:\Users\wangbo\Desktop\2\2.exe", winInfo);
    }
    // Update is called once per frame
    void Update()
    {
    }
}
[Serializable]
public class WinInfo
{
    public int x;
    public int y;
    public int width;
    public int height;
    public WinInfo(int x, int y, int width, int height)
    {
        this.x = x;
        this.y = y;
        this.width = width;
        this.height = height;
    }
}

上面的代码里我传的参数是json格式的,在Start里启动一个exe,在Awake里接收参数,设置窗口位置以及大小。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • Unity3d 如何更改Button的背景色

    我就废话不多说了,大家还是直接看代码吧~ using UnityEngine; using System.Collections; public class ButtonStyle : MonoBehaviour { public Color _color;//在编辑环境下选择背景色,透明度不能为0 public Texture2D tex; void OnGUI(){GUI.Button(new Rect(0,0,100,100),"tex");Color oldColor = GU

  • Unity3D 单例模式和静态类的使用详解

    Unity3D的API提供了很多的功能,但是很多流程还是会自己去封装一下去.当然现在网上也有很多的框架可以去下载使用,但是肯定不会比自己写的用起来顺手. 对于是否需要使用框架的问题上,本人是持肯定态度的,把一些常用方法进行封装,做成一个功能性的框架,可以很大程度上提高代码的效率,维护也方便. 对于网络上很多教程上使用的"游戏通用MVC框架",现在看来并不符合MVC这种结构性框架的设计思想:要知道,MVC最初是被设计为Web应用的框架,而游戏中的很多事件并不是通过用户点击UI发生的,Vi

  • Unity解析gif动态图操作

    工作需求,要播放一张gif图片,又不想转成视频播放,就开始研究怎样解析gif,在网上也看了不少教程,最后根据自己需求写了个脚本. 首先,Unity是不支持gif的(至少我没找到方法),而又要在NGUI中显示gif图片.所以就想到了将gif解析成序列帧再去循环播放. 有人说可以找软件解析,然后导入Unity做动画,最终我没有采用,自己再Unity中以代码解析,然后播放的. 代码如下 (在Awake中解析的,因为要在其他脚本调用,实时解析的话,到时候会花费一会时间): using System.Co

  • unity 文件流读取图片与www读取图片的区别介绍

    IO流代码: void LoadByIO() { float time = Time.time; FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read); fs.Seek(0, SeekOrigin.Begin); byte[] bytes = new byte[fs.Length]; fs.Read(bytes, 0, (int)fs.Length); fs.Close(); fs.Dispose(); fs =

  • unity里获取text中文字宽度并截断省略的操作

    前言 在unity的ugui中Text控件,有时我们会有各种各样的需求,比如类似html中css的text-overflow属性,希望一段文字如果不够长就全显示,如果特别长就截断并且后面加上例如-这种后缀. 好吧这样的需求在ugui里貌似没有现成的方法,如果有的话麻烦指点一下~ 实现 大概的思路就是 - 首先要能判断什么时候overflow - 并且支持加上后缀 那么text控件本来是支持overflow然后直接截断的,但是比较暴力,直接砍断,不能加后缀,并不满足我们的需求. 然后如果简单的通过

  • unity 如何使用文件流读取streamingassets下的资源

    目的:读取streamingassets下的文件中指定的一段字节 已知:文件中的起始位置,和需要读取的长度 1.android下读取 1.1 不能直接使用C#的FileStream,读取失败 var buffer = new byte[size]; FileStream stream = File.OpenRead(path); stream.Read(buffer , pos, size); 报错: IsolatedStorageException: Could not find a part

  • unity 如何获取button文本的内容

    如下就可以获取button中的文本内容 using System.Collections.Generic; using UnityEngine; using UnityEngine.UI; using System; public class ButtonContent : MonoBehaviour{ public Button btn; void Start(){ btn = GameObject.Find("填写button名").getComponent<Button&g

  • unity avprovideo插件的使用详解

    1.新建一个MediaPlayer组件 2.在canvas下新建一个AVProVideo组件 并将上一步新建的MediaPlayer组件赋值到avprovideo组件上的mediaplayer上 3.将需要播放的视频放在StreamingAssets文件夹下 接下来就是用代码调用了 1._mediaPlayer.OpenVideoFromFile(MediaPlayer.FileLocation.RelativeToStreamingAssetsFolder, 视频路径, 是否自动播放);//加

  • Unity使用物理引擎实现多旋翼无人机的模拟飞行

    内容简介 最近在用Unity实现无人机的模拟飞行,但发现站里基本没有完整介绍如何实现该功能的博客,因时间紧迫,就自己简单做了一个仿真(不是完全按照现实物理情景来做,即通过各个螺旋桨旋转产生力带动机体飞行).下面我会简述完全按现实物理情景实现模拟飞行,并详细描述我自己做的模拟飞行(不完全仿真),给各位提供参考. 现实物理情景的实现--简述(以四旋翼无人机为例) 因为我没有实现1:1仿真,所以这里只介绍思路,希望能给到读者一点启发. 构建一个四旋翼无人机模型(可以网上下载.或用Maya等建一个) 将

  • unity 如何获取Text组件里text内容的长度

    我就废话不多说了,大家还是直接看代码吧~ /// <summary> /// 计算字符串在指定text控件中的长度 /// </summary> /// <param name="message"></param> /// <returns></returns> int CalculateLengthOfText(string message,Text tex) { int totalLength = 0; Fon

随机推荐