Unity编辑器扩展 Chapter3--Create Custom Inspector

一、Create Custom Inspector

重绘inspector面板一方面是我们的挂在脚本的窗口变得友好,另一方面可以让其变得更强大,比如添加一些有效性验证。

二、重要说明

1.EditorUtility.SetDirty(object target):该方法可以表明target对象为dirty((⊙﹏⊙)b,怎么翻译合适?)的,unity会将有dirty标记的已经改变的对象在磁盘中存储,可以用来对一些修改数据的强制刷新,这里用来立即绘制GUI(我们对GUI的修改不会立即生效,只有鼠标在Scene上时才会强制重绘界面元素)。

2.对于类似GUI.Style等静态属性的修改,在修改前需要备份,使用后在设回,避免修改后的对其他无需使用修改后属性的干扰。

3.布局中的GUILayout.BeginVertical等需成对出现,有始有终。

4.该类型的脚本都需放在Editor文件夹下,unity会自动调用。

三、Code

  1 using UnityEngine;
  2 using System.Collections;
  3 using UnityEditor;
  4 
  5 namespace RunAndJump.LeveCreator
  6 {
  7     //[CanEditMultipleObjects]  //希望多个挂在该类的对象可以在inspector面板选定多个一同修改的话
  8     //需要将该标签添加上,由于level类一个场景下只有一个,所以无需添加该标记
  9     [CustomEditor(typeof(Level))]
 10     public class LevelInspector : Editor
 11     {
 12         private Level _myTarget;
 13         private int _newTotalColumns;
 14         private int _newTotalRows;
 15 
 16         private void OnEnable()
 17         {
 18             Debug.Log("OnEnable was called...");
 19             _myTarget = (Level)target;
 20             InitLevel();
 21             ResetResizeValues();
 22         }
 23         
 24         private void OnDisable()
 25         {
 26             Debug.Log("OnDisable was called...");
 27         }
 28 
 29         private void OnDestory()
 30         {
 31             Debug.Log("OnDestroy was called...");
 32         }
 33 
 34         public override void OnInspectorGUI()
 35         {
 36             EditorGUILayout.LabelField("The GUI of this inspector was modified.");
 37             EditorGUILayout.LabelField("The current level time is:"+_myTarget.TotalTime);
 38 
 39 //            DrawDefaultInspector();//使用unity默认的绘制方式来显示Inspector面板
 40             DrawDateGUI();
 41             DrawLevelSizeGUI();
 42 
 43             //当使用绘制面板方法并且GUI改变时刷新GUI页面
 44             if(GUI.changed)
 45                 EditorUtility.SetDirty(_myTarget);
 46         }
 47 
 48         private void DrawLevelSizeGUI()
 49         {
 50             EditorGUILayout.LabelField("Size",EditorStyles.boldLabel);
 51             EditorGUILayout.BeginHorizontal("box");
 52             EditorGUILayout.BeginVertical();
 53             _newTotalColumns = EditorGUILayout.IntField("Columns", Mathf.Max(0, _newTotalColumns));
 54             _newTotalRows = EditorGUILayout.IntField("Rows", Mathf.Max(0, _newTotalRows));
 55             EditorGUILayout.EndVertical();
 56             EditorGUILayout.BeginVertical();
 57 
 58             bool oldEnable = GUI.enabled;
 59             GUI.enabled = (_newTotalColumns != _myTarget.TotalColumns || _newTotalRows != _myTarget.TotalRows);
 60             bool buttonResize = GUILayout.Button("Resize", GUILayout.Height(2*EditorGUIUtility.singleLineHeight));
 61             if (buttonResize)
 62             {
 63                 if (EditorUtility.DisplayDialog(
 64                     "Level Creator",
 65                     "Are you sure you want to resize the leve?\nThis action cannot be undone",
 66                     "yes",
 67                     "no"
 68                     ))
 69                 {
 70                     ResizeLeve();
 71                 }
 72                 
 73             }
 74 
 75             bool buttonReset = GUILayout.Button("Reset");
 76             if (buttonReset)
 77             {
 78                 ResetResizeValues();
 79             }
 80             GUI.enabled = oldEnable;
 81 
 82             EditorGUILayout.EndVertical();
 83             EditorGUILayout.EndHorizontal();
 84         }
 85 
 86         private void InitLevel()
 87         {
 88             if (_myTarget.Pieces == null || _myTarget.Pieces.Length == 0)
 89             {
 90                 Debug.Log("Initializing thie Pieces array...");
 91                 _myTarget.Pieces=new LevelPiece[_myTarget.TotalColumns*_myTarget.TotalRows];
 92             }
 93         }
 94 
 95         private void ResetResizeValues()
 96         {
 97             _newTotalColumns = _myTarget.TotalColumns;
 98             _newTotalRows = _myTarget.TotalRows;
 99         }
100 
101         private void ResizeLeve()
102         {
103             LevelPiece[] newPieces=new LevelPiece[_newTotalColumns*_newTotalRows];
104             for (int col = 0; col < _myTarget.TotalColumns; ++col)
105             {
106                 for (int row = 0; row < _myTarget.TotalRows; ++row)
107                 {
108                     if (col < _newTotalColumns && row < _newTotalRows)
109                     {
110                         newPieces[col + row*_newTotalColumns] = _myTarget.Pieces[col + row*_myTarget.TotalColumns];
111                     }
112                     else
113                     {
114                         LevelPiece piece = _myTarget.Pieces[col+row*_myTarget.TotalColumns];
115                         if (piece != null)
116                         {
117                             //在editor模式下我们必须使用DestroyImmediate
118                             Object.DestroyImmediate(piece.gameObject);
119                         }
120                     }
121                 }
122             }
123             _myTarget.Pieces = newPieces;
124             _myTarget.TotalColumns = _newTotalColumns;
125             _myTarget.TotalRows = _newTotalRows;
126         }
127 
128         private void DrawDateGUI()
129         {
130             EditorGUILayout.LabelField("Data",EditorStyles.boldLabel);
131             EditorGUILayout.BeginVertical("box");
132             _myTarget.TotalTime = EditorGUILayout.IntField("Total Time", Mathf.Max(0, _myTarget.TotalTime));
133             _myTarget.Gravity = EditorGUILayout.FloatField("Gravity", _myTarget.Gravity);
134             _myTarget.Bgm = (AudioClip) EditorGUILayout.ObjectField("Bgm", _myTarget.Bgm, typeof (AudioClip), false);
135             _myTarget.Background =
136                 (Sprite) EditorGUILayout.ObjectField("Background", _myTarget.Background, typeof (Sprite), false);
137             EditorGUILayout.EndVertical();
138         }
139     }
140 }

四、效果

前:                    后:

    

 

转载于:https://www.cnblogs.com/Firepad-magic/p/6624091.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值