GameObject je glavna Unity klasa za sve objekte/entitete u unity sceni.
Primjeri GameObject su: kamera, kocka, svjetla...
Svaki GameObject sadrži određene komponente (transform, collider...) kojima možemo pristupiti i putem koda.
Objekt stvaramo unutar skripte tako što prvo definiramo pravo pristupa (private ili public) zatim napišemo GameObject te ga nazovemo po želji.
private GameObject objekt1;
public GameObject objekt2;
Ako smo objekt označili s public ili [SerializeField] dovoljno je otići u Unity te povući željeni objekt iz hierarchya na predviđeno mjesto u skripti koja se nalazi pod Inspectorom na objektu na kojem je skripta. Na taj način će C# znati o kojem se objektu radi kada mu mjenjamo svojstva unutar skripte.
Ako smo objekt označili s private onda nam objekt nije vidljiv unutar Inspectora te ga je potrebno naći unutar skripte uz pomoć imena ili taga. Pronalaženje obično pišemo unutar void Start() jer je to metoda koja se poziva prilikom pokretanja scene nakon što je objekt stvoren. Iz tog razloga se ne koristimo metodom OnAwake() za pronalaženje objekta putem taga ili imena.
private GameObject objekt1;
private GameObject objekt2;
void Start()
{
objekt1 = GameObject.FindWithTag("TagObjekta"); //Pronalaženje objekta uz pomoć taga
objekt2 = GameObject.Find("ImeObjekta"); //Pronalaženje objekta uz pomoć imena
}
Kada pristupamo komponenti nekog objekta prvo napišemo naziv objekta čijim komponentama želimo pristupiti, a zatim dohvatimo tu komponentu uz pomoć GetComponent<imeKomponente>().
objekt1.GetComponent<imeKomponente>().svojstvoKomponente = promjena;
U sljedećem primjeru pristupit ćemo komponenti MeshRenderer te ćemo je uz pomoć koda isključiti pa odmah nakon toga uključiti.
public GameObject objekt1;
void Start()
{
objekt1.GetComponent<MeshRenderer>().enabled = false; //Ovdje isključujemo MeshRenderer objektu kojeg smo unutar skripte nazvali objekt1
objekt1.GetComponent<MeshRenderer>().enabled = true; //Ovdje uključujemo MeshRenderer objektu kojeg smo unutar skripte nazvali objekt1
}
U sljedećem primjeru pristupit ćemo komponeti Rigidbody te ćemo joj promjeniti brzinu za naprijed.
O ovoj komponenti ćemo posebno učiti u jednoj od nadolazećih lekcija.
public GameObject objekt1;
void Start()
{
objekt1.GetComponent<Rigidbody>().velocity = this.transform.forward * 20; //mjenjamo brzinu za naprijed od Rigidbodya na objektu1
}
Ako se skripta nalazi na objektu čijim komponentama želimo pristupiti umjesto naziva objekta napišemo this.
void Start()
{
this.GetComponent<MeshRenderer>().enabled = false; //Ovdje isključujemo MeshRenderer objektu na kojem je skripta
this.GetComponent<MeshRenderer>().enabled = true; //Ovdje uključujemo MeshRenderer objektu na kojem je skripta
}
Isto bi bilo i da smo napiasli samo GetComponent<MeshRenderer>().enabled = false; bez this.
Kontinuirano korištenje GetComponent<ImeKomponente>() za svaki put kada želimo izmjeniti svojstva komponente određenog objekta je procesorski zahtjevno.
Iz takvog razloga komponentu određenog objekta spremamo pod referencu.
U sljedećem primjeru imamo privatnu komponentu MeshRenderer. Unutar void Start stavljamo da se ta komponenta MeshRenderer odnosi na MeshRenderer objekta kojeg smo unutar skripte nazvali objekt1. Nakon toga isključujemo MeshRenderer tog objekta.
Objekt1 pronalazimo putem imena u ovom primjeru.
private GameObject objekt1;
private MeshRenderer meshR;
void Start()
{
objekt1 = GameObject.Find("kocka"); //objekt1 se unutar scene zove kocka
meshR = objekt1.GetComponent<MeshRenderer>();
meshR.enabled = false;
}
Jedina komponenta kojoj možemo pristupiti bez korištenja GetComponent<imeKomponente>() je transform.
O njoj ćemo detaljnije učiti u jednoj od sljedećih lekcija.