Platformer játék Pálya generálás
Új projekt Csináljunk új 2D projektet Neve legyen Platformer Kép asseteket töltsük le, és importáljuk a projektbe Majd lehet saját asseteket is használni
Assetek Problémák: – Nem egységesek – Felbontásban nincsenek összehabgolva – Egyik kicsi, másik nagy Feladat: – Találjuk meg a kényelmes player méretet – Jól jön itt a kamera nézet esetleg állítsuk a méretét 10- re, azzal könnyebb számolni – Állítsuk be többi asset példány méretét ennek megfelelően
Pályaelemek Játékos Szörny (Vigyázz harap!!!) Érme (nyammmm) Talaj Emelet Mozdítható doboz Nem mozdítható fal
Végső méretek
Próbaképpen berendezhetünk egy jelenetet
Jegyezzük meg: Milyen magasra kerüljenek: – Talaj – Szörny – Érme – Emelet – Szörny/érme a második szinten, harmadik szinten Milyen távol vannak egymástól a talaj/emeletek – Ezt jó lenne kerek értéken tartani (nálam pl 10)
Prefabok Prefab kellene (x mentén a 0-ban legyenek, amikor a prefabot készítjük belőlük, a magasság elmentődik a prefabba): – Talajról – Első emeletről – Második emeletről (ez nekünk könnyebség) – Érméről a talajon/első emeleten/második emeleten – Dobozról ugyanúgy a három szinten (kissé emeljük a szint fölé, majd a fizika miatt lehet fontos) – Szörnyről ugyanúgy a három szinten
Pályagenerálás Kitörölhetjük a jelenet tartalmát, a prefabok volt a lényeg (a player akár maradhat, a kamerát ne töröljük ki) Adjunk hozzá egy empty object-et, nevezzük el LevelGenerator-nak Adjunk az objektumhoz egy szkriptet: LevelGenerator.cs
Példányosítás LevelGenerator szkrip: public class LevelGenerator : MonoBehaviour { public Transform groundPrefab; void Start () { Transform newGroundElement = Instantiate (groundPrefab); } Kössük be a ground prefab-ot a LevelGenerator megfelelő bemenetére (következő dián nyíl jelzi)
Példányosítás
Objektum lerakása valamilyen valószínűséggel public class LevelGenerator : MonoBehaviour { public Transform groundPrefab; void Start () { int levelSize = 50; // 50 ground element wide float groundProb = 0.5f; for (int i = 0; i < levelSize; ++i) { Vector3 offset = new Vector3(i*10,0,0); float rand = Random.value; if(rand < groundProb) { Transform newGroundElement = Instantiate (groundPrefab); newGroundElement.Translate(offset); }
Futtatás
Egyenletes random public class Halton { float inv_base; float value; public Halton(int _base){inv_base = 1.0f / _base; value = 0.0f;} public float Next(){ float r = 1.0f - value f; if (inv_base < r) value += inv_base; else { float h = inv_base, hh; do { hh = h; h *= inv_base; } while ( h >= r ); value += hh + h - 1.0f; } return value; } public class LevelGenerator : MonoBehaviour {
Egyenletes random public class LevelGenerator : MonoBehaviour { public Transform groundPrefab; void Start () { int levelSize = 50; // 50 ground element wide float groundProb = 0.5f; Halton h1 = new Halton(2); for (int i = 0; i < levelSize; ++i) { Vector3 offset = new Vector3(i*10,0,0); float rand = h1.Next(); Debug.Log("rand: " + rand); if(rand < groundProb)
Egyenletes random Álljunk vissza a Random osztályra…
Random számok Nehéz terület sok matekkal Mire figyeljünk? – Legyen „hihető” a játékosnak: nem mindig a teljesen véletlenszerű a jó – Legyen gyors – Ha online kaszinójátékot írunk, ne legyen kiszámítható Valódi random: valamilyen külső forrásból – Atombomlás, atmoszferikus zaj, egérmozgás… Pszeudo-random – „Mag” értékekből (seed) számolt, ismétlődő sorozat
Feladatok Mindent tudunk, amit tudni kell !! 1.Találjunk ki egy szabályrendszert, hogy hogyan kell felépíteni a pályát – Mikor kell talajt lerakni – Mikor rakhatunk le 1./2. emeletet – Mikor rakhatunk le szörnyeket/érmét/dobozokat 2.Programozzuk le a szabályrendszerünket a LevelGenerator-ba. Használjuk a prefabokat!
Prefabok utólagos változtatása A prefabokat később is változtathatjuk Hozzáadhatunk pl. új komponenseket Pl. adjunk hozzá a jelenethez egy érmét (a prefabot húzzuk rá a jelenetre) A coin prefabhoz vegyünk fel egy új szkriptet: CoinAnim néven A jelenetben lévő érméhez is létrejön ez a szkript (szkript forrása a következő dián) A többi érme prefabra is egyszerűen rá lehet húzni ezt az új szkript asset-et (asset nézetből az inspector nézetbe)
public class CoinAnim : MonoBehaviour { Vector3 center; public float moveSpeed = 10.0f; public float moveDist = 0.5f; public float rotateSpeed = 360.0f; void Start () { center = transform.position; } void Update () { float t = Time.time; transform.position = center + moveDist * Mathf.Sin(t * moveSpeed) * Vector3.up; transform.eulerAngles = new Vector3(0,rotateSpeed*t,0); }
Vége