- Home /
Help with crafting system.
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class Recipe : MonoBehaviour {
public string itemName;
public Dictionary<string, int> items;
public Recipe(string name, Dictionary<string, int> materials)
{
itemName = name;
items = materials;
Inventory.recipes.Add(this);
}
}
//////////////////////////////////////////////////////////
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
public class RecipeCreator : MonoBehaviour {
public RecipeCreator() {
Recipe WoodPlanks = new Recipe ("WoodPlanks", new Dictionary<string, int> (){
{"Wood", 2}
});
Recipe Knife = new Recipe ("Knife", new Dictionary<string, int> (){
{"Stick", 1}, {"Stone", 1}
});
}
}
These are my two scripts for the crafting, everything works fine except when there is more than one material for the recipe im able to craft the item even if i only have one of the items. so when im crafting the knife i only need 1 stick or 1 stone but i want it to require both. how would i do that?
Answer by LaireonGames · Feb 22, 2015 at 08:12 PM
I think you are sharing the wrong part of your code. This looks like a sensible way of creating your recipe but doesn't show anything about how it is read and implemented. I suggest you start looking there for your bug
Well this is the part of my code in my inventory script. maybe the bugs here but im not seeing anything. ($$anonymous$$ost of this script was from a tutorial, i made some changes but i'm still a beginner, so i don't fully understand it).
public List GetCraftable() { List craftable = new List();
for(int i = 0; i < recipes.Count; i++)
{
foreach(var mat in recipes[i].items.$$anonymous$$eys)
{
if(InventoryContains(mat, recipes[i].items[mat]))
{
craftable.Add(recipes[i].itemName);
}
}
}
return craftable;
}
public void Craft(string item)
{
List<string> craftable = GetCraftable();
for(int i = 0; i < recipes.Count; i++)
{
if(recipes[i].itemName == item)
{
foreach(var mat in recipes[i].items.$$anonymous$$eys)
{
RemoveItem(mat, recipes[i].items[mat]);
}
}
}
Yeah your bug is definitely here. Basically what you are doing, as you are seeing, is checking if any of the materials are present. Try this:
for(int i = 0; i < recipes.Count; i++)
{
bool canCraft = true;
foreach(var mat in recipes[i].items.$$anonymous$$eys)
{
if(!InventoryContains(mat, recipes[i].items[mat]))//basically if one of the materials are missing show this cannot be crafted
canCraft = false;
}
if(canCraft)
craftable.Add(recipes[i].itemName);
}
Your answer
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
Distribute terrain in zones 3 Answers
Illuminating a 3D object's edges OnMouseOver (script in c#)? 1 Answer
Flip over an object (smooth transition) 3 Answers
[Answered](C#)Comparing two Lists for a Crafting System 2 Answers