0
votes

Comment détruire les éléments dynamiques du panneau dans le script Unity C #

Tentative de suppression des éléments du panneau (videz-le), puis remplissez à nouveau le panneau avec de nouveaux éléments (boutons)

J'ai déjà essayé de supprimer chaque élément avec le foreach que vous voyez ci-dessous sans succès

public GameObject Button;
public Transform buttonContainer;
public void create_buttons(Orbital o)
{
    GameObject go = Instantiate(Button);
    var panel = GameObject.Find("station_panel");
    //Destroy(GameObject.Find("station_panel"));

    foreach (UnityEngine.UI.Button b in panel.GetComponents<UnityEngine.UI.Button>())
    {
        //Destroy(b.gameObject);
        b.enabled = false;
    }

    go.transform.position = panel.transform.position;
    go.GetComponent<RectTransform>().SetParent(panel.transform);
    //go.GetComponent<RectTransform>().SetInsetAndSizeFromParentEdge(RectTransform.Edge.Left, 0, 10);

    go.GetComponent<UnityEngine.UI.Button>().onClick.AddListener(() => onClick());
    go.GetComponentInChildren<Text>().text = o.name;
}
void onClick()
{
    Debug.Log("aaaaaaaaaaaaaaa");


    canvas.enabled = false;
}


3 commentaires

Pouvez-vous préciser ce que vous attendez de votre code et ce qui se passe à la place? Ce n'est pas encore tout à fait clair d'après votre question.


Il y a un panneau. J'y ajoute des boutons dynamiquement. Ça arrive. Mais à chaque itération, de nouveaux boutons sont ajoutés au panneau, dupliquant essentiellement les anciens. Je veux d'abord vider / détruire ce qui se trouve dans le panneau, puis y ajouter à nouveau des boutons. Quelque chose comme initialiser le panneau à un panneau vide (btw ne peut pas détruire le panneau), puis le repeupler


Btw au lieu de la boucle foreach , vous pouvez simplement rendre le champ prefab de type public Button Button; . alors vous obtiendrez le composant directement à partir de Button go = Instantiate (Button, panel.transform); go.enabled = false; et vous pouvez également ignorer les deux lignes suivantes go.transform.position = panel.transform.position; go.GetComponent<RectTransform>().SetParent(panel.transform);


3 Réponses :


0
votes

Faites une liste et ajoutez n'importe quel bouton que vous créez pour votre panneau.

Une fois que vous voulez l'effacer, effacez cette liste, mais GetCompoenents ne renverra pas tous les boutons de votre objet de jeu Panel car vous ne pouvez pas ajouter un composant à 2 boutons à un seul objet de jeu.

Ajoutez également -en utilisant UnityEngine.UI- en haut de votre script pour être facilement lu pour être comme

 foreach (Button b in list)
{
    Destroy(b.gameObject);        
}


1 commentaires

Si vous faites cela (ce qui est une alternative valide à l'autre réponse), assurez-vous de faire également list.Clear(); ensuite pour supprimer également toutes les entrées pour les références aux objets détruits qui sont maintenant null bits null toujours là.



1
votes

La hiérarchie de transformation du panneau contient une référence à eux.
Transform panelTransform = GameObject.Find("station_panel").transform;
foreach(Transform child in panelTransform) {
    Destroy(child.gameObject);
}


3 commentaires

Je pense que vous voulez dire Destroy(child.gameObject);


Je recommanderais également de ne pas utiliser Find mais plutôt de stocker la référence la première fois qu'elle a été appelée, par exemple, comme private GameObject panel; private Transform GetPanelTransform { get { if(!panel) { panel = Find("station_panel"); } return panel.transform; } } . Ou ne pas utiliser Find du tout et plutôt lier la référence dans l'inspecteur en utilisant [SerializeField] private Transform panelTransform;


@derHugo Aussi ça, mais je n'allais pas entrer ici. Tout ce que je voulais montrer, c'était que la hiérarchie des transformations était traversable.



0
votes

DestroyImmediate (i-am-gameobject);


1 commentaires

Cela ne répond pas à la question. Une fois que vous aurez une réputation suffisante, vous pourrez commenter n'importe quel message ; à la place, fournissez des réponses qui ne nécessitent pas de clarification de la part du demandeur . - De l'avis