[英]Why can't I override “OnValidate()” in Unity3D?
所以我正在實現一個繼承自 Text 的彎曲 Text 類。 其中我有這個 OnValidate 實現:
protected override void OnValidate()
{
base.OnValidate();
// some other code
}
現在,當我嘗試構建項目時,出現此錯誤:
error CS0115: CurvedText.OnValidate() is marked as an override but no suitable method found to override
所以我覺得這很奇怪,甚至 VS 建議覆蓋。 那么接下來我該怎么辦? 刪除 override 關鍵字並忽略 VS 警告。 所以現在統一拋出這個錯誤:
error CS0117: UnityEngine.UI.Text does not contain a definition for OnValidate
那我現在該怎么辦? 我還應該提到,當腳本被添加到場景中的對象時,它會按預期工作並且不會拋出任何錯誤。
因為OnValidate
是 Unity3D 消息系統的一部分。
正如這篇博客所提到的,這個消息傳遞函數只有在第一次訪問 MonoBehaviour 對象並且通過腳本運行時(Mono 或 IL2CPP)檢查底層腳本時才會解決。
所以現在,對於編譯器,沒有OnValidate
可以覆蓋。
只需像這樣調用方法:
void OnValidate()
{
// some other code
}
我的 2 美分評論
protected
關鍵字不會阻止內容被覆蓋。
virtual
關鍵字用於修改事物並允許它們在派生類中被覆蓋。 這意味着您不能覆蓋非虛擬方法。
OnValidate()
Unity 文檔指出“僅在編輯器中調用”: https : //docs.unity3d.com/ScriptReference/MonoBehaviour.OnValidate.html
在覆蓋OnValidate()
時使用預處理器指令#if UNITY_EDITOR
可以防止 VS 投訴和編譯器錯誤。 這也更明確地說明了代碼的作用,而不是依賴於對 Unity 內部的洞察,因此更具可讀性。
它可能作為僅編輯器的代碼隱藏在幕后的構建中,但是當它被覆蓋時,該 hack 會以某種方式被破壞。
#if UNITY_EDITOR
protected override void OnValidate()
{
// Do something.
}
#endif // UNITY_EDITOR
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.