我正在为我的游戏构建一个库存系统,我觉得我对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" );
}
}
虽然这似乎工作得很好,但我发现它有点乱。问题:
感谢您的任何见解!
答案 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)
方法并从孩子那里调用它。