Kamera kontroler. Log #7 (Unity, C#)
14.03.2017

                Postava se sice hýbe, ale kamera zůstává na místě. V plánu je dvojí ovládání kamery. První, kdy kamera bude hráče následovat a druhé, kdy hráč může kameru posouvat nad levelem. Vytvořím ve složce "Scripts" podsložku "Camera­" a do ní vložím nový skript pojmenovaný "CameraController". První vyřeším pohyb kamery, potom následování hráče. Kamera se bude posouvat na základě kláves WSAD, takže jde jen o nastavení souřadnic kamery, podle vstupu a také rychlost pohybu kamery. Problém však nastává, když chceme posouvat kameru dopředu nebo dozadu. Jelikož je kamera natočena, aby sledovala hráče, její lokální osa je vychýlena a tak by změna tohoto vektoru měla za následek posun nahoru nebo dolů po natočené ose. Tomu zabráním tak, že si první uložím úhel natočení kamery, což je v podstatě pohled na hráče, vynuluju osy X a Z, pak provedu jejich posun a nakonec nastavím zpět rotaci. Když to provedu v každém snímku, lidské oko to nezaznamená a kamera se tak plynule pohybuje. Tohle celé vložím do funkce Move(), kterou budu volat jen pokud nenásleduje kamera hráče. Funkce pak vypadá následovně.

 

void Move()
{
	Vector3 rot = transform.rotation.eulerAngles;
	transform.rotation = Quaternion.Euler(0, rot.y, 0);
	float xAxisValue = Input.GetAxis("Horizontal");
	float zAxisValue = Input.GetAxis("Vertical");
	transform.Translate(new Vector3(xAxisValue * cameraSpeed, 0.0f, zAxisValue * 	cameraSpeed));
	transform.rotation = Quaternion.Euler(rot);
}

 

                Nyní je na řadě následování hráče. Následování bude fungovat, tak že kamera se bude od hráče pohybovat v nějaké vzdálenosti, to bude můj offset. V téhle vzdálenosti se kamera bude točit kolem hráče, ale zároveň jej sledovat s konstantním offsetem, když se postava bude hýbat. Offset je tří rozměrný vektor, který říká jak bude kamera daleko po ose X,Y a Z. Y je výška a Z vzdálenost směrem dopředu, dozadu, X nepoužívám, to je pro vzdálenost vlevo, vpravo. Důležitým prvkem je funkce LookAt(), zajišťující, že se bude kamera pořád otáčet za postavou hráče. To ovšem nestačí, kamera musí hráče taky následovat, když se pohybuje. To je snadný, protože jen kopírujeme souřadnice postavy hráče a k tomu přičtu můj nastavený offset. Jako první uložím rotaci do mého ofssetu (v tomhle případě je rotace totiž jen souřadnice na kružnici okolo hráče). Na základě kláves A a D, měním souřadnice pozice okolo hráče v kružnici, ty pak jen přenásobím mým přednastaveným offsetem, aby zůstala vzdálenost od hráče stejná. V tomhle je skvělá funkce Quaternion.AngleAxis, která převádí úhel na souřadnice osy. Výslednou pozici kamery pak jen sečtu s právě vypočítaným offsetem. Nakonec zavolám funkci LookAt() a je hotovo. Pokud chci měnit výšku kamery, je potřeba v mém offsetu, který už má uloženou souřadnici rotace jen měnit hodnotu Y, na základě vstupu W a S.

 

void Update()
{
	if (follow)
	{
		offset = Quaternion.AngleAxis(-Input.GetAxis("Horizontal") * sensitivityRotation, Vector3.up) * offset;

		offsetY += (Input.GetAxisRaw("Vertical") * sensitivityVertical);

		if (offsetY < maxYDistance && offsetY > minYDistance)
		{
			offset.y = offsetY;
		}

		if (Input.GetKeyUp(KeyCode.W) || Input.GetKeyUp(KeyCode.S))
		{
			offsetY = offset.y;
		}

		transform.position = target.position + offset;
		transform.LookAt(target);

		}
		else
		{
			Move();
		}

}

 

 

                Není to úplně stoprocentní, ale zbytek se doladí v průběhu. Další díly se budou týkat něco málo k jednoduchému AI, patrolování pro NPC a jednoduché reakce na hráče.