Unity 3D alapok + gyakorlás
Transzformációk Megnéztük a 2D projektek alapjait Ami fontos a 3D-re áttérésnél: 3D transzformációk Fényelés Anyagjellemzők 3D animációk ….
Új 3D projekt Chandelier
Ismerkedjünk a felülettel Gyakoroljuk kicsit 3D navigálás a térben Adjunk hozzá egy objektumot Pl gameObject menu-3Dobject-Sphere Járjuk körül (néha fokuszáljunk rá : F gomb) Használjuk a transzformációs eszközöket (figyelhetjük közben az inspectort)
Transzformációk tengelyei, középpontja
Transzformációk Inspector nézetben legfelső komponens A transzformációk a következő sorrendben futnak le: Scale Rotate Translate A sorrend fontos
Transzformáció gyakorlás Bontsuk fel a transzformációkat transzformáció hierarchiával Legyen külön gameobject az eltoláshoz és a forgatáshoz (scale-t egyenlőre hagyjuk) Rakjuk őket hierarchiába, és helyezzünk el egy objektumot az alsó szintre (pl. teapot asset) Legyen a forgatás x:10,y:20,z:30 Legyen az eltolás: x:5,y:0,z:0 Csináljunk két különböző sorrendű váltpzatot (Köv. dia)
Különböző sorrendű transzformációk
Különböző sorrendű transzformációk Ugyanezt megcsinálhatjuk skálázással és eltolással Forgatással és skálázással …
Feladat: Naprendszer Assetek letölthetők Cél: Minden égitest függetlenül méretezhető legyen Adjunk hozzá Föld bolygót, aki Kering a nap körül (körpályán) Forog a saját tengelye körül Adjunk a Föld-höz holdat, aki Kering a föld körül, de a föld saját tengely körüli forgásától független sebességgel
Forgató szkript Jól jön még egy egyszerű szkript: using UnityEngine; using System.Collections; public class RotateY : MonoBehaviour { public float speed; void Update () { float dt = Time.deltaTime; transform.Rotate(new Vector3(0,dt*speed,0)); }
Próbálgassunk futtatgassunk …
Kamera mozgatása Egyszerű target kamera mozgatás Van egy target, mindig ra nézünk A kamera a target körül forog Egérmozgásra forog a kamera Egér görgőre közelebb/távolabb megy (zoom) A kameraához adjunk új szkriptet:TargetCamera.cs
TargetCamera.cs public class TargetCamera : MonoBehaviour { public float rotateSpeed = 10.0f; public float zoomSpeed; public GameObject target; Transform targetTransform; Transform cameraTransform; float polar = 0; float azimuth = 0; float r = 10; void Start () { targetTransform = target.transform; cameraTransform = gameObject.transform; } …
TargetCamera.cs void Update () { float dt = Time.deltaTime; if(Input.GetMouseButton(0)) { azimuth += Input.GetAxis("Mouse X") * rotateSpeed; polar -= Input.GetAxis("Mouse Y") * rotateSpeed; } r -= Input.GetAxis ("Mouse ScrollWheel") * dt * zoomSpeed; Vector3 camPos = targetTransform.position; camPos += Quaternion.Euler(0,azimuth,0) * Quaternion.Euler(0,0,polar) * (Vector3.right * r); cameraTransform.position = camPos; cameraTransform.LookAt(targetTransform, new Vector3(0,1,0)); } }
Próba …
Föld döntése Nem pontos a föld saját tengelye szerinti forgása A föld tengelye döntött, de ez az irány a naprendszer koordinátatengelyihez képes állandó Ilyet nem tudunk egyszerű hierarchiával megalkotni A föld nap körüli forgását végző transzformáció ezt a bedöntést is forgatná (nem lenne nyár az egyik féltekén ) Ki kellene ütnünk ezt az automatikus forgatást Szkriptet írunk, a föld objektumon kapcsoljuk ki az eddigi forgató szkriptet és adjunk hozzá egy újat:
using System.Collections; public class EarthTilt : MonoBehaviour { using UnityEngine; using System.Collections; public class EarthTilt : MonoBehaviour { public GameObject Sun; public float rotateSpeed; void Update () { Transform sunT = Sun.transform; Transform earthT = gameObject.transform; earthT.rotation = sunT.rotation * Quaternion.Euler(0, 0, 23); transform.Rotate(new Vector3(0, Time.time * rotateSpeed, 0), Space.Self); }
Futtatás Be kell kötni a SolarSys nevű objektumot a script bemenetére, és beállítani a forgási sebességet (365)
Free kamera Nincs target Iránybillentyűkkel előre/hátra mozog Egérrel forog, saját tengelye körül
Kamera mozgatás szkript using UnityEngine; using System.Collections; public class FreeCamera : MonoBehaviour { void Update () { float moveSpeed = 10; float dt = Time.deltaTime; Vector3 move = new Vector3(0,0,0); if (Input.GetAxis ("Horizontal") < 0) { move = move + new Vector3(-1,0,0); } else if(Input.GetAxis ("Horizontal") > 0) { move = move + new Vector3(1,0,0); } if (Input.GetAxis ("Vertical") > 0) { move = move + new Vector3(0,0,1); } else if (Input.GetAxis ("Vertical") < 0) { move = move + new Vector3(0,0,-1); } move.Normalize(); transform.Translate(move * dt * moveSpeed); }
Kamera forgás void Update() { … float rotateSpeed = 2.0f; transform.RotateAround(Vector3.up, dt *Input.GetAxis ("Mouse X") * rotateSpeed); Vector3 rightVector = transform.rotation * Vector3.right; transform.RotateAround(rightVector,-dt * Input.GetAxis ("Mouse Y") * rotateSpeed); //ez nem jó! //transform.Rotate(new Vector3(0,dt *Input.GetAxis ("Mouse X") * rotateSpeed,0)); //transform.Rotate(new Vector3(-dt *Input.GetAxis ("Mouse Y") * rotateSpeed,0,0)); }
Vége