对不起,但我不能在没有介绍的情况下提出问题。(如果您不确定是否要全部阅读,我仍然尝试提出一个问题,问题是如果我尝试更改我的项目属性,它适用于所有其他相同的项目,如何解决这个问题?)
我有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 上提供完整的代码清单。但我认为,我粘贴在上面的代码绰绰有余。我希望我不会忘记任何事情。
如果问题是微不足道的,我不会感到惊讶,但由于某种原因,我无法理解它并导致头痛。
如果文字太多,我很抱歉,但我不能更短。
也为我糟糕的英语拼写感到抱歉。
提前致谢。