1. 程式人生 > 其它 >編輯器擴充套件_Unity3D 編輯器擴充套件 強大的OnValidate

編輯器擴充套件_Unity3D 編輯器擴充套件 強大的OnValidate

技術標籤:編輯器擴充套件

需要驗證一些資料

我們都知道,搭建建立的編輯器擴充套件指令碼,基本上都是給關卡設計或者策劃人員用的。在編譯遊戲的時候對他們輸入的一些數值進行校驗,是一個好的習慣。他們不需要關心一些數值的限制,但是作為開發人員的我們是需要的。

如何使用OnValidate?

在官方文件上僅有一個簡短的說明,並且沒有示例程式碼。

編輯器模式下OnValidate 僅在下面兩種情況下被呼叫:

  • 指令碼被載入時
  • Inspector 中的任何值被修改時
  • 下面是指令碼中如何使用它:
using UnityEngine;using System.Collections;public class OnValidateExample : MonoBehaviour { public int size; void OnValidate() { Debug.Log("OnValidate"); }}

上面的指令碼掛在gameobject上,效果如下

fc01e6adb2bfc7ab4c934ac6755ebc8a.gif

OnValidate-simple-behavior.gif

Examples

下面是一些體現OnValidate函式強大功能的使用場景

  • 角度簡化

使用場景 - 我們需要將設計人員輸入的角度限定在-359到359之間,因為360 相當於 0度。

using UnityEngine;using System.Collections; public class OnValidateExample : MonoBehaviour { public float objectRotation;  void OnValidate() { // objectRotation objectRotation = objectRotation % 360; }}

效果如下:

08c117348b8dbb07fcaa5865d36f0aca.gif

OnValidate-Degree-simplification.gif

  • 二次方

使用場景 - 當需要設計人員輸入 16 到 4096 之間 2的整數次冪時

Unity提供了ClosestPowerOfTwo函式,方便我們取得最接近的值。同時我們使用RangeAttribute 屬性來限定一下輸入數值的區間,同時能更好的看出來處理後的值跟原始輸入值的區別。

using UnityEngine;using System.Collections; public class OnValidateExample : MonoBehaviour { [RangeAttribute(16, 4096)] public int textureSize;  void OnValidate() { // textureSize textureSize = Mathf.ClosestPowerOfTwo(textureSize); }}

效果如下

591ec33a46db7381b43608307658edd4.gif

OnValidate-Power-of-two.gif

  • 關聯值

使用場景 -需要“Nitro”車的速度比其他車的速度大至少20mph.

using UnityEngine;using System.Collections; public class OnValidateExample : MonoBehaviour { [RangeAttribute(10, 300)] [Tooltip("mph")] public int maxCarSpeed; [RangeAttribute(10, 300)] [Tooltip("mph")] public int maxNitroSpeed;  const int minNitroSpeedExtra = 20;  void OnValidate() { // speed check if (maxNitroSpeed < maxCarSpeed + minNitroSpeedExtra) maxNitroSpeed = maxCarSpeed + minNitroSpeedExtra; }}

效果如下

cd7e37dc75b001417149fdcb42ab148c.gif

OnValidate-Linked-values.gif

from:http://cjf.in.ua/812-unity-editor-extensions-the-power-of-onvalidate/

Unity技術交流 微信公眾號 UnityAsk,QQ群:891555732