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裡接收參數,設置窗口位置以及大小。
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。
推薦閱讀:
- None Found