2016-10-17 149 views
0

對不起,我對這個主題有點空白。例如,假設我有一個基類Character和兩個子類FriendlyCharacter和EnemyCharacter。我希望他們都繼承像健康這樣的變量,但是我不應該在公開角色中設置健康變量?我會假設,如果我改變了友好角色的公共變量,它會改變健康的所有實例正確嗎?Unity(C#)中的繼承變量問題(更改繼承的變量)

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

我將不勝感激任何幫助。

回答

0

你在找什麼是接口,或抽象/虛擬功能。廣義地說,有兩種技術:

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之外,裝甲和法術不共享公共基類)。

+0

感謝這個細節! –

0

在Unity的背景下,我不確定你在問什麼是真正的作品。

完成此操作的最佳方法是製作一個遊戲對象(角色),您可以根據需要複製和調整(FriendlyCharacter/EnemyCharacter),只需更改Unity中的標記以確保它們與其他應用程序進行交互對象。

一般來說,在Unity中,「Public」或「Private」標籤只能決定值是否可以在特定腳本之外(即在Inspector或其他腳本中)更改。

編輯:此外,作爲更廣泛的注意繼承,更改類(或子類)的對象內的任何繼承變量將永遠不會更改該變量的所有從較高類出生的對象,這是而不是「公共」或「私人」是指什麼。

+0

謝謝。我會牢記這些。我對這些事情有點生疏,對Unity也比較陌生。所以我會創建角色遊戲對象,那麼如何將友好/敵人的獨特腳本鏈接到這些通用遊戲對象? –

+0

您可以將該腳本作爲您的角色腳本的一個子類,就像您以前所建議的那樣。 在C#中,您可以使用「:」來完成此操作。在Unity中,當沒有父類時,您可能會發現這通常顯示爲「YourScriptName:MonoBehavior」,然後您將製作「FriendlyCharacterScript:CharacterScript」等(即子類:父類) – mykeg

+0

爲什麼不讓你的getter和setter基類獲得敵人和角色對象,否則我不知道該怎麼做。 – LumbusterTick