EditorWindow生命周期


OnEnable():当打开界面的时候调用
OnFocus():当被聚焦的时候调用
OnGUI():当渲染UI的时候调用
OnSelectionChange():当选择发生更改时调用,选中的可选项(在Project和Hierarchy视图中)

OnLostFocus():当失去焦点时调用

OnInspectorUpdate():当属性界面更新时,几乎一直在更新

OnHierarchyChange():当场景层次界面发生改变时调用");//在Hierarchy界面改变(增加、减少物体)

OnProjectChange():当项目发生更改时调用");//在Project视图删除、增加文件

OnDisable():当隐藏的时候调用

OnDestroy():当销毁的时候调用

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class DemoEditorWindow : EditorWindow {
 
    [MenuItem("CustomTools/Demo")]
    public static void OpenWindow()
    {
        EditorWindow.GetWindow<DemoEditorWindow>();
    }
 
    private void OnEnable()
    {
        Debug.Log("当打开界面的时候调用");
    }
 
    private void OnInspectorUpdate()
    {
 
        Debug.Log("当属性界面更新时");//几乎一直在更新
    }
 
    private void OnHierarchyChange()
    {
        Debug.Log("当场景层次界面发生改变时调用");//在Hierarchy界面改变(增加、减少物体)
    }
 
    private void OnProjectChange()
    {
        Debug.Log("当项目发生更改时调用");//在Project视图删除、增加文件
    }
 
    private void OnGUI()
    {
        Debug.Log("当渲染UI的时候调用");
    }
 
    private void OnFocus()
    {
        Debug.Log("当被聚焦的时候调用");
    }
 
    private void OnSelectionChange()
    {
        Debug.Log("当选择发生更改时调用");//选中的可选项(在Project和Hierarchy视图中)
    }
 
    private void OnLostFocus()
    {
        Debug.Log("当失去焦点时调用");
    }
 
    private void OnDisable()
    {
        Debug.Log("当隐藏的时候调用");
    }
 
    private void OnDestroy()
    {
        Debug.Log("当销毁的时候调用");
    }
 
}



进度条

//进度条展示
string s = progress * 100 + "%";
EditorUtility.DisplayProgressBar("进度", s, progress);

//加载完毕,记得关闭进度条(重要)
EditorUtility.ClearProgressBar();

EditorWindow 窗口大小设置

EditorWindow ew = EditorWindow.GetWindow(typeof(FightCompareEditor));
ew.minSize = new Vector2(700, 900);
ew.maxSize = new Vector2(800, 1000);

label字体颜色、字体大小设置

var _labelStyle = new GUIStyle(EditorStyles.label);
_labelStyle.normal.textColor = Color.red;
_labelStyle.fontSize = 20;

GUILayout.Label("第一步", _labelStyle);

画一条水平的虚线

void drawline(Color c)
{
    _colorStyle.normal.textColor = c;
    int len = Screen.width / 6;

    EditorGUILayout.BeginHorizontal();

    for (int i = 0; i < len; i++)
        GUILayout.Label("┅", _colorStyle);

    EditorGUILayout.EndHorizontal();
}

  1. EditorWindow 刷新

因为 OnGUI() 方法是事件驱动的,而非刷帧,见EditorWindow.OnGUI()。因此若需要定时刷新,可以如下:

private void Update()
{
    Repaint();
}




1.创建EditorWindow

using UnityEditor;
using UnityEngine;

public class ZZEditorWindow : EditorWindow
{
    [MenuItem("ZZTest/CreateWindows")]
    static void ZZTestCreateWindow()
    {
        ZZEditorWindow zzWindow = EditorWindow.GetWindow(typeof(ZZEditorWindow), false, "ZZTestWindow", false) as ZZEditorWindow;
        zzWindow.Show();
    }

    void OnEnable()
    {
        Debug.Log("ZZEditorWindow->OnEnable");
    }
}
public static EditorWindow GetWindow(System.Type t, [DefaultValue("false")] bool utility, [DefaultValue("null")] string title, [DefaultValue("true")] bool focus)
{
  return EditorWindow.GetWindowPrivate(t, utility, title, focus);
}

第一个参数是窗口类型,注意是一定要继承自EditorWindow。

第二个参数是窗口是否浮动,如果是就不能内嵌到unity其他窗口中去,如果不是就能嵌入其他窗口。默认是内嵌

第三个参数是窗口的标题,如果为空的话就采用类的名称来当标题。默认是空

第四个参数是窗口是否是焦点 默认是焦点


2.静态属性

focusedWindow 目前有键盘焦点的EditorWindow。(只读)

mouseOverWindow EditorWindow目前在鼠标光标下。(只读)


3.属性

autoRepaintOnSceneChange    每当场景改变时,窗口是否自动重绘?
maximized             这个窗口最大化了吗?
maxSize              这个窗口的最大尺寸。
minSize              这个窗口的最小尺寸。
position              窗口在屏幕空间中的所需位置。
titleContent            用于绘制EditorWindows标题的GUIContent。
wantsMouseEnterLeaveWindow   检查在此编辑器窗口的GUI中是否接收到MouseEnterWindow和MouseLeaveWindow事件。
wantsMouseMove         检查在此编辑器窗口的GUI中是否收到MouseMove事件。


4.公共方法

BeginWindows      标记所有弹出窗口的开始区域。
Close          关闭编辑器窗口。
EndWindows      关闭一个以EditorWindow.BeginWindows开始的窗口组。
Focus          将键盘焦点移到另一个EditorWindow。
RemoveNotification    停止显示通知消息。
Repaint         使窗口重绘。
SendEvent        发送一个事件到一个窗口。
Show          显示EditorWindow。
ShowAsDropDown    显示具有下拉行为和样式的窗口。
ShowAuxWindow     在辅助窗口中显示编辑器窗口。
ShowNotification     显示通知消息。
ShowPopup      使用弹出式框架显示编辑器窗口。
ShowUtility        将EditorWindow显示为浮动实用程序窗口。


