【发布时间】:2013-08-09 19:16:09
【问题描述】:
对不起,我不能在没有介绍的情况下提出问题。 (如果您不确定是否要全部阅读,我仍然尝试提出一个问题,问题是如果我尝试更改我的项目属性,它适用于所有其他相同的项目,如何解决这个问题?)
我有类 Item 具有一些属性和变量,例如 itemCost、durability 等。
Weapon 类继承 Item。
我有ItemGenerator 类,它初始化一个数组中的所有项目。它包含以下功能:
private static Weapon CreateUniqueWeaponForItemList(int ID, int itemLevel,
..... string description) {
Weapon item = new Weapon();
item.ID = ID;
item.ItemLevel = itemLevel;
...
...
item.Description = description
return item;
}
类似的东西。 此项目列表在游戏开始时初始化。 我有包含所有项目的项目数组。
public static Item[] ItemList = new Item[200];
下面是游戏中所有独特物品的列表,由上面的函数创建,:
ItemList[1] = CreateUniqueWeaponForItemList(1, 5, ....., "this is item!");
ItemList[2] = ....
就像那样。
这现在很好用。当我生成项目时,我只使用项目 ID 来指定我要创建的项目。也很容易保存和加载,只需将项目的ID 存储在PlayerPrefs 中。
但是当我开始添加额外的功能(比如物品升级、伤害升级等等)时,我意识到这种架构很糟糕。
如果玩家有两个或更多相同的项目,问题就从这里开始。如果我尝试更改Item 属性,它们将应用于ItemList[ID],而不是我想要的项目。
我认为我需要在此处粘贴代码才能清楚。我有库存系统,有
private List<Item> _inventory = new List<Item>(); 在Player 类中。我有宝箱,可以从ItemList 获取物品来创建一些
loot.Add(ItemGenerator.CreateUniqueItem(2));
loot 是 Item 类中的 Chest 变量。下面是CreateUniqueItem的解释
public static Item CreateUniqueItem(int ID) {
if (ID > ItemList.Length) {
return null;
}
if (ItemList[ID] != null) {
return ItemList[ID];
}
else {
return ItemList[0];
}
}
创建物品后,玩家可以将其抓取到库存中。我只是_inventory.add(item);,例如item是ItemList[2]
Player.Insntance.Inventory.Add(chest.loot[2]);
chest.loot.RemoveAt(2);
chest.loot 是
public List<Item> loot = new List<Item>();
包含所有要抓取的物品。
我认为问题就在这里。
------------------------------------------
所以这是问题本身。 如果我想做升级项目,我会使用
_inventory[0].MaxDamage++
但是玩家库存中所有其他相同物品的 MaxDamage 都会增加,我不明白,为什么?我不使用ItemList[ID].MaxDamage++
我认为我应该将所有创建的独特项目保存在某个文件或类似文件中,并从库存中引用它们,而不是提供库存链接。
或仅将项目 ID 存储在文件中,并添加到项目 int 变量(如 upgradeLevel)并存储它。所以取决于upgradeLevel 的物品可以得到增益伤害。
但这对吗?什么是最好的方法?
------------------------------------------
这里是Item类的简短粘贴:
public class Item {
private int _ID
private int _itemLevel;
...
...
public Item(){
_ID = 0;
_itemLevel = 0;
...
...
}
public ID{
get { return _ID; }
set { _ID = value; }
public int ItemLevel {
get { return _itemLevel; }
set { _itemLevel = value; }
}
...
...
...
}
武器类别相同,但有额外的变量,如伤害。
public class Weapon : Item
{
private int _maxDamage;
public Weapon() {
_maxDamage = 0;
}
public int MaxDamage {
get { return _maxDamage; }
set { _maxDamage = value; }
}
}
如有必要,我可以在 GitHub 上提供完整的代码清单。但我认为,我粘贴在上面的代码绰绰有余。我希望我不会忘记任何事情。
如果问题是微不足道的,我不会感到惊讶,但由于某种原因我无法理解它并导致头痛。
如果文字过多,我很抱歉,但我不能更短。
也很抱歉我的英文拼写不好。
提前致谢。
【问题讨论】: