Validate Input Attribute特性:用于任何屬性,并允自定義檢查器,靈活實現多種監測規則。使用此選項可強制執行正確的值(提供對應的返回值)。
常規寫法,實參輸入一個方法的名稱,一個對應的消息
[ValidateInput("MustBeNull", "這個字段應該為空。")]
public MyScripty DefaultMessage;
private bool MustBeNull(MyScripty scripty)
{
return scripty == null;
}
也可以使用$特殊標識符引用一個字段動態顯示提示信息,而且也可以明確指出需要提示信息的類型
[ReadOnly]
public string dynamicMessage = "這個物體不應該為空!";
[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", "對應的函數中已經有消息,所以這個默認消息已經沒用")]
public GameObject DynamicMessage;
private bool HasMeshRendererDynamicMessage(GameObject gameObject, ref string errorMessage)
{
if (gameObject == null) return true;
if (gameObject.GetComponentInChildren<MeshRenderer>() == null)
{
errorMessage = "\"" + gameObject.name + "\" 這玩應必須有一個 MeshRenderer 組件";//如果設置消息,則默認消息會被覆蓋
return false;
}
return true;
}
[ValidateInput("HasMeshRendererDynamicMessageAndType", "對應的函數中已經有消息和類型,所以這個默認消息和類型已經沒用")]
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 + "\" 要有一個 MeshRenderer 組件";//如果設置消息,則默認消息會被覆蓋
messageType = this.MessageType;//如果設置消息類型,則默認消息類型會被覆蓋
return false;
}
return true;
}
完整示例代碼
using Sirenix.OdinInspector;
using UnityEngine;
public class ValidateInputAttributeExample : MonoBehaviour
{
[ValidateInput("MustBeNull", "這個字段應該為空。")]
public MyScripty DefaultMessage;
private bool MustBeNull(MyScripty scripty)
{
return scripty == null;
}
[ReadOnly]
public string dynamicMessage = "這個物體不應該為空!";
[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", "對應的函數中已經有消息,所以這個默認消息已經沒用")]
public GameObject DynamicMessage;
private bool HasMeshRendererDynamicMessage(GameObject gameObject, ref string errorMessage)
{
if (gameObject == null) return true;
if (gameObject.GetComponentInChildren<MeshRenderer>() == null)
{
errorMessage = "\"" + gameObject.name + "\" 這玩應必須有一個 MeshRenderer 組件";//如果設置消息,則默認消息會被覆蓋
return false;
}
return true;
}
[ValidateInput("HasMeshRendererDynamicMessageAndType", "對應的函數中已經有消息和類型,所以這個默認消息和類型已經沒用")]
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 + "\" 要有一個 MeshRenderer 組件";//如果設置消息,則默認消息會被覆蓋
messageType = this.MessageType;//如果設置消息類型,則默認消息類型會被覆蓋
return false;
}
return true;
}
private bool HasMeshRendererDefaultMessage(GameObject gameObject)
{
if (gameObject == null) return true;
return gameObject.GetComponentInChildren<MeshRenderer>() != null;
}
}