我正在为我的游戏构建一个清单系统,并且我对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" );
}