在Unity中打开外部程序
如下
2021-4-09-20:20
导入命名空间
首先导入命名空间:
namespace System.Diagnostics
导入这个命名空间之后如果使用Debug.Log(“”);可能会提示冲突,如果你想打印日志则可以:
using Debug = UnityEngine.Debug;
获取路径
路径有相对路径和绝对路径两种。
相对路径:相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系。
绝对路径:是一个文件的完整路径,包含盘符,当使用绝对路径的时候,文件夹位置改变了,而这里的代码没有及时更新就会报错。
打开程序
这里使用的是绝对路径,需要打开的程序需要和Unity一起发布那么请使用后面的方法
private void OnGUI()
{
if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 31, 100, 62), "开启程序"))//按钮的X坐标,按钮的Y坐标,宽度,高度
{
string PrograssPath = "D:/Steam/Steam.exe";//双引号内填写程序的绝对路径,注意斜线的方向
Process.Start(PrograssPath);
}
}
打开和Unity一起发布的外部程序
首先在Assets下创建一个名为"StreamingAssets"的文件夹,这里字母不可以出错,然后将程序放到"StreamingAssets"文件夹内,然后使用代码来打开文件夹中的程序.
private void OnGUI()
{
if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 - 31, 100, 62), "开启程序"))//按钮的X坐标,按钮的Y坐标,宽度,高度
{
string PrograssPath = Application.streamingAssetsPath + "/"+"Steam.exe";//这里是使用的路径是从"StreamingAssets"开始的路径,双引号内填写路径。
Process.Start(PrograssPath);
}
}
当有外部程序在"StreamingAssets"文件夹中的时候发布会报错,需要将外部程序的文件夹剪切出去,然后发布unity程序,再把外部程序放到发布文件的"StreamingAssets"的文件夹中,注意路径不要出错。
关闭程序
关闭程序只需要知道程序的名称,然后就可以关闭程序
/// <summary>
/// 关闭程序
/// </summary>
/// <param name="processName">需要关闭的程序名,不需要后缀</param>
private void KillProcess(string processName)
{
System.Diagnostics.Process[] processes = System.Diagnostics.Process.GetProcesses();
foreach (System.Diagnostics.Process process in processes)
{
try
{
if (!process.HasExited)
{
if (process.ProcessName == processName)
{
process.Kill();
UnityEngine.Debug.Log("已关闭进程");
}
}
}
catch (System.InvalidOperationException ex)
{
UnityEngine.Debug.Log(ex);
}
}
}
然后就可以调用方法来关闭程序
if (GUI.Button(new Rect(Screen.width / 2 - 50, Screen.height / 2 + 31, 100, 62), "关闭程序"))
{
KillProcess("Steam");//需要关闭的程序名称,可以在任务管理器中查看
}
更新:2021-5-23
问题:当Unity发布之后将外部程序文件加入到“StreamingAssets”之后,运行Unity程序,但是外部程序提示找不到某个DILL。
解决方案:1.先将外部程序放到桌面,测试程序是否正常,
2.若正常将程序放到“StreamingAssets”启动发布的unity项目,若外部程序报错,检查是不是外部程序的报错的DILL是否在拷贝的时候丢了,若没有丢失可能是程序找不到DILL,说明程序的路径太长了找不到,win系统下路径最长大约是256字符。