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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Inspector a ProgressBar(定制属性面板)

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

一、定制進度條

這篇文章主要學習如何在Unity的Inspector中使用ProgressBar

普通屬性面板預覽

通常我們的屬性面板如下

定制屬性面板預覽

而通過擴展成ProcessBar后

二、內容簡介

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面板中會顯示相關的一些信息。默認情況下,Unity會自動為我們生成一個component編輯面板,他會把所有的public的變量顯示在Inspector中。如下圖:

四、自定義Inspector面板

屬性面板定制需求

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

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

創建MyActorInspector.cs

下面的代碼將會創建一個自定義的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"); //創建progressbar EditorGUI.ProgressBar(rect,value,label); //添加一個空行 EditorGUILayout.Space(); } }

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

問題思考

為什么要放在Editor文件夾下?Unity規定所有的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的關聯類的類型,我們這里要對MyActor類進行關聯。這行代碼的作用就是當您選中含有MyActor的GameObject時,就會顯示MyActorInspector。

[CustomEditor(typeof(MyActor))]

六、初始化

Editor class繼承自ScriptableObject,ScriptableObject有三個關于生命周期的消息響應函數:

  • OnEable
  • OnDisable
  • OnDestory

    對于MyActorInspector來說,每當要顯示自定義Inspector的時候就會調用OnEable,當切換到其他Inspector面板的時候就會調用OnDisable。所以OnEnable是進行初始化最好的地方。

    在下述的初始化代碼中,我們獲取了當前選中的對象的成員變量。

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

    在上述的代碼中,出現了一個新變量target,他代表了當前要進行Inspect的對象,在MyActorEditor類中,我們指定Inspect MyActor類,所以target就是當前MyActor的一個引用。我們使用as操作符先對target進行類型轉化。

    Edtior類還有兩個成員變量是用來表示當前選中的對象,他們分別叫做targets和serializedObject。

    七、繪制GUI

    如果您在游戲開發中使用過Unity自帶的GUI類,那么您會發現EditorGUI類接口同GUI基本是同樣的設計思路。所有的UI繪制必須放在OnInspectorGUI方法中,就好比在游戲中所與的GUI函數必須放在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會更具調用順序進行自動布局。在上述代碼中我就使用了EditorGUILayout創建progress bar和slider bar。

    八、總結

    我們在這一課中詳細介紹了創建一個自定義Inspector的詳細步驟。我們制作了一個簡單的Inspector面板,下一課我們會具體介紹更多的Editor class的功能。

    ?

    官方文檔:http://docs.unity3d.com/ScriptReference/Editor.html

    轉載自:http://blog.csdn.net/jiejieup/article/details/8299409

?

轉載于:https://www.cnblogs.com/zhaoqingqing/p/3963792.html

總結

以上是生活随笔為你收集整理的Inspector a ProgressBar(定制属性面板)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。