1. 程式人生 > >【Unity】講解如何在Unity的Inspector面板中用滑動條來控制變數的大小

【Unity】講解如何在Unity的Inspector面板中用滑動條來控制變數的大小

首先,我們現在的需求是這樣的,我定義了一個指令碼,裡面有一個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:

using 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;
}
(2)MyRangeAttribute.cs

其實只是繼承了PropertyAttribute類,什麼功能都沒有實現,功能的實現是在指令碼(3)MyRangeAttributeDrawer.cs中

using 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;
	}
	
}
(3)MyRangeAttributeDrawer.cs
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);
		}
	}

}