Inspector a ProgressBar(定制属性面板)
一、定制進度條
這篇文章主要學(xué)習(xí)如何在Unity的Inspector中使用ProgressBar
普通屬性面板預(yù)覽
通常我們的屬性面板如下
定制屬性面板預(yù)覽
而通過擴展成ProcessBar后
二、內(nèi)容簡介
Inspector面板可以用來對Component和Asset進行快速編輯。
如果您的Unity中沒有看到Inspector面板,可以通過快捷鍵方式 Ctrl+3 打開。
這篇文章我們將對一個類制作一個自定義的Inspector面板。
三、默認的Inspector樣式
MyActor.cs
新建一個C#文件,命名為MyActor.cs,輸入下面的代碼。這些代碼定義了一個MyActor class,它繼承自MonoBehaviour,是一個用戶自定義的component。
using UnityEngine; using System.Collections; ? public class MyActor : MonoBehaviour { public int LuckyPoint = 3; public int ATK = 75; // Use this for initialization void Start () { } // Update is called once per frame void Update () { } }問題思考
是不是只有派生自MonoBehaviour的類才能夠進行自定義化Inspector?
不是,例如貼圖,模型等不用附加到GameObject上的資源文件,可以在Project面板下顯示并選中,在Inspecotor面板中會列出這些資源的屬性,并且可以進行修改。
如果您也要自定義asset,需要繼承自ScriptableObject class。
您可以在Project面板中選擇一個FBX文件,或者一個Texture文件,查看Inspector的變化。自定義資源和Inspector會在以后的課程中進行講解。
然后我們在場景中新建一個GameObject,將上面的腳本添加到該GameObject上。 如果一個GameObject擁有該component,那么在Inspector面板中會顯示相關(guān)的一些信息。默認情況下,Unity會自動為我們生成一個component編輯面板,他會把所有的public的變量顯示在Inspector中。如下圖:
四、自定義Inspector面板
屬性面板定制需求
Unity默認的Inspector面板可以隨意對該變量進行修改。如果MyActor類中的這些變量對輸入的數(shù)值有范圍要求,例如只能輸入0到100,這在默認的輸入框下是無法做到的。但在自定義Inspector中,我們可以使用slider bar控件對輸入范圍進行限制。如果這個MyActor最后是要給關(guān)卡設(shè)計師使用,他就不可能輸入一些無效的數(shù)值。下圖為自定義后的Inspector,可以看到我們用slider bar代替了原來的輸入框,并且設(shè)置slider bar的輸入數(shù)值的范圍為0到100,還加入了一個progress bar顯示數(shù)值的范圍。通過自定義Inspector就能制作適合各種類型的component的Inspector。
現(xiàn)在我們開始自定義Inspector面板的內(nèi)容,自定義后的Inspector如上圖所示。 首先創(chuàng)建一個新的C#文件,命名為MyActorInspector.cs,并將該文件放在Editor文件夾下。
創(chuàng)建MyActorInspector.cs
下面的代碼將會創(chuàng)建一個自定義的Inspector,你將會在Inspector面板中看到最后的效果。
using UnityEditor; using UnityEngine; ? [CustomEditor(typeof(MyActor))] public class MyActorInspector : Editor { public int ATKProp; public int LuckyPointProp; ? void OnEnable() { MyActor myActor = target as MyActor; ATKProp = myActor.ATK; LuckyPointProp = myActor.LuckyPoint; } ? public override void OnInspectorGUI() { ATKProp = EditorGUILayout.IntSlider("ATK", ATKProp, 0, 100); ProgressBar((ATKProp/100.0f),"ATK"); ? LuckyPointProp = EditorGUILayout.IntSlider("Lucky Point", LuckyPointProp, 0, 5); ProgressBar((LuckyPointProp/5.0f), "Lucky Point"); } ? private void ProgressBar(float value, string label) { //定義 Rect Rect rect = GUILayoutUtility.GetRect(18, 18, "TextField"); //創(chuàng)建progressbar EditorGUI.ProgressBar(rect,value,label); //添加一個空行 EditorGUILayout.Space(); } }然后打開Unity編輯器,選中GameObject,您就能看到自定義Inspector面板的內(nèi)容了
問題思考
為什么要放在Editor文件夾下?Unity規(guī)定所有的Editor classes都必須放在Editor文件夾下,這樣Untiy運行Editor文件夾的Editor class,游戲中運行的代碼不要放在Editor文件夾下。
下面對這MyActoorInspector類進行詳細講解。
五、Editor class
CustomEditor
Editor class是所有自定義Inspector的基類。我們必需從Editor class開始派生我們自己的Inspector。
[CustomEditor(typeof(MyActor))] public class MyActorInspector : Editor下面這行代碼指定了自定義Inspector的關(guān)聯(lián)類的類型,我們這里要對MyActor類進行關(guān)聯(lián)。這行代碼的作用就是當您選中含有MyActor的GameObject時,就會顯示MyActorInspector。
[CustomEditor(typeof(MyActor))]
六、初始化
Editor class繼承自ScriptableObject,ScriptableObject有三個關(guān)于生命周期的消息響應(yīng)函數(shù):
- OnEable
- OnDisable
- OnDestory
對于MyActorInspector來說,每當要顯示自定義Inspector的時候就會調(diào)用OnEable,當切換到其他Inspector面板的時候就會調(diào)用OnDisable。所以O(shè)nEnable是進行初始化最好的地方。
在下述的初始化代碼中,我們獲取了當前選中的對象的成員變量。
void OnEnable() { MyActor myActor = target as MyActor; ATKProp = myActor.ATK; LuckyPointProp = myActor.LuckyPoint; }在上述的代碼中,出現(xiàn)了一個新變量target,他代表了當前要進行Inspect的對象,在MyActorEditor類中,我們指定Inspect MyActor類,所以target就是當前MyActor的一個引用。我們使用as操作符先對target進行類型轉(zhuǎn)化。
Edtior類還有兩個成員變量是用來表示當前選中的對象,他們分別叫做targets和serializedObject。
七、繪制GUI
如果您在游戲開發(fā)中使用過Unity自帶的GUI類,那么您會發(fā)現(xiàn)EditorGUI類接口同GUI基本是同樣的設(shè)計思路。所有的UI繪制必須放在OnInspectorGUI方法中,就好比在游戲中所與的GUI函數(shù)必須放在OnGUI方法中。
OnInspectorGUI
Unity Editor->OnInspectorGUI()
public override void OnInspectorGUI() { ATKProp = EditorGUILayout.IntSlider("ATK", ATKProp, 0, 100); ProgressBar((ATKProp/100.0f),"ATK"); ? LuckyPointProp = EditorGUILayout.IntSlider("Lucky Point", LuckyPointProp, 0, 5); ProgressBar((LuckyPointProp/5.0f), "Lucky Point"); }Unity Engine->OnGUI()
void OnGUI()
{ GUILayout.BeginHorizontal(); animTime = GUILayout.TextField(animTime.ToString(), GUILayout.Width(100)).ToInt32(); if (GUILayout.Button("Start 1")) { StartCoroutine(BeginAnim(animTime)); } GUILayout.EndHorizontal(); if (GUILayout.Button("IsFull")) { NGUIDebug.Log("" + IsFull()); } }EditorGUI類有一個方便布局的版本,叫做EditorGUILayout。使用EdiorGUILayout可以不用指定每個控件的坐標位置從而省去了每次進行計算坐標的苦差事。EditorGUILayout會更具調(diào)用順序進行自動布局。在上述代碼中我就使用了EditorGUILayout創(chuàng)建progress bar和slider bar。
八、總結(jié)
我們在這一課中詳細介紹了創(chuàng)建一個自定義Inspector的詳細步驟。我們制作了一個簡單的Inspector面板,下一課我們會具體介紹更多的Editor class的功能。
?
官方文檔:http://docs.unity3d.com/ScriptReference/Editor.html
轉(zhuǎn)載自:http://blog.csdn.net/jiejieup/article/details/8299409
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhaoqingqing/p/3963792.html
總結(jié)
以上是生活随笔為你收集整理的Inspector a ProgressBar(定制属性面板)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Struts ActionForm简单理
- 下一篇: Fix Missing Scripts