5.静态方法

FocusWindowIfItsOpen 如果它是打开的,重点指定类型的第一个找到的EditorWindow。
GetWindow       返回当前在屏幕上的类型t的第一个EditorWindow。
GetWindowWithRect 返回当前在屏幕上的类型t的第一个EditorWindow。


6.消息

Awake        在新窗口打开时调用。
OnDestroy       调用OnDestroy关闭EditorWindow窗口。
OnFocus   当窗口获得键盘焦点时调用。
OnGUI   在这里实现你自己的编辑器GUI。
OnHierarchyChange   当层次结构中的一个对象或一组对象发生变化时发送的消息的处理程序。
OnInspectorUpdate   OnInspectorUpdate以每秒10帧的速度调用,以便检查员有机会进行更新。
OnLostFocus   当窗口失去键盘焦点时调用。
OnProjectChange 每当项目状态发生变化时发送消息的处理程序。
OnSelectionChange   每当选择发生变化时调用。
Update         在所有可见的窗口上每秒调用多次。


7.继承的成员

7.1 属性
hideFlags  该物体应该隐藏,保存在场景中还是用户可以修改?
name     对象的名称

7.2 公共方法
GetInstanceID   返回对象的实例ID。
ToString     返回游戏对象的名称。

7.3 静态方法
Destroy        删除一个游戏对象,组件或资产。
DestroyImmediate    立即销毁obj对象。强烈建议您改用Destroy。
DontDestroyOnLoad    加载新场景时,使对象目标不会自动销毁。
FindObjectOfType    返回Type类型的第一个活动加载的对象。
FindObjectsOfType    返回Type类型的所有活动加载对象的列表。
Instantiate        克隆原始对象并返回克隆。
CreateInstance      创建可脚本化对象的实例。

7.4 操作符
bool       对象是否存在?
operator!=    比较两个对象是否引用不同的对象。
operator== 比较两个对象引用,看它们是否引用同一个对象。

7.5 消息
Awake     这个函数在ScriptableObject脚本启动时被调用。
OnDisable    这个函数在脚本对象超出范围时被调用。
OnEnable    这个函数在对象加载时被调用。

实用的方法:

private List<string> logsList = new List<string>();
  private string logText = "这是一条测试的Log,id=";
  private int logIdx = 0;
  private Vector2 scrollPos;
  private bool isFoldoutLogs = true;
  private bool isFoldoutItem = true;
  private string configName = "111111";
 
  private void OnGUI()
  {
      isFoldoutLogs = EditorGUILayout.Foldout(isFoldoutLogs, "提示信息:");
      if (isFoldoutLogs)
      {
          scrollView();
      }
 
      isFoldoutItem = EditorGUILayout.Foldout(isFoldoutItem, "可以选择的Item:");
      if (isFoldoutItem)
      {
          scrollViewItem();
      }
 
      button();
 
      configName = EditorGUILayout.TextField("配置名", configName);
  }
 
  private void scrollView()
  {
      EditorGUI.indentLevel = 1;
      scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandHeight(false));
      for (int i = 0; i < logsList.Count; i++)
      {
          EditorGUILayout.LabelField(logsList[i]);
      }
 
      GUILayout.EndScrollView();
  }
 
  private void scrollViewItem()
  {
      EditorGUI.indentLevel = 1;
      scrollPos = EditorGUILayout.BeginScrollView(scrollPos, GUILayout.ExpandHeight(false));
      for (int i = 0; i < logsList.Count; i++)
      {
          EditorGUI.indentLevel = 2;
          EditorGUILayout.BeginHorizontal();
          EditorGUILayout.LabelField(logsList[i]);
          if (GUILayout.Button("删除"))
          {
              logsList.RemoveAt(i);
              continue;
          }
 
          EditorGUILayout.EndHorizontal();
      }
 
      GUILayout.EndScrollView();
  }
 
  private void button()
  {
      EditorGUILayout.BeginHorizontal();
      if (GUILayout.Button("增加Log"))
      {
          logsList.Add(logText + logIdx);
          logIdx++;
      }
 
      if (GUILayout.Button("删除Log"))
      {
          logsList.RemoveAt(logsList.Count - 1);
          logIdx--;
      }
  }
最后编辑于
?著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,029评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,238评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事?!?“怎么了?”我有些...
    开封第一讲书人阅读 159,576评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,214评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,324评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,392评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,416评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,196评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,631评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,919评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,090评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,767评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,410评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,090评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,328评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,952评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,979评论 2 351

推荐阅读更多精彩内容

  • Unity中脚本的生命周期就是代码中脚本函数的执行过程(顺序),具体过程由图1.1,1.2和1.3介绍: 这里我们...
    S_H_C阅读 1,691评论 0 2
  • 图1是完整的 图2-3-4是完整的. 1:Reset 是在用户点击检视面板的 Reset 按钮或者首次添加该组件时...
    诸子百家谁的天下阅读 270评论 0 0
  • 一、下面我们来学习下脚本生命周期常用的10个脚本函数: (1) Reset() 组件重设为默认值时(只用于编辑状态...
    李昀熹1112阅读 22,491评论 0 12
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,094评论 1 32
  • Unity编辑器基础 1.请描述游戏动画有几种,以及其原理。 主要有关节动画、单一网格模型动画(关键帧动画)、骨骼...
    豆铮阅读 4,499评论 0 6