Transform je jedina Unityjeva komponenta za koju ne moramo koristiti GetComponent kako bi je koristili.
Ona se sastoji od position, rotation i scale.
U lekciji GameObject smo je samo spomenuli, a u ovoj ćemo se malo bolje upoznati s njom.
Prije nego li krenemo na transfrom moramo razumjeti razliku njegovih globalnih i lokalnih svojstva.
Globalna svojstva predstavljaju poziciju i rotaciju u odnosu na globalnom kordinatnom sustavu igre. Naprimjer ako promijenimo rotaciju objekta njegovi se globalni vektori pozicije neće promijeniti.
Lokalna svojstva predstavljaju poziciju, rotaciju i veličinu u odnosu na njegov roditeljski objekt u lokalnom koordinatnom sustavu. Naprimjer ako promijenimo rotaciju objekta njegovi će se lokalni vektori pozicije promijeniti. Veličina je jedino svojstvo transform-a koje ne može biti globlano.
Poziciju mijenjamo uz pomoć Vektora.
U sljedećem primjeru ćemo vam pokazati kako promijeniti poziciju za objekt1.
public GameObject objekt1;
void Start()
{
objekt1.transform.position = new Vector3(1, 2, 3);
//ispisivanje x, y i z pozicije
Debug.Log(objekt1.transform.position.x); //ispisuje 1
Debug.Log(objekt1.transform.position.y); //ispisuje 2
Debug.Log(objekt1.transform.position.z); //ispisuje 3
}
Poziciju za samo x, y ili z ne možemo mijenjati posebno. Kod ispod je pogrešean.
public GameObject objekt1;
void Start()
{
objekt1.transform.position.x = 2; //ovo je pogrešno
}
Ako želimo napraviti glatku interpolaciju pozicije koristimo se Vector3.Lerp.
U sljedećem primjeru mijenjamo poziciju objekt1 uz pomoć Vector3.Lerp.
public GameObject objekt1;
[SerializeField] float brzina;
void Update()
{
Vector3 novaPozicija = new Vector3(1, 2, 3);
objekt1.transform.position = new Vector3.Lerp(objekt1.transform.position, novaPozicija, Time.deltaTime * brzina);
}
Ovi primjeri do sad su bili primjeri za globalnu poziciju. Lokalna se pozicija piše na isti način samo nakon transform-a napišemo localPosition.
Ispod se nalazi primjer za lokalnu poziciju.
public GameObject objekt1;
void Start()
{
objekt1.transform.localPosition = new Vector3(1, 2, 3);
}
Kao što smo spomenuli u prijašnjoj lekciji, kvaternione koristimo umjesto vektora za mijenjanje rotacije.
U sljedećem primjeru ćemo promijeniti rotaciju za objekt1.
public GameObject objekt1;
void Start()
{
objekt1.transform.rotation = Quaternion.Euler(90, 0, 180);
//ispisivanje rotacije
Debug.Log(objekt1.transform.rotation.x); //ispisuje 90
Debug.Log(objekt1.transform.rotation.y); //ispisuje 0
Debug.Log(objekt1.transform.rotation.z); //ispisuje 180
}
Rotaciju za samo x, y ili z ne možemo mijenjati posebno. Kod ispod je pogrešean.
public GameObject objekt1;
void Start()
{
objekt1.transform.rotation.x = 2; //ovo je pogrešno
}
Ako želimo napraviti glatku interpolaciju rotacije koristimo se Quaternion.Lerp.
U sljedećem primjeru mijenjamo rotaciju objekt1 uz pomoć Quaternion.Lerp.
public GameObject objekt1;
[SerializeField] float brzina;
void Update()
{
Quaternion novaRotacija = Quaternion.Euler(90, 0, 180);
objekt1.transform.rotation = Quaternion.Lerp(objekt1.transform.rotation, novaRotacija, Time.deltaTime * brzina);
}
Neki objekt možemo rotirati uz pomoć skripte tako da se koristimo Quaternion.Lerp i nakon toga samo povećavamo x, y ili z rotaciju.
Kako bi nam bilo lakše možemo se koristiti funkcjiom Rotate koja će automatski rotirati objekt po zadanoj osi.
Nakon što postavimo po kojima će se osima i kako rotirati moramo napisati Space.Self ili Space.World.
Space.Self se koristi kako bi rekli kodu da mijenja lokalnu rotaciju.
Space.World se koristi kako bi rekli kodu da mijenja globalnu rotaciju.
public GameObject objekt1;
public GameObject objekt2;
void Update()
{
objekt1.transform.Rotate(1, 0, 0, Space.Self); //mijenja se lokalna rotacija po x osi
objekt2.transform.Rotate(1, 0, 0, Space.World); //mijenja se globalna rotacija po x osi
}
Ovi primjeri do sad su bili primjeri za globalnu rotaciju. Lokalna se rotacija piše na isti način samo nakon transform-a napišemo localRotation.
Ispod se nalazi primjer za lokalnu rotaciju.
public GameObject objekt1;
void Start()
{
objekt1.transform.localRotation = Quaternion.Euler(90, 180, 90);
}
Kao što smo prije spomenuli veličina je jedino svojstvo transform-a koje ne može biti globalno.
Kao i kod pozicije za promjenu veličine koristimo se Vektorima.
U sljedećem primjeru mijenjamo veličinu za objekt1.
public GameObject objekt1;
void Update()
{
objekt1.transform.localScale = new Vector3(2, 3, 4);
//ispisivanje veličine
Debug.Log(objekt1.transform.localScale.x); //ispisuje 2
Debug.Log(objekt1.transform.localScale.y); //ispisuje 3
Debug.Log(objekt1.transform.localScale.z); //ispisuje 4
}
Veličinu za samo x, y ili z ne možemo mijenjati posebno. Kod ispod je pogrešean.
public GameObject objekt1;
void Start()
{
objekt1.transform.localScale.x = 2; //ovo je pogrešno
}
Ako želimo napraviti glatku interpolaciju veličine koristimo se Vector3.Lerp.
U sljedećem primjeru mijenjamo veličinu za objekt1 uz pomoć Vector3.Lerp.
public GameObject objekt1;
[SerializeField] float brzina;
void Update()
{
Vector3 novaVelicina = new Vector3(1, 2, 3);
objekt1.transform.localScale = Vector3.Lerp(objekt1.transform.localScale, novaVelicina, Time.deltaTime * brzina);
}