前情提要:第二种打包方式

窗口初现

通过前面的两篇教程和一篇番外,我们已经完全实现了打包的功能。但是使用起来总是觉得有些晦涩别扭,如果不告诉别人怎么使用,对方肯定是一头雾水。

What?你给我的这是啥??

当你亲自演示了如何操作时,对方...

这也就是前面的教程将操作过程写的那么详细的原因(当然,高手请忽略)。

Unity除了提供常规API以外,还提供了一系列窗口编程的API,这就意味着我们可以轻松创建自定义窗口,扩展编辑器功能,可以说是很方便了。今天的任务就是在Unity中创建一个自定义的窗口,通过菜单调出窗口。

如果要在Unity中创建自定义的窗口,我们的脚本需要继承自EditorWindow这个类。然后添加如下代码↓↓

  [MenuItem("AssetBundle/Build")]static void Init () {
  ​
      //创建窗口对象
      PackageAssetBundle window = EditorWindow.GetWindow (typeof(PackageAssetBundle)) as PackageAssetBundle;
      //显示窗口
      window.Show ();
  }

PackageAssetBundle是当前我们写的类的名字,现在点击菜单AssetBundle→Build,你就会看到一个窗口跃然屏上。

当然这个窗口里面还空空如也,窗口的名字就是类名。下面先说说GetWindow这个函数↓↓

  
  public static EditorWindow GetWindow(Type t, bool utility = false, string title = null, bool focus = true);

EditorWindow是基类,这个函数的第一个参数是派生类类型,后面三个参数都有默认值,可以填,也可以不填。但是如果填的话,千万不要把第二个参数带入true,相信我!第三个参数是窗口标题,第四个参数表示是否获得焦点。最后函数返回一个窗口对象,调用窗口对象的Show方法,窗口就显示出来了。

设置窗口标题

除了在创建窗口的时候设置标题以外,我们也可以在构造函数或者OnEnable函数中设置窗口标题↓↓

  
  void OnEnable() {
      GUIContent title = new GUIContent ("My Window");    this.titleContent = title;
  ​
  }

OnEnable是基类的消息函数,会在窗口对象创建的时候调用一次。

那么问题来了,如何往窗口中添加控件呢??

别急,基类的消息函数除了OnEnable之外,还有OnGUI,这个函数就是用来绘制窗口控件的,我们可以将要显示的控件在这个函数中创建。

比如我们首先实现这样一个功能:我们在打包的时候需要选择打包输出的文件路径,我们在窗口中添加一个输入框,提示用户输入一个路径。看代码↓↓

  
  string path; //文件路径void OnGUI() {
  ​
      path = EditorGUILayout.TextField("输入文件路径:", path);
  }

EditorGUILayout.TextField函数用来创建一个输入框,第一个参数是输入框前的提示字符,第二个参数是一个字符串变量,这个字符串会显示在输入框中,它的返回值是输入框中的内容。这里我们将返回值和第二个参数都给到path变量,这样path变量中就存储了我们输入的内容。

之前还有一个选择文件路径的功能,这里我们也给加上。只需要在创建一个按钮,当点击按钮的时候执行选择文件的代码就OK了↓↓

  
  string path; //文件路径void OnGUI() {
  ​
      path = EditorGUILayout.TextField("输入文件路径:", path);
      if(GUILayout.Button("选择文件") {
          path = UnityEditor.EditorUtility.SaveFolderPanel("选择保存文件夹", "C:/", "");
      }
  }

GUILayout.Button会创建一个按钮,当按钮被点击时,返回true。

但是这时打开窗口你会发现按钮被创建在输入框的下面,我们希望的是按钮可以和输入框在同一行,我们可以用GUILayout.BeginHorizontal来将它们显示在同一行↓↓

  string path; //文件路径void OnGUI() {
  ​
      GUILayout.BeginHorizontal();
      path = EditorGUILayout.TextField("输入文件路径:", path);  if(GUILayout.Button("选择文件", GUILayou.width(80)) {
  ​
          path = UnityEditor.EditorUtility.SaveFolderPanel("选择保存文件夹", "C:/", ""); }
  ​
      GUILayout.EndHorizontal();
  }

好了,现在它们都乖乖的在一行显示了,最后那个Button函数里加了一个限制宽度的参数,否则按钮会很长。

今天就到这儿了,虽然还很简陋,但好歹看到窗口初现了,后面会逐步完善这个窗口。

下期见啦~