#unity/日常积累 ##### 需要验证一些数据 我们都知道,搭建创建的编辑器扩展脚本,基本上都是给关卡设计或者策划人员用的。在编译游戏的时候对他们输入的一些数值进行校验,是一个好的习惯。他们不需要关心一些数值的限制,但是作为开发人员的我们是需要的。 ##### 如何使用OnValidate? 在官方文档上仅有一个简短的说明,并且没有示例代码。 编辑器模式下OnValidate 仅在下面两种情况下被调用: - 脚本被加载时 - Inspector 中的任何值被修改时 下面是脚本中如何使用它: ``` cs using UnityEngine; using System.Collections; public class OnValidateExample : MonoBehaviour { public int size; void OnValidate() { Debug.Log("OnValidate"); } } ``` 上面的脚本挂在gameobject上,效果如下 ![[aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8yNDMyNzY5LTVjYzFhMGE1YjJlMTBiMDIuZ2lm.gif]] ##### Examples 下面是一些体现OnValidate函数强大功能的使用场景 - ###### 角度简化 使用场景 - 我们需要将设计人员输入的角度限定在-359到359之间,因为360 相当于 0度。 ``` cs using UnityEngine; using System.Collections; public class OnValidateExample : MonoBehaviour { public float objectRotation; void OnValidate() { // objectRotation objectRotation = objectRotation % 360; } } ``` 效果如下: ![[aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8yNDMyNzY5LTQyZmJjODNhYjgzZDQ4MDkuZ2lm.gif]] - ###### 二次方 使用场景 - 当需要设计人员输入 16 到 4096 之间 2的整数次幂时 Unity提供了ClosestPowerOfTwo函数,方便我们取得最接近的值。同时我们使用RangeAttribute 属性来限定一下输入数值的区间,同时能更好的看出来处理后的值跟原始输入值的区别。 ``` cs using UnityEngine; using System.Collections; public class OnValidateExample : MonoBehaviour { [RangeAttribute(16, 4096)] public int textureSize; void OnValidate() { // textureSize textureSize = Mathf.ClosestPowerOfTwo(textureSize); } } ``` 效果如下 ![[aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8yNDMyNzY5LWM1YWY5N2E3ZDk1MTUwY2EuZ2lm.gif]] - ###### 关联值 使用场景 -需要“Nitro”车的速度比其他车的速度大至少20mph. ``` cs 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; } } ``` 效果如下 ![[aHR0cHM6Ly91cGxvYWQtaW1hZ2VzLmppYW5zaHUuaW8vdXBsb2FkX2ltYWdlcy8yNDMyNzY5LTQyMzdiNDg3MDEzMTYxZDUuZ2lm.gif]]