说明:
最近根据项目上的需求,一个专题中有众多的场景,后决定采用【主场景+子场景】分开打包的方式,需要解决的是在主场景登陆进去之后需要将【用户ID】等数据传递到子场景中,一开始采用的是Socket通讯的方式传递,后来改为使用进程(Process)启动外部exe。
所引用的命名空间为:System.Diagnostics
1. 不带参数直接启动外部程序
Process.Start("启动的路径名字");
2. 启动时传递参数
传递多个参数时需要用【空格】分开
/// <param name="path">启动路径</param>
/// <param name="argument">传递的参数 【多个参数使用空格分开】</param>
public static void OpenStartByProgress(string path,string argument)
{
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = path;
startInfo.Arguments = argument;
Process.Start(startInfo);
}
3.启动传递参数,避免多开(只开一个)
注意: 获取进程中的名字进行比较时没有后缀,比如QQ.exe, 进程名字是QQ
/// <param name="path">启动路径</param>
/// <param name="argument">传递参数</param>
public static void OpenByProgress(string path,string argument,UnityAction<string> action=null)
{
//这里是根据路径获取启动的程序名字
int index = path.LastIndexOf('/');
//启动进程的名字(进程的名字后缀没有.exe)
string ProgressName =path.Substring(index+1).Split('.')[0];
//索引记数
int currentProgress = 0;
Process[] processes = Process.GetProcesses();
foreach (var item in processes)
{
if (item.ProcessName == ProgressName)
{
currentProgress++;
}
}
if (currentProgress >= 1) //已经启动的情况下
{
//提示信息: 当前进程已经启动 请勿重复使用
action("当前程序已经启动,请勿重复启动");
}
else //没有启动
{
//进程启动
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = path;
startInfo.Arguments = argument;
Process.Start(startInfo);
}
}
4.子场景启动时获取传递的参数
private void GetArguements()
{
//args数组获取的就是参数列表,可根据实际情况进行处理
string[] args = Environment.GetCommandLineArgs();
//args[0]: 的数据为启动的路径
ProgressData.Id = args[1];
ProgressData.MemberId = args[2];
ProgressData.Token = args[3];
}
如有错误请指出,相互学习,相互进步!