日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Inspector a ProgressBar(定制属性面板)

發(fā)布時(shí)間:2025/1/21 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Inspector a ProgressBar(定制属性面板) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、定制進(jìn)度條

這篇文章主要學(xué)習(xí)如何在Unity的Inspector中使用ProgressBar

普通屬性面板預(yù)覽

通常我們的屬性面板如下

定制屬性面板預(yù)覽

而通過擴(kuò)展成ProcessBar后

二、內(nèi)容簡(jiǎn)介

Inspector面板可以用來對(duì)Component和Asset進(jìn)行快速編輯。

如果您的Unity中沒有看到Inspector面板,可以通過快捷鍵方式 Ctrl+3 打開。

這篇文章我們將對(duì)一個(gè)類制作一個(gè)自定義的Inspector面板。

三、默認(rèn)的Inspector樣式

MyActor.cs

新建一個(gè)C#文件,命名為MyActor.cs,輸入下面的代碼。這些代碼定義了一個(gè)MyActor class,它繼承自MonoBehaviour,是一個(gè)用戶自定義的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的類才能夠進(jìn)行自定義化Inspector?

不是,例如貼圖,模型等不用附加到GameObject上的資源文件,可以在Project面板下顯示并選中,在Inspecotor面板中會(huì)列出這些資源的屬性,并且可以進(jìn)行修改。

如果您也要自定義asset,需要繼承自ScriptableObject class。

您可以在Project面板中選擇一個(gè)FBX文件,或者一個(gè)Texture文件,查看Inspector的變化。自定義資源和Inspector會(huì)在以后的課程中進(jìn)行講解。

然后我們?cè)趫?chǎng)景中新建一個(gè)GameObject,將上面的腳本添加到該GameObject上。 如果一個(gè)GameObject擁有該component,那么在Inspector面板中會(huì)顯示相關(guān)的一些信息。默認(rèn)情況下,Unity會(huì)自動(dòng)為我們生成一個(gè)component編輯面板,他會(huì)把所有的public的變量顯示在Inspector中。如下圖:

四、自定義Inspector面板

屬性面板定制需求

Unity默認(rèn)的Inspector面板可以隨意對(duì)該變量進(jìn)行修改。如果MyActor類中的這些變量對(duì)輸入的數(shù)值有范圍要求,例如只能輸入0到100,這在默認(rèn)的輸入框下是無法做到的。但在自定義Inspector中,我們可以使用slider bar控件對(duì)輸入范圍進(jìn)行限制。如果這個(gè)MyActor最后是要給關(guān)卡設(shè)計(jì)師使用,他就不可能輸入一些無效的數(shù)值。下圖為自定義后的Inspector,可以看到我們用slider bar代替了原來的輸入框,并且設(shè)置slider bar的輸入數(shù)值的范圍為0到100,還加入了一個(gè)progress bar顯示數(shù)值的范圍。通過自定義Inspector就能制作適合各種類型的component的Inspector。

現(xiàn)在我們開始自定義Inspector面板的內(nèi)容,自定義后的Inspector如上圖所示。 首先創(chuàng)建一個(gè)新的C#文件,命名為MyActorInspector.cs,并將該文件放在Editor文件夾下。

創(chuàng)建MyActorInspector.cs

下面的代碼將會(huì)創(chuàng)建一個(gè)自定義的Inspector,你將會(huì)在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); //添加一個(gè)空行 EditorGUILayout.Space(); } }

然后打開Unity編輯器,選中GameObject,您就能看到自定義Inspector面板的內(nèi)容了

問題思考

為什么要放在Editor文件夾下?Unity規(guī)定所有的Editor classes都必須放在Editor文件夾下,這樣Untiy運(yùn)行Editor文件夾的Editor class,游戲中運(yùn)行的代碼不要放在Editor文件夾下。

下面對(duì)這MyActoorInspector類進(jìn)行詳細(xì)講解。

五、Editor class

CustomEditor

Editor class是所有自定義Inspector的基類。我們必需從Editor class開始派生我們自己的Inspector。

[CustomEditor(typeof(MyActor))] public class MyActorInspector : Editor

下面這行代碼指定了自定義Inspector的關(guān)聯(lián)類的類型,我們這里要對(duì)MyActor類進(jìn)行關(guān)聯(lián)。這行代碼的作用就是當(dāng)您選中含有MyActor的GameObject時(shí),就會(huì)顯示MyActorInspector。

[CustomEditor(typeof(MyActor))]

六、初始化

Editor class繼承自ScriptableObject,ScriptableObject有三個(gè)關(guān)于生命周期的消息響應(yīng)函數(shù):

  • OnEable
  • OnDisable
  • OnDestory

    對(duì)于MyActorInspector來說,每當(dāng)要顯示自定義Inspector的時(shí)候就會(huì)調(diào)用OnEable,當(dāng)切換到其他Inspector面板的時(shí)候就會(huì)調(diào)用OnDisable。所以O(shè)nEnable是進(jìn)行初始化最好的地方。

    在下述的初始化代碼中,我們獲取了當(dāng)前選中的對(duì)象的成員變量。

    void OnEnable() { MyActor myActor = target as MyActor; ATKProp = myActor.ATK; LuckyPointProp = myActor.LuckyPoint; }

    在上述的代碼中,出現(xiàn)了一個(gè)新變量target,他代表了當(dāng)前要進(jìn)行Inspect的對(duì)象,在MyActorEditor類中,我們指定Inspect MyActor類,所以target就是當(dāng)前MyActor的一個(gè)引用。我們使用as操作符先對(duì)target進(jìn)行類型轉(zhuǎn)化。

    Edtior類還有兩個(gè)成員變量是用來表示當(dāng)前選中的對(duì)象,他們分別叫做targets和serializedObject。

    七、繪制GUI

    如果您在游戲開發(fā)中使用過Unity自帶的GUI類,那么您會(huì)發(fā)現(xiàn)EditorGUI類接口同GUI基本是同樣的設(shè)計(jì)思路。所有的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類有一個(gè)方便布局的版本,叫做EditorGUILayout。使用EdiorGUILayout可以不用指定每個(gè)控件的坐標(biāo)位置從而省去了每次進(jìn)行計(jì)算坐標(biāo)的苦差事。EditorGUILayout會(huì)更具調(diào)用順序進(jìn)行自動(dòng)布局。在上述代碼中我就使用了EditorGUILayout創(chuàng)建progress bar和slider bar。

    八、總結(jié)

    我們?cè)谶@一課中詳細(xì)介紹了創(chuàng)建一個(gè)自定義Inspector的詳細(xì)步驟。我們制作了一個(gè)簡(jiǎn)單的Inspector面板,下一課我們會(huì)具體介紹更多的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(定制属性面板)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。