zoukankan      html  css  js  c++  java
  • unity插件开发:dos(cmd)命令输入窗口

    CMD命令是windows上开发人员经常会使用的工具,比如copy文件,文件夹软链接等等。

    有了它,有时候我们想实现一些快速的操作,都会比较便捷。在windows中,可以按下Win+R,然后输入cmd打开命令提示符输入窗口。这个窗口它对应是cmd.exe

    image

    image

    在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,核心的代码已经完成,后面需要做一个交互界面,这里打算设计成这样

    image

    要实现这样的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);
                }
            }
        }
    }
    个人博客请访问:http://www.cnblogs.com/CodeGize/
  • 相关阅读:
    字符编码相关
    函数之形参与实参
    文件操作模式
    函数对象,名称空间,作用域,和闭包
    吴裕雄天生自然SPRINGBOOT开发实战处理'spring.datasource.url' is not specified and no embedded datasource could be autoconfigured
    吴裕雄天生自然SPRINGBOOT开发实战处理XXXX that could not be found.
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot HTML表单登录
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot REST示例
    吴裕雄天生自然SpringBoot开发实战学习笔记处理 Could not write metadata for '/Servers'.metadata\.plugins\org.eclipse.core.resources\.projects\Servers\.markers.snap (系统找不到指定的路径。)
    吴裕雄天生自然SPRINGBOOT开发实战SpringBoot Tomcat部署
  • 原文地址:https://www.cnblogs.com/CodeGize/p/11742156.html
Copyright © 2011-2022 走看看