cum pot activa și dezactiva obiecte cu un anumit tag în c#? (Dezvoltarea jocurilor, Unitate, C#)

Indiepixel a intrebat.
a intrebat.

Am un script care ar trebui să găsească fiecare obiect activ cu o anumită etichetă și la apăsarea unui buton să activeze și să dezactiveze meshrenderer-ul și colider-ul acestuia. dar scriptul încearcă să activeze și să dezactiveze doar cele anterioare pe obiectul la care este atașat scriptul. ce fac greșit și există vreo modalitate fezabilă de a face acest lucru?

Am verificat toate etichetele, dar scriptul continuă să încerce să ajungă la acest obiect fără legătură. am încercat chiar să adaug un mesh renderer și un colider. dar nimic.

iată scriptul:

private bool on = true;    

public void Update()
{
    GameObject[] gameObjectArray = GameObject.FindGameObjectsWithTag("buildnode");


    if (Input.GetKeyDown("b"))
    {
        on = !on;
    }



    if (on == false)
    {
        foreach (GameObject go in GameObject.FindGameObjectsWithTag("buildnode"))
        {
            go.GetComponent<MeshRenderer>().enabled = false;
            go.GetComponent<Collider>().enabled = false;
        }
    }

    if (on==true)
    {
        foreach (GameObject go in GameObject.FindGameObjectsWithTag("buildnode"))
        {
            go.GetComponent<MeshRenderer>().enabled = true;
            go.GetComponent<Collider>().enabled = true;
        }
    }
}

Mulțumesc și să aveți o zi bună.

Comentarii

  • Privind acest script ar trebui să funcționeze. Singurele explicații care mi-ar veni în minte este că obiectele nu au de fapt tag-ul corect sau că un alt script interferează cumva….  > Por Philipp.
  • am editat întrebarea pentru a arăta în profunzime despre ce se întâmplă îmi pare rău că nu am putut adăuga doar comentariul. există o explicație pentru cele de mai sus?-  > Por Indiepixel.
  • Se pare că, probabil, aveți un alt obiect numit „builder” în scena dvs. care cauzează aceste probleme.-  > Por DMGregory.
  • Încă două lucruri: Aș muta cele două blocuri if în interiorul verificării key-down (nu este nevoie să activezi sau dezactivezi lucruri la fiecare cadru! Nu s-a schimbat nimic! ) și aș folosi if(on) și else–  > Por Draco18s nu mai are încredere în SE.
2 răspunsuri
Glenn van Acker

Se pare că acest cod ar trebui să funcționeze, probabil că trebuie să adăugați verificări pentru a vă asigura că gameObject este activ și are componentele cu care doriți să lucrați. faceți acest lucru cu o clauză Linq where ca aceasta:

  GameObject[] gameObjectArray = GameObject.FindGameObjectsWithTag("buildnode")
     .Where(go => go.activeInHierarchy && go.getComponent<MeshRenderer>() && 
     go.getComponent<Collider>()).ToArray();

apoi puteți simplifica cu adevărat declarațiile if prin simpla eliminare a acestora:

foreach(var go in gameObjectArray){
     go.GetComponent<MeshRenderer>().enabled = on;
     go.GetComponent<Collider>().enabled = on;
}

virtouso

Nu puteți găsi Obiecte dezactivate cu GameObject.FindGameObjectsWithTag("buildnode")

puteți găsi obiectul pe care îl doriți folosind:

  GameObject[] items=     Resources.FindObjectsOfTypeAll(typeof(UnityEngine.GameObject)) as GameObject[];
  GameObject obj = items.FirstOrDefault(x=>x.tag=="mytag");

Comentarii

  • CompareTag()–  > Por Draco18s nu mai are încredere în SE.

Tags:,