簡體   English   中英

Unity (C#) 中的繼承變量問題(更改繼承的變量)

[英]Inheritance Variable Questions (Changing inherited variables) in Unity (C#)

對不起,我對這個話題有點茫然。 例如,假設我有一個基類 Character 和兩個子類 FriendlyCharacter 和 EnemyCharacter。 我希望他們都繼承諸如健康之類的變量,但我不應該將 Character 中的健康變量設為公開,對嗎? 我會假設,如果我更改了友好字符中的公共變量,它會更改所有健康實例嗎?

我將如何初始化 Character 以包含將由其他類繼承的變量? 一旦繼承,這些類將擁有該變量的自己的實例。 我覺得只需要重新初始化每個子類中的變量只會使基類中的初始化毫無意義。

我將不勝感激任何幫助。

您正在尋找的是接口或抽象/虛擬函數。 從廣義上講,有兩種技術:

public abstract class Character : MonoBehaviour
{
    public float m_Health { get; protected set; }
    protected abstract float DefaultHealth { get; }
    void Awake()
    {
        m_Health = DefaultHealth;
    }
}
public class Enemy : Character
{
    protected override float DefaultHealth { get { return 10; } }
}

(如果應該有一個基本實現並且覆蓋是可選的,則使用虛函數而不是抽象函數。)當邏輯全部共享時使用上述模式,但在子類中指定了一些不同的位。 基類中的大函數調用可能在子類中指定的小函數。

第二種技術適用於當這些類在外部世界看起來相同但在基本層面上的功能不同時:

public interface ILiving
{
    float Health { get; }
}
public class Character : ILiving
{
    // implement health as a normal variable
    public float Health { get; protected set; }
}
public class OldMan : ILiving
{
    // implement health based on time until death at 2020
    public float Health { get { return (2020-DateTime.Now.Year)/20; } }
}

在這種情況下,兩種類型都具有健康狀況,但它們運行的​​邏輯不同。 在外界看來,它們看起來相同,但它們是如此不同,以至於它們不應該共享任何邏輯。

請注意,在 Unity 中,事情可能會變得混亂。 由於我們被迫從MonoBehaviour (而 C# 缺乏多重繼承),我們有時不能在我們想要的地方使用繼承。 在這些情況下,我們可以通過使用接口、顯式接口實現(受保護函數的合理復制)和擴展方法來模擬繼承。 (定義擴展方法的類將扮演基類的角色。)通常,當類想要成為兩個類層次結構的一部分(基於兩個不可調和的功能集)時,就會出現這種情況。 在游戲中,盔甲、武器和法術可能都希望參與升級系統。 盔甲和武器是裝備等級等級的一部分,但法術不是。 所以將相關數據做成接口函數,共享代碼定義為擴展方法(因為盔甲和法術不共享公共基類,除了MonoBehaviour )。

在 Unity 的上下文中,我不確定您要問的內容是否真的有效。

實現這一點的最佳方法是制作一個可以根據需要復制和調整的游戲對象(角色)(FriendlyCharacter/EnemyCharacter),只需更改 Unity 中的標簽以確保它們與其他對象進行交互。

一般而言,在 Unity 中,“公共”或“私人”標簽僅指示是否可以在該特定腳本之外(即在檢查器中或通過其他腳本)更改值。

編輯:此外,作為對繼承的更廣泛的說明,更改類(或子類)的對象內的任何繼承變量永遠不會更改從更高類產生的所有對象的變量,這不是“公共”或“私人”指的是,要么。

暫無
暫無

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

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