簡體   English   中英

Unity OnDisable - 我可以虛擬覆蓋內置的統一方法嗎?

[英]Unity OnDisable - can I virtual override the built in unity methods?

是否可以使用 virtual void OnDisable()? 它是一個內置的 Unity 方法,就像 Start() 或 OnEnable() 一樣。 我無法在網上找到任何資源來解釋我們是否可以在這些內置方法上使用虛擬。


    public abstract class ShipComponent : MonoBehaviour
    {
    [HideInInspector] public ShipControl shipControl;

    public virtual void Init(ShipControl control)
    {
        this.shipControl = control;
        StartCommonCoroutines();
    }
    public virtual void IsPlayer()
    {
        SetListeners();
        StartPlayerOnlyCoroutines();
    }
    public virtual void OnEnable()
    {
        StartCommonCoroutines();

        if (!shipControl.shipWrapper.ship.IsPlayer) return;
        SetListeners();
        StartPlayerOnlyCoroutines();
    }

    public virtual void OnDisable()
    {
        RemoveListeners();
        StopAllCoroutines();
    }

    public abstract void SetListeners();
    public abstract void RemoveListeners();

    public abstract void StartCommonCoroutines();

    public abstract void StartPlayerOnlyCoroutines();
    public abstract void StopPlayerOnlyCoroutines();

}

我想在子類中從ShipComponent繼承,每當從ShipComponent繼承的子類調用OnDisable() (Unity 內置版本)時,我希望它調用上面初始化的 baseClass' ShipComponent.OnDisable()

我意識到 OnDisable() 是一種內置方法,所以我應該這樣做:

public override void OnDisable()
{
    base.OnDisable();
    RemoveListeners();
    StopAllCoroutines();
}

因為我們以這種方式覆蓋了原來內置的 Unity 方法?

謝謝。

Unity 對用戶腳本做了一點反射魔法,它創建了具有 OnEnable/OnDisable 方法的 MonoBehaviours 的內部列表 - 即使它們是私有的,它也會調用它們,並且您不需要顯式實現任何接口就可以工作.

這也意味着它不關心該方法是否為虛擬方法,如果您在繼承類中覆蓋它,它將調用正確的覆蓋。

不要在您的基礎 class 中將其標記為覆蓋,因為 MonoBehaviour 本身沒有基礎實現。 我假設這個決定是出於性能原因——如果所有對象都有這些方法,即使它們是空的,也必須調用它們。 如果沒有方法,那就少了幾個電話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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