Odin Inspector 系列教程 --- Validate Input Attribute

Validate Input Attribute特性:用于任何屬性,并允自定義檢查器,靈活實(shí)現(xiàn)多種監(jiān)測(cè)規(guī)則。使用此選項(xiàng)可強(qiáng)制執(zhí)行正確的值(提供對(duì)應(yīng)的返回值)。

常規(guī)寫法,實(shí)參輸入一個(gè)方法的名稱,一個(gè)對(duì)應(yīng)的消息
    [ValidateInput("MustBeNull", "這個(gè)字段應(yīng)該為空。")]
    public MyScripty DefaultMessage;
    private bool MustBeNull(MyScripty scripty)
    {
        return scripty == null;
    }
也可以使用$特殊標(biāo)識(shí)符引用一個(gè)字段動(dòng)態(tài)顯示提示信息,而且也可以明確指出需要提示信息的類型
    [ReadOnly]
    public string dynamicMessage = "這個(gè)物體不應(yīng)該為空!";
    [ValidateInput("CheckGameObject", "$dynamicMessage", InfoMessageType.None)]
    public GameObject targetObj_None = null;
    [ValidateInput("CheckGameObject", "$dynamicMessage", InfoMessageType.Info)]
    public GameObject targetObj_Info = null;
    [ValidateInput("CheckGameObject", "$dynamicMessage", InfoMessageType.Warning)]
    public GameObject targetObj_Warning = null;
    [ValidateInput("CheckGameObject", "$dynamicMessage", InfoMessageType.Error)]
    public GameObject targetObj_Error = null;

    private bool CheckGameObject(GameObject tempObj)
    {
        return tempObj != null;
    }

當(dāng)然也可以這么用

    [ValidateInput("IfNullIsFalse", "$Message", InfoMessageType.Warning)]
    public string Message = "Dynamic ValidateInput message";

    private bool IfNullIsFalse(string value)
    {
        return string.IsNullOrEmpty(value);
    }
也可以覆蓋默認(rèn)的提示消息和消息類型
 [ValidateInput("HasMeshRendererDynamicMessage", "對(duì)應(yīng)的函數(shù)中已經(jīng)有消息,所以這個(gè)默認(rèn)消息已經(jīng)沒用")]
    public GameObject DynamicMessage;
    private bool HasMeshRendererDynamicMessage(GameObject gameObject, ref string errorMessage)
    {
        if (gameObject == null) return true;

        if (gameObject.GetComponentInChildren<MeshRenderer>() == null)
        {
            errorMessage = "\"" + gameObject.name + "\" 這玩應(yīng)必須有一個(gè) MeshRenderer 組件";//如果設(shè)置消息,則默認(rèn)消息會(huì)被覆蓋
            return false;
        }
        return true;
    }

    [ValidateInput("HasMeshRendererDynamicMessageAndType", "對(duì)應(yīng)的函數(shù)中已經(jīng)有消息和類型,所以這個(gè)默認(rèn)消息和類型已經(jīng)沒用")]
    public GameObject DynamicMessageAndType;

    [InfoBox("Change GameObject value to update message type", InfoMessageType.Info)]
    public InfoMessageType MessageType;
    private bool HasMeshRendererDynamicMessageAndType(GameObject gameObject, ref string errorMessage, ref InfoMessageType? messageType)
    {
        if (gameObject == null) return true;

        if (gameObject.GetComponentInChildren<MeshRenderer>() == null)
        {
            errorMessage = "\"" + gameObject.name + "\" 要有一個(gè) MeshRenderer 組件";//如果設(shè)置消息,則默認(rèn)消息會(huì)被覆蓋
            messageType = this.MessageType;//如果設(shè)置消息類型,則默認(rèn)消息類型會(huì)被覆蓋
            return false;
        }
        return true;
    }
完整示例代碼
using Sirenix.OdinInspector;
using UnityEngine;


public class ValidateInputAttributeExample : MonoBehaviour
{

    [ValidateInput("MustBeNull", "這個(gè)字段應(yīng)該為空。")]
    public MyScripty DefaultMessage;
    private bool MustBeNull(MyScripty scripty)
    {
        return scripty == null;
    }

    [ReadOnly]
    public string dynamicMessage = "這個(gè)物體不應(yīng)該為空!";
    [ValidateInput("CheckGameObject", "$dynamicMessage", InfoMessageType.None)]
    public GameObject targetObj_None = null;
    [ValidateInput("CheckGameObject", "$dynamicMessage", InfoMessageType.Info)]
    public GameObject targetObj_Info = null;
    [ValidateInput("CheckGameObject", "$dynamicMessage", InfoMessageType.Warning)]
    public GameObject targetObj_Warning = null;
    [ValidateInput("CheckGameObject", "$dynamicMessage", InfoMessageType.Error)]
    public GameObject targetObj_Error = null;

    private bool CheckGameObject(GameObject tempObj)
    {
        return tempObj != null;
    }

    [ValidateInput("IfNullIsFalse", "$Message", InfoMessageType.Warning)]
    public string Message = "Dynamic ValidateInput message";

    private bool IfNullIsFalse(string value)
    {
        return string.IsNullOrEmpty(value);
    }

    [ValidateInput("HasMeshRendererDynamicMessage", "對(duì)應(yīng)的函數(shù)中已經(jīng)有消息,所以這個(gè)默認(rèn)消息已經(jīng)沒用")]
    public GameObject DynamicMessage;
    private bool HasMeshRendererDynamicMessage(GameObject gameObject, ref string errorMessage)
    {
        if (gameObject == null) return true;

        if (gameObject.GetComponentInChildren<MeshRenderer>() == null)
        {
            errorMessage = "\"" + gameObject.name + "\" 這玩應(yīng)必須有一個(gè) MeshRenderer 組件";//如果設(shè)置消息,則默認(rèn)消息會(huì)被覆蓋
            return false;
        }
        return true;
    }

    [ValidateInput("HasMeshRendererDynamicMessageAndType", "對(duì)應(yīng)的函數(shù)中已經(jīng)有消息和類型,所以這個(gè)默認(rèn)消息和類型已經(jīng)沒用")]
    public GameObject DynamicMessageAndType;

    [InfoBox("Change GameObject value to update message type", InfoMessageType.Info)]
    public InfoMessageType MessageType;
    private bool HasMeshRendererDynamicMessageAndType(GameObject gameObject, ref string errorMessage, ref InfoMessageType? messageType)
    {
        if (gameObject == null) return true;

        if (gameObject.GetComponentInChildren<MeshRenderer>() == null)
        {
            errorMessage = "\"" + gameObject.name + "\" 要有一個(gè) MeshRenderer 組件";//如果設(shè)置消息,則默認(rèn)消息會(huì)被覆蓋
            messageType = this.MessageType;//如果設(shè)置消息類型,則默認(rèn)消息類型會(huì)被覆蓋
            return false;
        }
        return true;
    }


    private bool HasMeshRendererDefaultMessage(GameObject gameObject)
    {
        if (gameObject == null) return true;
        return gameObject.GetComponentInChildren<MeshRenderer>() != null;
    }
}

更多教程內(nèi)容詳見:革命性Unity 編輯器擴(kuò)展工具 --- Odin Inspector 系列教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容