有关Unity3D继承行为的问题

时间:2014-02-21 19:59:50

标签: c# oop inheritance 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()吗?
  • 我显然做错了别的什么? :)

感谢您的任何见解!

2 个答案:

答案 0 :(得分:1)

没有任何可怕的缺陷,但我建议您在派生类中覆盖Awake(),因为基本方法已经是虚拟的。制作一个新的Awake()表明你想要制作一个全新的方法,而不是关心基本方法。应该在派生方法中调用base.Awake(),因为您的基础处理库存槽。它有助于维护干净的代码而不会重复。

您可能想要做的一个更改是为Awake()添加一个定义插槽计数的参数。如果您想制作相同类型但不同尺寸的库存,您可以轻松完成,而无需为不同尺寸创建一个全新的类。

PlayerInventory.cs :(或任何其他广告资源)

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

答案 1 :(得分:0)

你正在做的很好,但是如果你不喜欢它,只需在基类中创建一个CreateSlots(int numSlots)方法并从孩子那里调用它。