3D-s technológiák a játékfejlesztésben UDK bevezetés
Első lépések • Könyvtár szerkezet: • UDK-XXXXXXXX – Binaries – Development: Itt található a játék forráskódja, ezt kibővíthetjük. FONTOS: A már meglévő kódokat ne módosítsuk! – Engine – UDKGame
UDKGame könyvtár • Autosaves: A telepítés után még nem létezik. A szerkesztő időnként ide menti el a szerkesztés alatt lévő pályát, hogy a szerkesztő hibája esetén innen vissza lehessen tölteni azt. • Config: Különböző konfigurációs fájlokat tartalmaz. • Content: Pályák, hangok, karakterek. • Logs: Események naplói, illetve debug logok.
UDKGame könyvtár • Movies: Átvezető videók, pálya betöltés közbeni videók. • Script: A script fájlok lefordított verziói ide kerülnek, a játék terjesztésekor ezekre is szükség van. • Splash: A szerkesztő által használt splash képek. • Localization: Több nyelvű program esetén ide helyezzük el a lefordított szövegeket.
Saját kód • Különítsük el a saját kódunkat az EPIC által írt kódtól • A Development\Src könyvtárban hozzuk létre a saját könyvtárunkat, például: AwesomeGame, majd ebbe a Classes könyvtárat • A fordító majd az UDKGame\Script könyvtárba helyezi az AwesomeGame.u lefordított fájlt
Saját kód Hozzuk létre az AwesomeGame.uc forrásfájlt a Classes könyvtárban: Class AwesomeActor extends Actor placable; defaultproperties { Begin Object Class = SpriteComponent Name = Sprite Sprite = Texture2D'EditorResources.S_NavP' End Object Components.Add(Sprite) }
Saját kód Az osztály neve AwesomeActor, egyeznie kell a fájl nevével! Class AwesomeActor extends Actor placeable; defaultproperties { Begin Object Class = SpriteComponent Name = Sprite Sprite = Texture2D'EditorResources.S_NavP' End Object Components.Add(Sprite) }
Saját kód Az osztály az Actor osztályból származik, így örökli annak tulajdonságait. Class AwesomeActor extends Actor placeable; defaultproperties { Begin Object Class = SpriteComponent Name = Sprite Sprite = Texture2D'EditorResources.S_NavP' End Object Components.Add(Sprite) }
Saját kód Az osztályból készített példányt elhelyezhetjük a szerkesztőben. Class AwesomeActor extends Actor placeable; defaultproperties { Begin Object Class = SpriteComponent Name = Sprite Sprite = Texture2D'EditorResources.S_NavP' End Object Components.Add(Sprite) }
Saját kód Az osztályból készített példányt egy spriteként látjuk a szerkesztőben és a játékban. Class AwesomeActor extends Actor placeable; defaultproperties { Begin Object Class = SpriteComponent Name = Sprite Sprite = Texture2D'EditorResources.S_NavP' End Object Components.Add(Sprite) }
Saját kód • Tudassuk a rendszerrel, hogy létezik a saját AwesomeGame könyvtárunk • Nyissuk meg az UDKGame\Congig\DefaultEngine.ini-t, és az AwesomeGame-t adjuk az EditPackages listához: [UnrealEd.EditorEngine] +EditPackages=UTGame +EditPackages=UTGameContent +EditPackages=AwesomeGame
Az osztály használata • Fordítsuk le a megírt scriptet: • Lépjünk ki a szerkesztőből • Indítsuk újra a szerkesztőt, vagy az UnrealFrontend segítségével indítsuk el a fordítást • A Content Browser-ben keressük meg az AwesomeActor-t, majd húzzuk a pályára
Hello world • Rejtsük el az AwesomeActor-t játék közben: Begin Object Class=SpriteComponent Name=Sprite Sprite = Texture2D'EditorResources.S_NavP' HiddenGame = True End Object
• A játék indulásakor írjunk a log-ba egy üzenetet: Class AwesomeActor extends Actor placeable; function PostBeginPlay() { `log("Hello world!"); }
Változók • Változó deklaráció: • var ; • Szerkeszthető változó: • var() ; • Változó kiíratása logba: var int a; `log("a valtozo = " @a);
Változók • • • • • • •
bool: logikai érték, true vagy false lehet byte: 1 bájtos egész, 0-tól 255-ig terjedhet int: 32 bites egész float: 32 bites lebegőpontos érték string enum struct
Változók, példa Class AwesomeActor extends Actor placeable; enum Felsorolas { HAPCI, VIDOR, KUKA }; var() Felsorolas torpok; var() bool a; var() byte b; var() int c; var() float d; var() string e; var(Valami) bool f; var int g; […]
Tömbök Class AwesomeActor extends Actor placeable; enum Felsorolas { HAPCI, VIDOR, KUKA }; var() int tomb1[5]; var() Felsorolas tomb2[5];
Dinamikus tömbök • Megadjuk, hogy milyen típusú elemekből áll a tömb: • var() array dinamikus; • Ez kezdetben 0 méretű, de ha az i. elemnek adunk értéket, akkor i+1 méretűre nő a tömb: • dinamikus[2] = 10; // 3 elemű lesz • Elemszám lekérdezése: dinamikus.length
Struktúrák struct Valami { var() int a; var() bool b; }; struct Masik { var() Valami c; var() int d; };
Vector var vector offset; function PostBeginPlay() { offset.z = 64; SetLocation(Location + offset); // vagy: SetLocation(Location + vect(0, 0, 64)); } A szereplő kezdő pozícióját eltoltuk a Z tengely mentén 64 egységgel. A vector adattagjai: x, y és z. A vektor hossza: VSize(offset)
Rotator var rotator rotate; function PostBeginPlay() { rotate = rot(0, 0, 4000); SetRotation(Rotation + rotate); } Rotator adattagjai: pitch, yaw, roll Az adattagok 0-tól 65536-ig terjednek (65536 = 360 fok)
Alapértelmezett értékek • Az osztályváltozók kezdeti értékeit a defaultproperties-ben adjuk meg: defaultproperties { a = true […] }
Lokális változók • Függvényen belül a var helyett a local kulcsszóval vezetjük be a lokális változókat. • A lokális változókat a függvény elején kell megadni! function PostBeginPlay() { local int aa = 42; `log("aa = "@aa); }
Vezérlési szerkezetek: if if (c == 0) { `log("Nulla"); } else if (c == 1) { `log("Egy"); } else { `log("Egyik sem"); }
Vezérlési szerkezetek: switch switch (c) { case 0: `log("Nulla"); break;
case 1: `log("Egy"); break; case 2:
`log("Ketto"); break; default:
`log("Egyik sem"); }
Vezérlési szerkezetek: ciklus for (aa = 0; aa < 5; aa++) { `log("aa = "@aa); } aa = 0; while (aa < 100) { `log("aa = "@aa); aa += aa + 1; } aa = 0; do { `log("aa = "@aa); aa += aa + 1; } until (aa >= 100);
Bennmaradási feltétel!
Kilépési feltétel!
Saját fegyver Class AwesomeGun extends UTWeap_Rocketlauncher_Content; defaultproperties { FireInterval(0) = 0.1 ShotCost(0) = 0 }