【Unity】講解如何在Unity的Inspector面板中用滑動條來控制變數的大小
阿新 • • 發佈:2019-01-02
首先,我們現在的需求是這樣的,我定義了一個指令碼,裡面有一個int型別的變數,但是我想控制變數的大小在0到100之間,通過用滑動條的方式來控制。
其實這裡的player HP 是我使用了unity自帶的一個滑動條來讀取的值
‘玩家魔法值’在程式碼中的定義是playerMP,是我使用了自己自定義的一個方法來改的,看起來更直觀
再次首先,我先說一下這個工程裡一共有3個指令碼,分別是:
(1)ValueRangeExample.cs
(2)MyRangeAttribute.cs
(3)MyRangeAttributeDrawer.cs
哎哎哎,你的字怎麼分開了啊,打錯了吧!!!
哈,沒有打錯,故意空行的,指令碼(1)ValueRangeExample.cs我們是吧它掛載到了主攝像機的身上
(2)MyRangeAttribute.cs 和 (3)MyRangeAttributeDrawer.cs 哪裡都沒有掛載,他們兩個是對[MyRangeAttribute(0,100)]功能的編寫,看下面程式碼就懂啦~
(1)ValueRangeExample.cs:
(2)MyRangeAttribute.csusing UnityEngine; using System.Collections; /// <summary> /// 指令碼位置:掛載到主攝像機上 /// 指令碼功能:通過一個滑動條來控制變數值的大小 /// 建立時間:2015.07.26 /// </summary> public class ValueRangeExample : MonoBehaviour { // 【系統自帶功能】 // 這個Range是系統自帶的一個滑動條模式的取值範圍 // 在Inspector會顯示一個滑動條來控制變數,變數的名字預設讀取它下面第一個可以執行的行的程式碼 // 什麼叫可以執行的行的程式碼。。。它下一行是註釋的話就是不能執行的對吧。。。恩,就是這樣。。。 [Range(0,100)] public int playerHP; // -------------------------------------------- // 【自己編寫相同功能,並擴充套件可以定義文字】 // MyRangeAttribute就是我們的第二個指令碼 // MyRangeAttribute是一個繼承PropertyAttribute類的指令碼 [MyRangeAttribute(0,100,"玩家魔法值")] public int playerMP; }
其實只是繼承了PropertyAttribute類,什麼功能都沒有實現,功能的實現是在指令碼(3)MyRangeAttributeDrawer.cs中
(3)MyRangeAttributeDrawer.csusing UnityEngine; using System.Collections; /// <summary> /// 指令碼位置:要求放在Editor資料夾下,其實不放也可以執行 /// 指令碼功能:實現一個在Inspector面板中可以用滑動條來控制變數的大小 /// 建立事件:2015.07.26 /// </summary> public class MyRangeAttribute : PropertyAttribute { // 這3個變數是在Inspector面板中顯示的 public float min; // 定義一個float型別的最大 public float max; // 定義一個float型別的最大 public string label; // 顯示標籤 // 在指令碼(1)ValueRangeExample定義[MyRangeAttribute(0,100,"玩家魔法值")] // 就可以使用這個功能了,但是為什麼這裡的string label = ""呢 // 因為給了一個初值的話,在上面定義[MyRangeAttribute(0,100)]就不會報錯了,不會提示沒有2個引數的方法 public MyRangeAttribute(float min, float max,string label = "") { this.min = min; this.max = max; this.label = label; } }
using UnityEngine;
using System.Collections;
using UnityEditor; // 引入Editor名稱空間
// 使用繪製器,如果使用了[MyRangeAttribute(0,100,"lable")]這種自定義的屬性抽屜
// 就執行下面程式碼對MyRangeAttribute進行補充
[CustomPropertyDrawer(typeof(MyRangeAttribute))]
/// <summary>
/// 指令碼位置:要求放在Editor資料夾下,其實不放也可以執行
/// 指令碼功能:對MyRangeAttribute指令碼的功能實現
/// 建立事件:2015.07.26
/// </summary>
// 一定要繼承繪製器類 PropertyDrawer
public class MyRangeAttributeDrawer: PropertyDrawer {
// 重寫OnGUI的方法(座標,SerializedProperty 序列化屬性,顯示的文字)
public override void OnGUI(Rect position, SerializedProperty property, GUIContent lable)
{
// attribute 是PropertyAttribute類中的一個屬性
// 呼叫MyRangeAttribute中的最大和最小值還有文字資訊,用於繪製時候的顯示
MyRangeAttribute range = attribute as MyRangeAttribute;
// 判斷傳進來的值型別
if (property.propertyType == SerializedPropertyType.Float) {
EditorGUI.Slider(position, property, range.min, range.max, range.label);
} else if (property.propertyType == SerializedPropertyType.Integer) {
EditorGUI.IntSlider(position, property, (int)range.min, (int)range.max, range.label);
}
}
}