2014. május 13., kedd

Pályatervezés II. Tereprendezés (Terrain editing)


Kezdetnek kell egy Terrain amit a Game Object > Create Other > Terrain úton érhetünk el. Ez egy 2000 x 2000 méretű egyenes síkot helyez el a koordináta rendszer 0,0 pontjában. Adjunk hozzá a scene-hez egy általános világítótestet is. (Game Object > Create Other > Directional Light). Legyen egy Skyboxunk is (Edit>Renderer Settings > itt a Skybox materialt válasszuk ki vagy húzzuk be ide.)

Ha rákattintunk a Terrain-re (vagy kiválasztjuk a Hierarchy-ból), az Inspector ablakban megjelennek a Terrain tulajdonságai, úgy mint Transform - itt a pozíciót, forgatást, és nyújtást (Scale) lehet beállítani, és Terrain (Script). Ez utóbbival fogjuk kialakítani a terep formáját, és textúrázni is itt lehet.
Az egyes gombok (balról jobbra) a következőket tudják:
 - Raise / lower: az ecset alakját, méretét és átlátszóságát (azaz hogy milyen mértékben hasson a terrain-re) kiválasztva máris hegyeket, dombokat vagy csak kisebb talaj-egyenletlenségeket alakíthatunk ki. Shift-et lenyomva ugyanez visszafelé, azaz behorpasztjuk a talajt.
 - Paint Height: Shift+ balklikkel mintát vehetünk egy terepmagasságból, és utána festéssel ehhez igazíthatjuk a többi részt is. Hasznos platók, vagy hegyoldalban kanyargó vízszintes ösvények, folyómedrek kialakításánál.
 - Smooth Height: lesimítja a nagyon kiugró éleket, csúcsokat.
 - Paint Texture: textúrát festhetünk a domborzatra. Ehhez először is textúrákat kell betölteni, kattintsunk az Edit Texture > Add Textures gombra. A megjelenő ablakba behúzhatjuk a textúrát (pl. Grass1) és annak Normal mapját (ez utóbbi felelős az apró  kiemelkedések élethű megjelenítéséért), vagy a Select-re kattintva ki is választhatjuk a könyvtárból. Ekkor a program a teljes mappot ilyen színűre festi, ez lesz az alap beállítás. További textúrák hozzáadásával és festésével árnyalhatjuk a képet.

Ha megnézzük messziről a terraint, láthatjuk a textúra bár folytonos, mégis kockás lesz az ismétlődések  miatt. Ezt "kicsiben" amikor bennt vagyunk a játékban már nem vesszük észre a tereptárgyak, fű, stb miatt, de ha egy távoli hegyet nézünk akkor tenni kell ellene valamit. Ha kiválasztjuk a textúrát és az Edit-re kattintunk, van egy Size feliratú mező aminek értékét ha változtatjuk a textúra nagyobb vagy kisebb felbontású lesz és eltűnik a kockásság. Viszont ekkor ha közelről nézzük, elmosódottá válik. Én ezt úgy oldottam meg hogy ugyanabból a textúrából beraktam egy kis és egy nagy felbontásút, és a távoli hegyeket befestettem hogy ott ne legyen kockás (úgyis kívül esik a játéktéren).

Itt szeretném kiemelni a World Builder asset-et amit előszeretettel használok természetes hatású tájak kialakításakor. (Elérhető itt: Asset Store - World Builder ) Jó móka elszórakozni a különféle beállításokkal, a legalapvetőbb a hegyek gyakorisága (Mountain frequency), a rögösség (Roughness)  - azaz hogy mennyire durva kialakításúak a hegyek -  csúszkáinak módosítása. A kis beépülő tud textúrákat is hozzáadni, beálílthatjuk hogy magasság szerint (Height) vagy meredekség szerint (Angle) színezze. A görbéket lehet állítgatni, csak annyi baja van hogy a skála nem állandó, vagyis a textúra sorrendet nekünk kell megjegyezni (pl. füves: 0-1ig, sziklás 1-5ig stb). Ha két textúra tartománya összeér akkor ott keveredni fognak attól függően melyik az "erősebb" (Opacity és Strenght). Sok időm elment mire kiismertem, így végül csak a terepalakító funkcióját használtam fel, a textúrákat kézzel festettem fel.

Következő cikkben a fákról és a Unity Tree Creator-ról fogok írni. 

2014. május 8., csütörtök

