上一篇文章讲到了Unity-打开另一个exe可执行程序并传入参数,今天讲一下如何通过Visual studio的 windows窗体应用打开另一个exe可执行程序并传入参数。
本章主要涉及到三个方面的知识点,Visual studio的Form搭建、传入与接收参数、Json数据解析,如果还有不会json数据解析的同学进Json数据解析,了解json解析后可进行该课程学习。
此案例使用Visual studio 2017与Unity 2019.4.8
一、Visual studio Form窗口搭建
(1)新建windows窗体应用项目,此处为了方便测试,直接将项目创建于桌面,项目名称为StartConfig。
(2)项目建好以后默认窗口如上图,可点击(视图/工具箱)或使用快捷键Ctrl+Alt+X打开工具箱。
(3)编辑窗口标题名称,这里的窗口名称可任意编辑,有两种修改方式,一种直接在脚本内部修改,还有一种直接在编辑器窗口修改,个人建议采用第二种,编辑修改比较简单,直接鼠标左键选择窗口/控件,直接在解决方案资源管理器即可修改。
(4)利用工具箱中的公共控件,搭建一个比较简单的Form窗口,如下图。
这里为了方便测试,名称先与测试案例所有控件名称一致,方便和代码对应上,修改方式:鼠标左键点击控件,在右下角的面板修改,规则从上往下,从左往右控件名称如下:
label_UserName、textBox_UserName
label_Age、textBox_Age
label_SceneName、textBox_SceneName
label_Path、textBox_Path、button_Select
button_StartApplication
二、参数传入
完整Form1类如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using LitJson;
namespace StartConfig
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
/// <summary>
/// 选择按钮函数
/// 打开资源管理器 选择需要执行的exe可执行程序 并将exe路径进行赋值操作
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_Select_Click(object sender, EventArgs e)
{
OpenFileDialog file = new OpenFileDialog();
file.ShowDialog();
textBox_Path.Text = file.FileName;
}
/// <summary>
/// 开始程序按钮函数
/// 进行启动配置信息初始化 转化为json后 通过Process类进行程序启动
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button_StartApplication_Click(object sender, EventArgs e)
{
StartConfigInfo info = new StartConfigInfo()
{
userName = textBox_UserName.Text,
age = int.Parse(textBox_Age.Text),
sceneName = textBox_SceneName.Text
};
string configStr = JsonMapper.ToJson(info);
Process process = new Process();
process.StartInfo.FileName = textBox_Path.Text;
process.StartInfo.Arguments = configStr;
process.StartInfo.UseShellExecute = true;
process.Start();
}
}
/// <summary>
/// 启动配置信息
/// </summary>
public class StartConfigInfo
{
public string userName; //用户名
public int age; //年龄
public string sceneName; //场景名称
}
}
这里值得注意的地方是我们引用了LitJson命名空间,如果没有引用LitJson.dll类库文件,脚本内部会报错,引用方式如下:点击工具/NuGet包管理器/管理解决方案的NuGet程序包
安装后会自动引入项目,报错会得到解决,到这里该项目已经可以正常运行,在Unity中创建项目时也需要Litjson类库文件,有两种方式获取,第一种为:(StartConfig\packages\LitJson.0.17.0\lib\net45\LitJSON.dll),第二种为:点击生成/生成解决方案后,在(StartConfig\StartConfig\bin\Debug\LitJSON.dll),值得注意的是,第二种我们直接生成了exe可执行程序,这就是我们Form窗体程序最终打包出来的包体,后面结合参数接收的Unity打包项目就可以参与测试。
三、参数接收
(1)新建Unity项目:ReceiveParameter,Project视图层级如下:
在上述提到的LitJSON.dll导入Plugins文件夹内,方便后面引用,Game1与Game2很简单,和上一篇博客保持一致,弄一个text文本框说明该场景是那个场景即可。
(2)Start场景层级如图:主要包含用户名、年龄、进入游戏按钮,用于接收传入参数的显示和按钮事件的添加,各位同学自己搭建一下即可,非常简单。
(3)编写StartManager脚本,并挂载在StartUI上,将用户名、年龄、按钮拖入其中
using UnityEngine;
using UnityEngine.UI;
using LitJson;
public class StartManager : MonoBehaviour
{
public Text text_UserName;
public Text text_Age;
public Button button_EnterGame;
private StartConfigInfo startConfigInfo;
private void Start()
{
Init();
}
/// <summary>
/// 初始化
/// </summary>
private void Init()
{
string receiveStr = System.Environment.GetCommandLineArgs()[1];
startConfigInfo = JsonMapper.ToObject<StartConfigInfo>(receiveStr);
text_UserName.text += startConfigInfo.userName;
text_Age.text += startConfigInfo.age.ToString();
button_EnterGame.onClick.AddListener(() =>
{
UnityEngine.SceneManagement.SceneManager.LoadScene(startConfigInfo.sceneName);
});
}
/// <summary>
/// 启动配置信息
/// </summary>
public class StartConfigInfo
{
public string userName;
public int age;
public string sceneName;
}
}
(4)最后打个包,利用Form窗口,选择我们打包的exe程序路径,运行后即可将参数带入所执行的exe程序中,在程序中,将会展示用户名和年龄,并通过不同的场景名称进入不同的场景。