2013-10-13 84 views
2

我正在使用Unity3D編碼C#的遊戲。繼承組合 - 武器系統

由於我從純OOP環境來到Unity,基於組件的方法對我來說毫無意義。所以對於我們的武器系統,我純粹使用了繼承樹和對象層次方法的OOP。我花更多的時間用我的代碼添加新的功能和東西,我發現這種設計越不靈活。所以現在我傾向於基於組件的設計。

我發佈了我的問題here,問我是否已經足夠好了,如果我使用了構圖 - 繼承方法,如Mr.Jamora建議的here

他的解決方案聽起來非常好。但達不到根本,如果我有一個以上的武器,實施同樣的邏輯可以說,從ReloadIReloadable

public interface IReloadable 
{ 
    void Reload(); 
} 

public interface IUpgradable 
{ 
    void Upgrade(); 
} 

public interface IShooter 
{ 
    void Shoot(); 
} 

public SMG : IShooter, IReloadable 
{ 
    void Shoot() 
    { 
     // shooting logic 1 
    } 
    void Reload() 
    { 
     // reloading logic 1 
    } 
} 

public AssaultRifle : IShooter, IReloadable, IUpgradable 
{ 
    void Shoot() 
    { 
     // shooting logic 2 
    } 
    void Upgrade() 
    { 
     // upgrade logic 1 
    } 
    void Reload() 
    { 
     // reloading logic 1 -- SAME LOGIC 
    } 
} 

正如你所看到的,有重複代碼,我不喜歡這樣。 這可以避免嗎? (在一個乾淨,靈活的方式)

而且一般來說,這是(組成繼承)一個很好的方法來在Unity中製作武器系統? - 或者最好使用Unity的基於組件的方法,並製作一個ShooterReloadable組件(腳本)並將它們附加到我的武器gameObject中?

在此先感謝您的幫助。

+1

組成並不意味着「繼承接口而不是具有行爲的類」。您的示例中沒有任何組合。 –

+0

我從來沒有提到過構圖本身,我是在談論「構圖的繼承」 - 請參閱維基http://en.wikipedia.org/wiki/Composition_over_inheritance – vexe

+6

顯然,你不明白什麼是「構造超越繼承」的含義。它不是一個單獨的代碼重用方法,與「自身構圖」或「自身繼承」不同。這是比較構成與繼承的利弊,得出的結論是組合(單獨)比繼承更容易維護。既然你沒有使用組合,你沒有遵循使用組合而不是繼承的原則。 –

回答

1

謝謝任何​​試圖幫助的人。我實際上從Jamora得到了一個很好的解釋,在我發佈的 [link]以上的鏈接上。但我從來沒有時間再分享一次。

但是,我發現您無法將所有組件都設置爲組件,例如ReloadableShooter組件。除非你所有的武器以同樣的方式重新加載/射擊,否則你不能創建這樣的組件並將其附加到它們上,因爲如果武器重新加載/拍攝不同,這意味着這些信息應該在武器本身(即抽象的Weapon一個抽象的ReloadShoot方法),所以組件不知道該信息。

另一個示例,使Usable腳本組件附加到您的項目。你不能那樣做,那是沒有道理的。使用健康項目,不同於使用鑰匙打開門。使用信息存儲在項目本身中。將Usable附加到一個項目,意味着所有項目都以相同的方式使用。

我也發現,即使在Unity中,繼承也是必須的。但壞事是僅僅依靠純粹的對象層次樹來進行所有的設計。相反,創建小型樹的混合,實現不同行爲的接口並在任何時候創建腳本組件。

0

如果您遵循以下Unity3D慣例,特別是如果您使用JavaScript,則首選(強制)使用Composition。

然而,它看起來像你使用C#在這種情況下你有一個選擇。

只要你不違反DRY,那麼它真的取決於你的喜好。但團結已經成立,以處理作文。 (我另一方面喜歡繼承)

0

是的,組合對於可重複使用的代碼來說是最好的,並且可以防止複製和複製粘貼代碼。你沒有使用組合,你只使用繼承和接口。最好的過程是實現IReloadable Ishootable,...接口和Reloadable1,shootable1,Reloadable2,shootable2,...類繼承IReloadable,Ishootable。然後,你可以使用Reloadable1,shootable1,Reloadable2,shootable2,..武器組件。所以如果你想改變任何東西,你只需要改變一個組件(例如Reloadable2)