CMD命令是windows上开发人员经常会使用的工具,比如copy文件,文件夹软链接等等。
有了它,有时候我们想实现一些快速的操作,都会比较便捷。在windows中,可以按下Win+R,然后输入cmd打开命令提示符输入窗口。这个窗口它对应是cmd.exe
在unity中,要启动其他的exe程序,可以使用Process类来启动一个新进程。在《Unity3D集成TortoiseSVN》中,我们就已经使用了Process来启动svn的exe程序。所以要启动cmd.exe,只要小改一下代码即可。如下
public static void RunCmd(string cmd) { var process = new Process { StartInfo = { FileName = "cmd.exe", Arguments = "/k" + cmd, CreateNoWindow = false, } }; try { process.Start(); process.WaitForExit(); } catch (Exception e) { UnityEngine.Debug.Log(e.Message); } finally { process.Close(); } }
OK,核心的代码已经完成,后面需要做一个交互界面,这里打算设计成这样
要实现这样的unity界面,可以在工程中任意一个Editor目录下创建一个类,继承editorwindows,然后在OnGUI函数中使用EditorGuilayout的相关方法绘制控件即可,如
public class DosCmder : EditorWindow { private string m_cmd = ""; public void OnGUI() { EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); EditorGUILayout.LabelField("请输入命令行"); if (GUILayout.Button("保存", EditorStyles.toolbarButton, GUILayout.Width(50))) { } if (GUILayout.Button("导入", EditorStyles.toolbarButton, GUILayout.Width(50))) { } EditorGUILayout.EndHorizontal(); m_cmd = EditorGUILayout.TextArea(m_cmd, GUILayout.Height(200)); if (GUILayout.Button("运行")) { } } }
这里保存和导入功能暂时不做,我们只需要在完成运行功能,调用之前的RunCmd函数即可。
为了能从unity的菜单栏中打开这个窗口,我们再写一个方法到DosCmder中
[MenuItem("Stardust/辅助/Dos命令窗口")] public static void Open() { var win = GetWindow<DosCmder>(); win.titleContent = new GUIContent("Dos命令窗口"); }
至此就完成了能够运行cmd命令的窗口了,在输入栏中输入命令,然后点击运行。完美!
最终的cs文件:
using System; using System.Diagnostics; using UnityEditor; using UnityEngine; namespace StardustEditorTool { public class DosCmder : EditorWindow { public static void RunCmd(string cmd) { var process = new Process { StartInfo = { FileName = "cmd.exe", Arguments = "/k" + cmd, CreateNoWindow = false, } }; try { process.Start(); process.WaitForExit(); } catch (Exception e) { UnityEngine.Debug.Log(e.Message); } finally { process.Close(); } } [MenuItem("Stardust/辅助/Dos命令窗口")] public static void Open() { var win = GetWindow<DosCmder>(); win.titleContent = new GUIContent("Dos命令窗口"); } private string m_cmd = ""; public void OnGUI() { EditorGUILayout.BeginHorizontal(EditorStyles.toolbar); EditorGUILayout.LabelField("请输入命令行"); if (GUILayout.Button("保存", EditorStyles.toolbarButton, GUILayout.Width(50))) { UnityEngine.Debug.Log("功能未实现"); } if (GUILayout.Button("导入", EditorStyles.toolbarButton, GUILayout.Width(50))) { UnityEngine.Debug.Log("功能未实现"); } EditorGUILayout.EndHorizontal(); m_cmd = EditorGUILayout.TextArea(m_cmd, GUILayout.Height(200)); if (GUILayout.Button("运行")) { RunCmd(m_cmd); } } } }