让Unity的Inspector面板支持字符限制(restrict)功能
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
让Unity的Inspector⾯板⽀持字符限制(restrict)功能
今天在优化红点组件,笔者打算将红点id由10进制改为16进制处理,就打算将红点id字段由uint类型改成string类型,⽤于填写16进制的字符(因为在Inspector⾯板⾥,uint/int类型字段不能直接填写16进制表⽰的数字),且希望限制该字段的输⼊限制,仅限于填写0-9A-Fa-f等16进制字符串,但unity并没有提供任何PropertyAttribute类来限制字符输⼊,达到类似于as3 text组件的restrict效果。
因此笔者⾃定义了⼀个RestrictAttribute类,⽤于实现字符限制效果。
/* ==============================================================================
* 功能描述:限制string字段的输⼊类型
* 创建者:shuchangliu
* ==============================================================================*/
using System.Text.RegularExpressions;
using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif
public class RestrictAttribute : PropertyAttribute
{
public string restrict;
// Use this for initialization
public RestrictAttribute(string restrict)
{
this.restrict = restrict;
}
}
#if UNITY_EDITOR
[CustomPropertyDrawer(typeof(RestrictAttribute))]
public class RestrictDrawer : PropertyDrawer
{
public override float GetPropertyHeight(SerializedProperty property,
GUIContent label)
{
return EditorGUI.GetPropertyHeight(property, label, true);
}
public override void OnGUI(Rect position,
SerializedProperty property,
GUIContent label)
{
RestrictAttribute a = attribute as RestrictAttribute;
EditorGUI.PropertyField(position, property, label, true);
string v = property.stringValue;
v = Regex.Replace(v, @"[^" + a.restrict + "]*", "");
property.stringValue = v;
}
}
#endif
public class Test : MonoBehaviour
{
[Restrict("0-9a-fA-F")]
public string pid;
}
在字段前加上[Restrict(string str)]参数,pid就只可以输⼊16进制数字(0-9及a-f的⼤⼩英⽂)了。