2014-02-21 65 views
1

我正在爲我的遊戲構建庫存系統,我覺得我很不確定Unity3D的繼承系統如何工作。我知道有很多庫存系統,但我想自己去學習。有關Unity3D繼承行爲的問題

基本上,我想有一個庫存基類,其中「PlayerInventory」,「ChestInventory」,「DrawerInventory」等可以從中派生。這似乎只是很好地工作:

Inventory.cs:

using UnityEngine; 
using System.Collections; 
using System.Collections.Generic; 

public class Inventory : MonoBehaviour { 

    public int numberOfSlots = 0; 

    public List<Slot> slots = new List<Slot>(); 

    public virtual void Awake() { 
     Debug.Log ("Inventory.Awake() - numberOfSlots = " + numberOfSlots); 
     for (int i = 0; i < numberOfSlots; i++) { 
      slots.Add(new Slot()); 
     } 
     Debug.Log ("Successfully created " + slots.Count + " slots!"); 
    } 

} 

PlayerInventory.cs:

using UnityEngine; 
using System.Collections; 

public class PlayerInventory : Inventory { 

    public new void Awake() { 
     this.numberOfSlots = 30; 
     base.Awake(); 
     Debug.Log ("PlayerInventory.Awake"); 
    } 

} 

雖然這看起來工作得很好,我覺得有點凌亂。問題:

  • 我可以(還是應該)在派生類中的Awake()之外定義numberOfSlots?
  • 我可以(或應該)避免在派生的Awake()方法中調用base.Awake()嗎?
  • 還有什麼我顯然做錯了? :)

感謝您的任何見解!

回答

0

你在做什麼很好,但如果你不喜歡它,只需在基類中創建一個CreateSlots(int numSlots)方法並從孩子調用它。

+0

我會保持清醒()現在,因爲它沒有任何意義創建/清醒清單對象沒有任何縫隙,所以我覺得在創建/喚醒時創建插槽是有意義的。如果您不同意,請告訴我!我感謝你們所有的智慧! :) – toreau

1

沒有任何可怕的缺陷,但我建議你在派生類中重寫Awake(),因爲基本方法已經是虛擬的。做一個新的喚醒()表明你想要一個全新的方法,而不是關心基本方法。在派生方法中調用base.Awake()應該完成,因爲您的基礎處理庫存插槽。它有助於保持乾淨的代碼而不會重複。

您可能想要做的一項更改是將參數添加到Awake()中,該參數定義了插槽計數。如果您想製作相同類型但尺寸不同的庫存,則無需爲不同尺寸創建全新的課程即可輕鬆完成。

PlayerInventory.cs:(或任何其它庫存)

public override void Awake (int numOfSlots) { 
    this.numberOfSlots = numOfSlots; 
    base.Awake(); 
    Debug.Log ("PlayerInventory.Awake"); 
} 
+0

非常感謝;壓倒一切更有意義。我嘗試過,但是沒有得到它的原因,但現在它工作得很好。 很高興知道我沒有做出非常錯誤的事情:),這可能是我之後的事情。謝謝! – toreau

+1

您無法將參數添加到'Awake',派生版本會抱怨沒有合適的方法被發現覆蓋。而且你不能在基本行爲中添加一個參數到'Awake',因爲Unity不允許它。 – Jerdak

+0

我沒有提及'override'和'new'問題,因爲它是無關緊要的 - 它是一個Unity消息回調,因此該方法永遠不會被用戶代碼調用。沒有辦法誤用它。 –