Unity3D 編輯器擴展 強大的OnValidate

需要驗證一些數據

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

如何使用OnValidate?

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

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

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

上面的腳本掛在gameobject上,效果如下


Unity3D 編輯器擴展 強大的OnValidate


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;
 }
}

效果如下:


Unity3D 編輯器擴展 強大的OnValidate


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);
 }
}

效果如下


Unity3D 編輯器擴展 強大的OnValidate


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;
 }
}

效果如下


Unity3D 編輯器擴展 強大的OnValidate


OnValidate-Linked-values.gif

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

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


分享到:


相關文章: