我正在为我的游戏构建一个清单系统,并且我对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()吗?
我显然做错了什么吗? :)


感谢您的任何见解!

最佳答案

没有任何可怕的缺陷,但是我建议您在派生类中重写Awake(),因为基本方法已经是虚拟的。制作一个新的Awake()建议您要制作一个全新的方法,而不在乎基本方法。应该执行派生方法中的base.Awake(),因为您的基础处理了库存广告位。它有助于保持干净的代码而无需重复。

您可能想要做的一项更改是在Awake()中添加一个参数,该参数定义插槽计数。如果要创建相同类型但不同大小的库存,则可以轻松做到这一点,而不必为不同大小创建一个全新的类。

PlayerInventory.cs :(或任何其他库存)

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

10-05 19:12