1. 程式人生 > >Unity Editor 基礎篇(七):Property Attributes自定義屬性

Unity Editor 基礎篇(七):Property Attributes自定義屬性

Property Attributes自定義屬性

目標:  1.瞭解一些基本的使用  2.自定義一個Property Attributes

最終效果:

這裡寫圖片描述

準備:

大夥們還記得《Unity Editor 基礎篇(一):Build-In Attribute》裡所說的東西嗎?如下圖所示:

這裡寫圖片描述

這篇文章講解自定義一個這樣的屬性:

建立一個新的工程或者用上一篇的工程都可以,然後在建立C#指令碼:

Scripts資料夾:     ReadOnlyAttribute.cs 自定義的屬性類(繼承PropertyAttribute)     Test.cs:測試使用自定義了的屬性的類

Editor資料夾:     ReadOnlyAttributeDrawer.cs自定義的屬性的繪製類     (繼承PropertyDrawer)

程式碼:

首先,開啟我們得“ReadOnlyAttribute.cs”指令碼,為其新增如下程式碼:

這裡寫圖片描述

這段程式碼很簡單,就是讓我們的“ReadOnlyAttribute”類繼承自“PropertyAttribute”類,該類的解釋如下圖所示:

這裡寫圖片描述

所以呢,由上圖便能知道我們接下來要做的事情了吧,那就是讓我們的“ReadOnlyAttributeDrawer”類繼承自PropertyDrawer類,然後重寫OnGUI和GetPropertyHeight方法,如下圖所示:

這裡寫圖片描述

上圖的程式碼在上一篇都有講解過,因此這裡不再做過多的贅述。

好的,接下來繼續為我們的“ReadOnlyAttributeDrawer.cs”的OnGUI方法新增如下程式碼:

這裡寫圖片描述

在上面的程式碼中,我們使用到了一個名為“SerializedPropertyType”的列舉,它存放的是序列化屬性的型別,它包含的型別很多,但是在該篇文章中我們只使用到了這幾個,感興趣的同學看可以去嘗試其它型別。

我們使用該列舉為value獲取相對應型別的值,然後使用一個Label在Inspector面板中繪製出來(\t為製表符同Tap鍵,為了美化顯示)。

好了,接下來開啟我們的“Test.cs”指令碼,新增如下程式碼:

這裡寫圖片描述

現在,讓我們回到Unity中檢視一下效果:

這裡寫圖片描述

這個。。。是不是很簡單呀。

接下來讓我們製作一個帶有引數的。

讓我們開啟我們的“ReadOnlyAttribute.cs”,新增如下程式碼:

這裡寫圖片描述

再讓我們為“ReadOnlyAttributeDrawer.cs”的OnGUI函式新增如下方法:

這裡寫圖片描述

上面的程式碼相信大夥們都能看懂,唯一有點迷惑的可能就是attribute 屬性了,其實它就是我們通過 [CustomPropertyDrawer(typeof(ReadOnlyAttribute))] 傳過來的ReadOnlyAttribute類,(寫成this.attribute可以好理解點)

因此樓主Debug了它的型別名字,接下來讓我們看看打印出來的資訊:

這裡寫圖片描述

好的,就是我們的 ReadOnlyAttribute 類。  對了樓主列印了 myAttribute.textColor 的值,是為了測試值是否正確的傳入。

好了,接下來開始測試,讓我們為我們的“Test.cs”指令碼新增如下程式碼:

這裡寫圖片描述

從上圖可知,其實[ReadOnlyAttribute(引數)] 傳入的引數對應的就是我們ReadOnlyAttribute類的建構函式需要傳入的引數。

好了,接下來讓我們回到Unity中檢視一下效果:

本人的效果:

這裡寫圖片描述

顏色和alaph設定都正常;

但是切換到個人版unity白底就跟下面樓主的類似了都是黑字,alaph正常,顏色不對。

原著樓主的效果:

這裡寫圖片描述

好了,大夥們可以看到,值已經完美的傳入了,效果並不是完美期望的那樣。但是我們的 My Int 的 Apha 值起作用了。  樓主對於這個Bug弄了一個晚上,最後發現原來是Unity5.x出的BUG,總之樓主今晚把Unity5.x版本都試得差不多了,還是一個鳥樣,最後Unity4.6版本妥妥得實現了我們想要得效果,下面有兩張圖,一張是樓主試過得版本,一張是Unity4.6實現得效果圖:

試過的版本

Unity4.6版本的效果

不知道大夥們的Unity5.x能否實現,其實樓主只是想用這個案例告訴大夥們 [xxxx(引數)] 裡的引數是這樣弄的,僅此而已喲。