- Home /
How to make object instantiate once but still call next function.
hi all, I am having a mind melter trying to set up a early crafting mechanism, I want to press a button and have an object appear for the player to use a raycast to to place on the ground. this is all fine and works and when the player clicks the mouse it places a new object on the ground, however when i turn on the crafting system with (c key for now) the template object spawns over and over.
Code public bool craftingOn = false; public Transform spawner; public Transform[] myObjects; public Transform[] myRealObjects; public float rayDistance = 100f;
public string tagCheck = "Ground";
public bool checkAllTags = false;
//need to link this to inventory so that items only go into arrays that are in the inventory.
void Update ()
{
craftOnOff(myObjects[0],myRealObjects[0]);
}
void CraftItem(Transform unCrafted, Transform crafted)// this works pefect just need to adapt items that put into function
{
bool foundHit = false;
RaycastHit hit = new RaycastHit();
foundHit = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition),out hit,rayDistance);
if(foundHit && !checkAllTags && hit.transform.tag != tagCheck)
foundHit = false;
if(foundHit)
{
unCrafted.position = hit.point;//use a loop here just test
if(Input.GetButtonDown("Fire1"))
{
Transform clone;
clone = Instantiate(crafted,hit.point,Quaternion.identity)as Transform;
}
}
}
void craftOnOff(Transform item, Transform realItem)//for now c turns on off crafting ray for player.
{
if(Input.GetKeyDown(KeyCode.C))//need set this to turn on from a UI Button not key
{
craftingOn = !craftingOn;// turning on and off the crafting needs to be set up in controls properly
}
if(craftingOn)
{
Transform cloneItem;
cloneItem = Instantiate(item,spawner.transform.position,spawner.transform.rotation)as Transform;
CraftItem(cloneItem,realItem);
}
if(!craftingOn)
{
//get rid of object if one is instantiated and player changes mind.
// and add resources back to inventory
}
}
Answer by g8minhquan · Jul 03, 2015 at 01:38 AM
After turning on the craftingOn = true with the GetKeyDown (KeyCode.C) , you haven't turn it off with the GetKeyUp(KeyCode.C), so it's on forever, and the function got called every Update() (like 60 times per second). That's why.
A better way to organize this code is to to put the Input.GetKeyDown check into the Update() function Like this:
void Update ()
{
if(Input.GetKeyDown(KeyCode.C)) {
CraftMyStuff(something1,something2);
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613201641im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Multiple Cars not working 1 Answer
C# Function that returns instantiated object 1 Answer
Distribute terrain in zones 3 Answers
Why is instantiated animator prefabs are not working properly? 2 Answers