簡體   English   中英

為什么我不能在 Unity3D 中覆蓋“OnValidate()”?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM