有很多类似的问题,但没有一个明确的答案。我正在使用Unity3D引擎来创建游戏。我已经设置了一个库存系统,其中包含添加项目,删除项目和检查库存是否包含一定数量项目的方法。
我想要做的是每次更新,循环浏览项目,如果玩家拥有制作配方所需的项目,则显示添加一个按钮,玩家可以点击该按钮来制作新项目。< / p>
我以为我可以使用词典来存储所需的物品和数量。像这样:
public static Dictionary<string, int> sword = new Dictionary<string, int>() {
{"stone", 2},
{"Wood", 1}
};
public static Dictionary<string, int> plank = new Dictionary<string, int>() {
{"Wood", 5}
};
但我还需要一种方法来存储所有食谱并循环它们。像字典词典。所以我可以遍历所有制作项目名称。我能做类似的事吗?
public static Dictionary<string, Dictionary> recipes = new Dictionary<string, int>() {
{"Wood Sword", sword},
{"Wood Plank", plank}
};
我希望能够在一个类文件中定义所有配方,并在另一个类文件中循环它们。
我没有太多使用c#的经验,所以我不擅长使用列表和词典,所以我很感激任何建议和帮助。
谢谢!
答案 0 :(得分:0)
嗯..根据你的规格,我想出了类似的东西:
public enum Ingredient = { Wood, Stone, Water, Gold/*and so on*/ };
public class RecipeItem
{
public Ingredient Ingredient{ get; set;}
public int Amount {get; set;}
}
public class Recipe
{
public string Name {get; set;}
public List<RecipeItem> RecipeItems {get;set;}
}
定义食谱时代码中的某处:
var recipes = new List<Recipe>(){
new Recipe(){
Name = "Wood Sword",
RecipeItems = new List<RecipeItem>(){
new RecipeItem(){
Ingredient = Wood,
Amount = 1
},
new RecipeItem(){
Ingredient = Stone,
Amount = 5
}
}
},
new Recipe(){
Name = "Plank",
RecipeItems = new List<RecipeItem>(){
new RecipeItem(){
Ingredient = Wood,
Amount = 5
}
}
}
// More recipes
};
PS:我建议你花几天时间学习C#的基础知识
答案 1 :(得分:0)
您正在寻找的内容类似Dictionary<string, Dictionary<string, int>>
- Dictionary
,string
键和Dictionary<string, int>
值。像这样初始化它:
var recipes = new Dictionary<string, Dictionary<string, int>>
{
{ "Sword", new Dictionary<string, int> { { "stone", 2 }, { "wood", 1 } } },
{ "Plank", new Dictionary<string, int> { { "wood", 5 } } }
};
我个人觉得有点沉重,容易搞砸。我更倾向于使用结构来保持内部结构,例如:
public struct RecipeComponent
{
public readonly string Material;
public readonly int Count;
public RecipeComponent(string material, int count)
{
Material = material;
Count = count;
}
}
public readonly Dictionary<string, RecipeComponent[]> recipes = new Dictionary<string, RecipeComponent[]>
{
{ "Sword", new[] { new RecipeComponent("stone", 2), new RecipeComponent("Wood", 1) } },
{ "Plank", new[] { new RecipeComponent("Wood", 5) } }
};
稍微强一些,但您仍然可以在运行时操作recipes
列表的内容,包括替换所需组件的列表。 ReadOnlyDictionary
有助于解决这个问题。
答案 2 :(得分:0)
到目前为止(对我而言),最简单的方法是使用通用列表和for循环。 第一:使用此功能检查物品是否在库存中 public bool CheckItems(列表检查){
List<Item> it = new List<Item> (check);// Make sure original list is not changed.
foreach(Item inventoryItem in myItems) {// Loop through your INVENTORY's items.
if (it.Contains(inventoryItem)) {//If contains, remove.
it.Remove(inventoryItem);
if(it.Count == 0) {
return true; //When the count is less than zero, you can craft the item.
}
}
}
return false;
}
这只需要在工艺函数中调用,如果返回true,则可以制作项目。 注意:检查清单是工艺所需的项目清单,myItems是清单中的项目清单。