MOBA SK Projekt - Előkészületek

Mint a bevezetőben említettem, nem fogok mindent lépésenként részletezni, ha esetleg káoszt érzel az itt leírtak kapcsán, nézz utána! Bár sokan úgy gondolják, hogy a félangol-félmagyar mondatok idegesítőek, itt bizony csak ilyeneket fogsz találni. Ennek nem szókincsbeli hiányosságom az oka, egyszerűen csak bizonyos szakszavakat érdemes megtanulni, hogy tudj keresni rá, ha netán valahol elakadsz.
Egy lehetőség: http://unity3d.com/learn/tutorials/modules

Terrain előkészítése:
Nem kell túl gondolni a dolgot. Egyenlőre bőven elegendő ha van egy terrain-ünk, egy-két directional light-unk és egy Main Cameránk a scenen. Később majd kell valamennyit alakítani rajta, de egyenlőre még textura sem szükséges hozzá.

Character prefab létrehozása:
Nem szeretem kockákkal (értsd mindenféle grafika nélkül, egy kockát tologatva) kezdeni a fejlesztést. Korábban kihagytam a karakter kinézetét és az animációt, aztán előfordult, hogy újra kellett gondolnom pár dolgot mikor be akartam rakni őket. Úgyhogy már az elején érdemes szerintem egy humanoid charactert lérehozni (vagy amilyet akarsz).

Én alapvetően Mecanim animáció rendszert használok, Root Motionnal, a karakterre pedig rigidbody-t és capsule collidert teszek. Vannak akik a Character controllert jobban szeretik. Ezen lehet vitatkozni, de egyrészt kényelmesebb az első megoldás, másrészt a unity csapata és közössége is erre felé hajlik inkább.
A mecanim rendszer nagy előnye hogy átirányítható (retargetable) animáció rendszert lehet vele létrehozni. Az átirányíthatóság azt jelenti, hogy egyik modellen lévő animációt könnyedén alkalmazhatod egy másik modellen.

Retargetable Character
A Sample Assets Beta csomagban találtam egy ötletes megoldást erre (nekem újdonság volt, bár lehet csak bamba voltam :D): egy Empty GameObject-ből készítünk prefabot. Erre rakunk egy Animator komponenst, ide helyezzük a Animator Controllerünket. Magát a tényleges karakter modelt ebbe az Empty-be fogjuk berakni gyermek objektumként. A megoldás szépsége, hogy a modelt akár futás közben is létrehozhatjuk, vagy váltogathatjuk. Ehhez persze kell, hogy amikor új model kerül a Character prefab-ba, megadjuk neki az aktuális avatárt amire az animátornak hatnia kell. Mivel egyenlőre nem akarjuk dinamikusan váltogatni, elég a scene indításakor megtenni:

void Start () 
{
   anim = GetComponent();
   foreach (Animator childAnimator in GetComponentsInChildren()) 
   {
      if (childAnimator != anim) 
      {
          anim.avatar = childAnimator.avatar;
          Destroy (childAnimator);
          break;
      }
   }
}
A fenti script végignézi az összes olyan gyermek objektumát a karakernek, amin van Animator komponens. Fontos észben tartani, hogy a GetComponentsInChildren 0. eleme maga a karakter objektumunk lesz (hiszen annak is van Animator komponense).
Amikor megtaláltuk, beállítjuk az Avatárt, majd töröljük a gyermekről az Animatort, hiszen innentől kezdve nincs szükségünk rá.

A következő lépés, hogy össze kell raknunk, egy nagyon egyszerű animator controllert. Én egészen konkrétan két teljes animációt raktam bele, mind a kettő a Sample Asset Beta-ból van. A flowchartom így néz ki:
Nagyon egyszerű animation flowchart
Egyetlen paramétert határoztam meg speed néven. Ami fontos lehet (főleg később), hogy a Transaction ablakban az Atomic ne legyen bepipálva! Ez annyit mutat, hogy az animáció megszakítható-e bármikor. Ha be van pipálva, akkor csak bizonyos pontokon szakítja meg.

Miután ez megvan, húzzuk be a character objektumunk megfelelő helyére. És készen is vagyunk az előkészületekkel.
Teszteléshez indítsuk el a scene-t, és ha a karakter lejátsza az idle animációt, akkor jól csináltuk az előkészületeket!


MOBA Starter Kit Project - Bevezető

