gpt4 book ai didi

c# - 关于Unity3D的继承行为的问题

转载 作者:太空宇宙 更新时间:2023-11-03 13:27:21 25 4
gpt4 key购买 nike

我正在为我的游戏构建一个库存系统,我觉得我对 Unity3D 的继承系统的工作方式非常不确定。我知道有很多库存系统,但我想自己动手学习。

基本上,我想要一个 Inventory 基类,“PlayerInventory”、“ChestInventory”、“DrawerInventory”等可以从中派生。这似乎工作得很好:

库存.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!" );
}

}

玩家 list .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" );
}

关于c# - 关于Unity3D的继承行为的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21944061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com