- Home /
Destroy doesn't work when also instantiating new objects
I got this function to create a few button elements:
//Keep track of added perk buttons
List<GameObject> displayedPerkButtons = new List<GameObject>();
//Adds perk buttons based on the current chosenPerks.
void PopulatePerkChooser()
{
//Removes any old perk buttons if present
if (displayedPerkButtons.Count > 0)
{
for (int i = 0; i < displayedPerkButtons.Count; i++)
{
Destroy(displayedPerkButtons[i].gameObject);
}
displayedPerkButtons.Clear();
}
//For each perk in chosenPerks, instantiate a new PerkButton, run its construct function passing along the specific perk, and add it to the displayedPerkButtons list for future removal
for (int i = 0; i < PerkManager.Instance.chosenPerks.Count; i++)
{
GameObject newPerkButton = Instantiate(perkTemplate, perkButtonContainer.transform);
newPerkButton.GetComponent<PerkButton>().ConstructPerkButton(PerkManager.Instance.chosenPerks[i]);
displayedPerkButtons.Add(newPerkButton);
}
//Constructs "Random perk" button at the end, and add this as well to displayedPerkButtons
GameObject randomPerkButton = Instantiate(randomPerkTemplate, perkButtonContainer.transform);
displayedPerkButtons.Add(randomPerkButton);
}
It generates the buttons just fine, but it fails to destroy any old buttons if it is run more than once. Interestingly, if I make a second function that only contains the removal part, and run that separately after the first function, it removes the buttons as intended - so something seems to be wrong with how it interacts with the creation of the new buttons.
What might I be missing here?
You could try using DestroyImmediate ins$$anonymous$$d of Destroy.
I did try that, but it doesn't work either - in theory I'd think it would work either way since it's not trying to get children or anything like that, but it doesn't seem to.
Answer by ivarhill · Mar 09, 2019 at 08:45 PM
Turns out the issue was due to the list of actual buttons to use - that list didn't clear properly so it added copies of the same buttons to replace the deleted ones.
Your answer
Follow this Question
Related Questions
using Contains(gameObject) to find and destroy a gameObject from a list 2 Answers
Store Game Object Into List For Later Reinstantiation? 0 Answers
Destroy the current GameObject? 7 Answers
"Destroy assets is not permitted to avoid data loss" 2 Answers
Destroying childs and Instantiate [C#] 0 Answers