Népszerű MOBA-k
MOBA: Multiplayer Online Battle Arena, 2002 környékén Warcraft III pályaszerkesztőjével készült az első ilyen játék. Eul nevű modder nevéhez fűződik. Később komoly figyelmet kapott a játék. A történetéről egyenlőre elég ennyi, ha valakit érdekel, utána olvashat a wikipédián: http://en.wikipedia.org/wiki/Multiplayer_online_battle_arena

Játékmenet: a legáltalánosabb változatában két 5 fős csapat küzd egymás ellen a képen látható felosztású pályán. A sárga színnel jelölt részek a un. "lane"-k, a köztük lévő zöld terület a "jungle". A kék pontok tornyokat jelölnek.
A játékosok egy-egy hőst (champion) irányítanak. A játék kezdetétől fogva nem-játékos karakterek (minionok) indulnak útra a csapat bázisából (naracssárga negyed körök), ezeket wave-knek nevezik.
A játék célja az ellenfél bázisának lerombolása. A hősök játék közben szinteket és aranyat szereznek, az utóbbiból felszerelést vásárolhatnak.

Az utóbbi pár évben elég sokat játszottam League of Legends-el, hogy elkezdjen érdekelni programozási szinten is. Különböző kihívások merülhetnek fel egy ilyen játék alapjainak létrehozásakor. Bár sikerének vagy sikertelenségének a titka inkább a játék-egyensúly, tanulási nehézség megtalálásában rejlik, és persze abban, hogy mennyire kreatív hősöket tudnak kitalálni hozzá, remek gyakorlási lehetőség programozás terén is úgy gondolom.

Ez a sorozat egyfajta tutorial jellegű is lesz, de inkább csak megoldás technika szintjén. Úgy gondolom, hogy aki már tud programozni unalmas tartja ha az alapoktól kezdem, aki meg nem tud az meg nem hiszem, hogy pont tőlem fog megtanulni. :) Inkább azokra a részekre térek ki, ami engem is érdekelne:

  • Camera : alapvetően nem túl összetett feladat, de elég sokat szoktam kutatni mindig megfelelő kameráért, ezért veszem előre.
  • Champions : a játékos által irányított hősök területét több részre bontom:
    • Statok: a Pioneer közben megismert módszert fogom alkalmazni, ami egy rugalmas tulajdonság rendszert biztosít majd. Ez fontos szempont, mert nem egy konkrét játékban gondolkozom, hanem egy kezdő csomagban.
    • Skillek: szintén a Pioneer tapasztalatokat fogom használni, a különböző célpont kijelölési megoldásoknál. Maguk a skillek típus skillek lesznek, ne lepődjön meg senki, ha nem váltom meg a világot egyediségükkel. :P
    • Items: ebbe a kategóriába sorolom az vásárolható tárgyakat. Érdekes lehet, hogy nagyon hasonlóan fognak működni, mint a buff típusú skillek. ;)
    • Model, animáció, hangok: színesítő elemek, a kronkrét projekt nem követelné meg, de szeretem ha nem csak jó, hanem szép is amit csinálok. :) Mindenesetre alacsony a priorítása.
  • Mobs: Nem tökéletes megfogalmazás, de a minionokat (csapathoz tartozó lények, amik a lane-en mozognak) és a monstereket (jungle-ben lévő lények) értem alattuk.
    • AI : egyértelmű. ez lesz a legfontosabb ebben a témakörben, és mivel eddig ezzel nem nagyon foglalkoztam, számomra a legizgalmasabb is a projektben. :)
  • Game : Alapvető játékirányítási funkciókat foglal magába. wave-k kiküldése, csapatok kezelése, ölési/halási statisztikák követése, nyerés.
  • Network : Bár egy rendes moba megkövetelné a dedikált szervert, de ebben a projektben ezzel mégsem fogok foglalkozni. Alapvetően client to client megoldást fogok alkalmazni, ahol a master client fogja elvégezni azt, ami a dedikált szerver feladata lenne. Ugyanakkor két különböző, megoldásilag mégis nagyon hasonló verziót fogok csinálni: egyet a unity alap hálózat kezelőjével, egyet pedig a Photon Cloud szolgáltatással.
  • GUI : erről sokat nem mondanék. Grafikus felhasználói felület. Ennyi. Viszont esélyes, hogy nyár környékén fogok ezzel érdemben foglalkozni, amikor kijön a Unity 5-ös verziója az új GUI rendszerrel (Yey!) 
  • Developer Panel: mint említettem a projekt alapvetően egy starter kit létrehozásáról szól. Ennek eredményeként szükség van olyan funkciókra is, amelyeket a unity editorjában lehet használni. Ez egyenlőre elég képlékeny, időközben fog még formálódni:
    • Championok adatbázis
    • Tárgy adatbázis
    • Minion/Monster/Turret beállítások
Nagyjából tehát ezeket tervezem átfogni a sorozatban. Szerintem nem hagytam ki semmit, ha mégis, akkor ér beírni a kommentek közé. :)


2014. május 6., kedd

Artcraft—The Spires of Arak készítése


Nem kifejezetten Unity, de elég erőteljesen játék készítés, hiszen nem más mint Chris Robinson a WoW (World of Warcraft) senior art director-a (bocs a félangol mondatért :P) betekintést enged a kulisszák mögé. A videó és a cikk is érdekes és hasznos információval szolgál.
Én kifejezetten szeretem nézni az alkotói munkát, mert sokszor ad új ötleteket. A videó elég jól bemutatja egy terület elkészítésének munkafolyamatát egy ilyen szintű játék esetében.

A teljes cikket itt találjátok: http://us.battle.net/wow/en/blog/13987918



2014. május 5., hétfő

Pályatervezés első lépések (Level design)

A Unity "pályaszerkesztő" funkciójának tanulmányozásához az Asset Store-ból letölthető ingyenes tereptárgyakkal és szerkesztést segítő plugin-eket használom. Amit most leírok, személyes tapasztalat, kísérletezgetés eredménye.

A pályák megtervezésekor az első amit figyelembe kell vennünk a pálya célja. Mit csinálnak itt a játékosok? Hol lépnek be, és hol hagyják el a területet? Milyen utat járnak be, mik a fókuszpontok?
A  fókuszpontok olyan helyszínek, ahol a játékosok sokat tartózkodnak, vagy a játékmenet, és a történet szempontjából fontos szerepet töltenek be. Ez lehet például városban egy piactér, egy dungeon őrzött bejárata stb.

Jelenleg olyan pályát tervezek a Pioneer Project-hez, amely 5v5-ös zászlóvivős játékra (Capture the flag, CTF) alkalmas. Tehát egy relatíve kis pályára lesz szükség, sok izgalmas terep lehetőséggel, ami a harcokat érdekessé teszi és kreativitásra, taktikázásra ösztönzi a játékosokat. A pálya játszható mérete körübelül 500 x 300 egység (1 Unity egységet mi 1 méternek állítottunk be), de a terepviszonyoktól függően változik az alakja, azaz nem teljesen téglalap alakú. A terep tényleges mérete 2000 x 2000, erre azért van szükség hogy ne lássanak rá a pálya szélére a játékosok, és szép horizontunk legyen.

Néhány óra terrain editing után... 

A pályán a következő fókuszpontokra van szükség:
 -  a két csapat bázisára a pálya két távolabbi végében
 - a köztes terület: egy patak völgye, amelyen három átkelőpont található, ezek lesznek a fókuszpontok.

Miután megegyeztünk a pálya céljában és fókuszpontjaiban, nekiláthattam a rajzolásnak. Készítettem egy térképet a játszható területről. Első körben elég a legfontosabbakat kiemelni: a két tábor és a harci zónák. A játékosok ezeken a helyeken fognak a leggyakrabban találkozni és összecsapni, tehát ezek kidolgozására fordítsunk több energiát. Készítettem rajzokat több nézőpontból, részletes alaprajzokat például a táborról és a főépületről. Én nagyon szeretek térképeket, alaprajzokat készíteni, így ez a fázis viszonylag könnyen ment.

A tervezési fázis következő lépése összegyűjteni, milyen textúrákra és modellekre lesz szükség. Én alapvetően természetes és mesterséges tereptárgyakra osztom fel ezeket.
  • Természetes: talaj textúrák, kövek, sziklatömbök, barlangok (erről külön cikk fog szólni, mert Unity elvileg nem támogatja a terrain "kilyukasztását", de mégis megoldható) fák, bokrok, és füvek-virágok. Ide tartoznak a víz és a különböző particle rendszerek is, például a vízesés, tűz és füst, porfelhők, és a csapadék.
  • Mesterséges: például utak textúrái, sátrak, faépítmények (tornyok, cölöpfalak, kihegyezett karók), kőépítmények (falak, épületek) barikádok, és a sokféle kiegészítő tárgy és objektum amik egy csatatéren fellelhetők, például elhajigált fegyverek, zászlók, hullák, stb. (Jelenleg a tereprendezésnél tartok, a mesterséges tárgyak modelljei  még nincsenek meg)
Ha megvan a "bevásárlólista" akkor két lehetőségünk van. Lemodellezhetünk mindent Blenderben vertexenként, feltextúrázhatjuk, és tölthetünk vele heteket, hónapokat, főleg, ha a modellezés nem az erősségünk és menet közben tanulunk. A könnyebb és gyorsabb, de kevésbé elegáns megoldás az Asset Store... ahol a kiváló minőségű fizetős modellek mellett elérhető jópár szerényebb, de ingyenes modell is. Mi jelenleg ez utóbbiakból dolgozunk, az Asset Ajánlóban ezek leírását is megtalálhatjátok.  

A következő részben a Unity néhány tereprendező lehetőségéről fogok írni. 

2014. május 3., szombat

Pioneer Project #1 - Skill rendszer

Végre vállalható állapotba került a Pioneer Project skill rendszere. A konkrét képességek még nincsenek kialakítva, de a rendszer már kezeli a fő típusokat. A számolási rész teljes egészében a szerver oldalon fut, a kliens a megjelenítésért felel, illetve egyenlőre a célpont kiválasztásért. Ez utóbbit majd nagy eséllyel át kell költöztetnem a szerverre, de egyenlőre nem akartam szerver oldali fizikát létrehozni, így a "hacker-barát" megoldást választottam.
Íme egy rövid kis videó arról, hogyan is néz ki. Sajnos nem sikerült két klienssel felvennem, mert valamitől haldoklik a gépem, a 10 fps-es videón meg nem sok látszódott volna. Így kénytelenek lesztek elhinni, hogy ezek működnek multiplayer módban is és még sebzik is a másik játékost. :)


A kliens oldalon ötféle célpont választás (targetelés) van lekezelve:
  • Self - a skill a használójára hat
  • Crosshair - a skill arra hat, akit a célkereszttel becéloztunk, ha a célpont nem érvényes, akkor a képesség self-nek minősül. (a videóban a fehér áldás-szerű effect ilyen)
  • Melee - Már a projekt elejétől ragaszkodtam ahhoz a megoldáshoz, miszerint a közelharci fegyver pengéjének (sebzőfelületének) el kelljen érnie a célpontot sérüléshez. Ehhez a unity Raycast-ját használom, mely a fegyver markolatától indul, és a hegyéig tart. Találat akkor jön létre amikor ebbe a vonalba bekerül egy ellenséges collider.
  • Projectile - Távolsági támadásokhoz (íjászat, tűzlabda a videóban) egy lövedék jön létre, aminek el kell találnia a célpontot.
  • AOE - területre hat. Itt aránylag könnyű dolgom volt, mert hasonlít a lövedékhez, csak nem mozog. Viszont amit meg kellett oldani az a terület kijelölése. Ehhez egy külső assetet használtam. Röviden egy projektort mozgat oda ahova az egér mutat. Ha eszembe jut honnan töltöttem le, berakom az asset ajánlóba.
Még egy típusra lesz majd szükségem: az Aurára. Ezt olyan skillek fogják használni, melyek létrejötte után változó mennyiségű célpontra vannak hatással. Egyik példa erre a tűzfal, ami létrejötte után azokra sebez bizonyos időnként, akik a hatótávolságán belül vannak. Másik példa, amiről végül el neveztem, a karakter körül lévő valamilyen méretű aura, mely különféle módon hathat a benne lévőkre. 

2014. május 1., csütörtök

Asset Ajánló: Elementals (Free)

Tegnap töltötték fel ezt a 53 particle-t tartalmazó asset csomagot. Nagyon megörültem neki, mert elég sok, számomra is hasznos dolgot találtam benne (tűzlabda, tűzfal, meteoreső...stb).
Örömmel fedeztem fel, hogy ezek egyszerű Shuriken Particle-kkel (Unity alap rendszerével) vannak megoldva, semmi extra scriptet nem tartalmaz.
Az 53 effekt felét tűz alapú hatások teszik ki, de vannak más elemekkel kapcsolatos is néhány (föld, levegő, villám, jég, sötétség, fény, víz).