3D-s játék készítése az Android Unity számára. Játék létrehozása Androidon. Mi az a játéktervező

Az Android operációs rendszert futtató eszközökre való játékok fejlesztése az iOS-hez hasonló megközelítést igényel. Másrészt az Android készülékek hardverére nem vonatkoznak egyértelmű szabványok, ami szükségessé teszi az iOS rendszerrel való munka során hiányzó problémák megoldását. A Unity Android és iOS verziói között is vannak különbségek.

Az Android fejlesztői környezet előkészítése

Mielőtt kipróbálná játékait az eszközön, fel kell készítenie a fejlesztői környezetet. Mindenekelőtt töltse le és telepítse a kívánt platform Android SDK-ját, és adja hozzá eszközét a rendszerhez (ez a folyamat Windows és Mac esetén eltérő). Erről részletesen le van írva az Android Developers webhely, valamint További információ a készülék gyártója biztosíthatja. Mivel ez egy meglehetősen bonyolult folyamat, elkészítettünk egy kis instrukciót, amely segít mindent előkészíteni, ami a fejlesztéshez szükséges. Ha további információra van szüksége, azt az Android fejlesztői portálról szerezheti be.

Hozzáférés az Android funkcióihoz

A Unity API-t biztosít az Android-bemenetek és beállítások eléréséhez. Az elérhető osztályok a Code for Android Assemblies oldalon találhatók.

C, C++ vagy Java kód összekapcsolása szkriptekkel

A Unity lehetővé teszi a C/C++ nyelven írt függvények közvetlen meghívását szkriptekből (a Java függvények indirekt módon is hívhatók). Ha meg szeretné tudni, hogyan érheti el a funkciókat a Unity natív kódjából, látogasson el az Android beépülő modul építő oldalára.

Elzáródás kivágása (láthatatlan geometria levágása)

A Unity támogatja az okklúziós selejtezést, ami nagyon hasznos mobilplatformokra való optimalizálás során. Több információ megtalálható az Occlusion selejtezés oldalon.

Az indítóképernyő testreszabása

A játék indításakor megjelenő indítóképernyő testreszabható – további információkért tekintse meg ezt az oldalt.

Hibaelhárítás és hibajelentés

Számos oka lehet annak, hogy az alkalmazás összeomlik vagy nem működik megfelelően. Útmutatónk az Android-specifikus problémák megoldásához segít a lehető legrövidebb időn belül kezelni a hibák okait. Ha a kézikönyv elolvasása után azt feltételezi, hogy a probléma a Unityben van, akkor hibajelentést kell küldenie. Az utasításokat ezen az oldalon találja.

Miben különbözik a Unity for Android az asztali verziótól

JavaScript erős gépeléssel

A teljesítmény javítása érdekében a Unity Android-verziójában a dinamikus gépelés a JavaScriptben mindig le van tiltva (mintha a #pragma strict automatikusan alkalmazva lenne minden szkriptre). Ezt fontos megjegyezni, ha régebbi platformokról portol projektet Androidra, és ha fordítási hibákat észlel, a problémát elsősorban a gépelés során kell keresni. Az ilyen hibákat általában könnyű kezelni, ha meg kell győződni arról, hogy az összes változó típusa kifejezetten meg van adva, vagy az inicializálás során kiadva.

Bár egység androidés támogatja a DXT/PVRTC/ATC textúrákat, a Unity RGB(A) formátumba tömöríti ki a textúrákat futás közben, ha ezeket a tömörítési módszereket az adott eszköz nem támogatja. Ez komolyan befolyásolhatja a GPU megjelenítési teljesítményét, ezért javasolt az ETC formátum használata. Ez az Android de facto szabványa, és minden modern eszköznek támogatnia kell. Másrészt az ETC nem támogatja az alfa csatornát, és néha a 16 bites RGBA textúrák a legjobb választás a minőség, a méret és a renderelési sebesség szempontjából, ahol alfa csatornára van szükség.

A Unity 3D nélkülözhetetlen eszköz lesz azok számára, akik professzionálisan közelítenek a kiváló minőségű anyagok létrehozásához. Az alkalmazás kész modelleket, szkripteket és textúrákat integrál, amelyek kiegészíthetők saját tartalommal - képekkel, hangokkal és videókkal.

A Unity 3D-ben készített késztermékek szinte minden népszerű platformmal kompatibilisek - kezdve a mobiltelefonokés a SMART TV-kkel befejezve.

A program jellemzői:

  • Unity tanuló motor;
  • rugalmas többfunkciós szerkesztő;
  • nagy fordítási sebesség;
  • könnyen megtanulható felület;
  • kompatibilitás számos platformmal.

Működés elve

A program használatához le kell tölteni a Unity Hub platformot, ezen keresztül pedig ki lehet próbálni az ingyenes Personal verzió szolgáltatásait. Akár évi 100 ezer dollár bevételszerzési mennyiséggel is elérhető.

Az ingyenes verzión kívül két további bővített verzióra is előfizethet:

Unity Plus (~25 $ havonta) - korlátozott hozzáférést biztosít a Customer Success Advisor szolgáltatáshoz, információkat gyűjt a felhasználói eszközök meghibásodásairól, figyeli a visszajelzéseket.

A Unity Pro (~125 $ havonta) a maximális előfizetési lehetőség. Támogatást nyújt a professzionális fejlesztőktől, lehetővé teszi, hogy elsőbbségi hozzáférést kapjon a program készítőitől származó támogatáshoz, továbbfejlesztett képességekkel rendelkezik a teljesítmény figyelésére és a statisztikák gyűjtésére.

Az összes építése játék akciók a program kellően jó minőségű fizikai magjára (PhysX) épül, amelytől a modellek viselkedése függ. A textúrák és objektumok importálási lehetőségének köszönhetően egyedivé teheti a terméket, vagy használhatja a fejlesztő által integrált eszközöket. Fontos megérteni, hogy minden, ebben a konstruktorban létrehozott objektum szkriptek és események meghatározott halmaza, amelyeket Ön irányíthat.

A Unity 3D professzionális használatához időre van szüksége, hogy megismerkedjen az alkalmazás felületével és funkcióival. Ehhez sok videót találhat az interneten, vagy látogasson el a sok nagyvárosban tartott speciális tanfolyamokra.

Meg kell jegyezni, hogy a 3D grafikával való munkavégzéshez modern számítógépre van szüksége hardveres videokártyával.

Előnyök:

  • szinte korlátlan funkcionalitás projektek létrehozásához;
  • böngésző alapú 3D grafika támogatása;
  • kompatibilis valamivel játék konzolokés modern TV-k;
  • számos vizualizációs eszköz;
  • van egy ingyenes verzió.

Mínuszok:

  • specifikus tudás szükséges a minőségi termék létrehozásához;
  • nincs lehetőség a program fizikai magjának nagyon finom hangolására;
  • az interfésznek nincs orosz nyelvű fordítása.

A Unity 3D-t nem csak azért töltheti le, hogy felkészítse a versenytársát a népszerű Juggernaut online játékra (amely szintén áttekintésünk hősének eszközeivel készült), hanem elegáns 3D-s prezentációk készítéséhez is. Hadd tartson még egy kicsit, de a wow hatás a közönség számára garantált.

A platform képességeinek megismeréséhez egyszerűen töltse le a Unity 3D ingyenes verzióját. Ha hozzáférésre van szüksége a forráskódhoz, nézze meg a fizetős verziókat.

Analógok:

  • játék szerkesztő - ingyenes alkalmazás játékok létrehozásához;
  • A Construct 2 egy népszerű játékkonstruktor, egyszerű felülettel.
  • A Construct 2 egy hatékony program 2D ​​projektek létrehozására.

Sziasztok! Miután megtanultam, hogyan kell játékokat készíteni ezen a motoron, ugyanezt szeretném megtanítani neked. Először is szükségünk van magára a Unity3d-re, bármilyen 3D-s modellszerkesztőre és egyenes karokra, amelyek a vállból nőnek ki.

1. A program elsajátítása

Kezdetnek a Monodevelop telepítését javaslom! Értsük meg, mi az az egység. A Unity egy többplatformos játékfejlesztő környezet. Egyszerűsége és érthetősége miatt minden harmadik csinált már rajta játékot legalább egyszer.

Tekintsük a fenti képernyőképet:

  • A színpad a kreatív homokozód.
  • Project – itt az összes animáció és modell, hangok és textúrák.
  • Ha modelleket szeretne telepíteni a felső eszköztárra, válassza az Eszközök - Új eszköz importálása lehetőséget. Eszközök-importálási csomag-egyéni csomag is lehetséges. A második esetben a csomagnak .unity kiterjesztésűnek kell lennie.
  • Hierarchia – minden objektum a jelenetben. Ott létrehozza az objektum szüleit. Csak helyezzen át egy objektumot egy másikra a hierarchia menüben, és csatolva lesz. Az eredmény egyfajta mappa lesz.
  • Eszköztár – eszközök listája. Itt engedélyezheti a 2D, 3D módot.
  • Inspector – egy objektum funkciója, ahol animációkat, szkripteket és egyebeket adhat hozzá. Ott lehet használni az eszközöket: mozgatni a kamerát, mozgatni a tárgyat, nyújtani, elforgatni a tárgyat.


Most látja benne az objektum menüt, ahol animációt, szkripteket és egyebeket adhat hozzá.

Szerintem ezzel a menüvel nem lesz gond.
Kattintson bármelyik objektum létrehozásához.

Általánosságban elmondható, hogy áttanulmányoztuk a programot, hamarosan saját játékokat is írhatunk.

2. Hozzon létre egy egyszerű játékot

Először is hozzunk létre egy Terep létrehozása területet. Adjon hozzá füvet és fákat. A jobb oldalon a talajra kattintva megjelenik egy ablak, ahol fákat, füvet kell kiválasztani.


Hozzon létre hegyeket és dudorokat is. Ezután töltse be a Characher vezérlőcsomagot a projektbe. Ezután az ablakban a Standard eszközök-karakterek kontroller projekttel keresünk, és kiválasztjuk az első személyű nézetet (kapszula) vagy harmadik személyű nézetet (szerelő).
Ha az első személy, akkor csak tedd a földre. Ha a harmadiktól, akkor le kell töltenie az animációt. Azt is javaslom, hogy a jelenet megvilágítását állítsa a Create-Directional Light beállításra.


Zene hozzáadásához húzza a kívánt elemre.
A játék készen van, de hogyan kell lefordítani?

Ehhez lépjen a File-Build beállítások-lejátszó beállításaihoz (címke és név). Válassz egy platformot, és kész. Ehhez telepítenie kell az Android SDK-t. De ott meg kell adni a mappát az SDK-val, és nem csak az SDK-ra van szüksége, hanem a kívánt szintű API-ra (például az Android 4.2-ben API 17 van). Például ahhoz, hogy a játék Android 4.0+ rendszeren futhasson, telepítenie kell ezeket az API-kat.

A következő cikkben elmondom, hogyan állíthat be vezérlőket Android vagy iOS rendszerhez, és megtanulhatja, hogyan írhat saját maga szkripteket.

Fejlődés mobil alkalmazások a számítástechnikai ipar egyik legjövedelmezőbb foglalkozása. Egy Androidos játék létrehozása több száz vagy több ezer dollárba kerül, a profit pedig akár egymillió dollárt is elérhet. Ebben a tekintetben sokan érdeklődnek a telefon alkalmazások fejlesztése iránt. Ebből a cikkből megtudhatja, hogyan hozhat létre egy Android-játékot a semmiből a számítógép segítségével, melyik motort és tervezőt jobb választani.

egyik sem sikeres játék nélküle nem lehet gyönyörű grafika Ezért a design megalkotása a fejlesztés egyik legfontosabb szakasza. A tervezés az Android operációs rendszeren „tervdokumentum” vagy tervdokumentum segítségével valósul meg. El kell kezdenie egy játék létrehozását annak részletes tanulmányozásával. A fájl tartalmazza:

  1. Objektummodellek;
  2. Funkcionális specifikációk;
  3. Játéktartalom;
  4. Felület.

Vizsgáljuk meg részletesebben az egyes pontokat.

Objektummodellek

Ez az egyes elemek funkcióira vonatkozó információ. Az objektummodellek felelősek a tárgyak vásárlásának és eladásának képességéért, valamint a karakterek játékjellemzőinek javításáért.

Funkcionális specifikációk

Leírja a játékmenetet, az egyes karakterek főbb jellemzőit. Itt található a játékelemek jellemzőinek leírása is - fegyverek, elsősegély-készletek, páncélok és mások. Lényegében a funkcionális specifikációk azok a szabályok, amelyek szerint a játék folyamata zajlik. Minél jobban ki van dolgozva ez a rész, annál könnyebb lesz jó minőségű Android-játékot létrehozni.

Játéktartalom

Ez a játék szöveges kitöltése. Leírja a szereplők párbeszédét és azt, hogy milyen fegyverekkel lehet sebzést okozni, mennyi életerőt vesz igénybe egy találat, milyen tulajdonságok nőnek a különféle felszerelések használatakor. Ez is tartalmaz Részletes leírás Minden elem.

Felület

A felület az, ahogyan a felhasználó interakcióba lép a játékkal. Tartalmaz gombokat, amelyekkel vezérelheti a karaktert, és menürészeket: például játék, pontszám, beállítások, legjobb játékosok, súgó. Ha nincs tapasztalata Android-alkalmazások létrehozásában, a saját létrehozása előtt töltse le a Play Marketről, és elemezze népszerű játékokés a legjobb megoldásokat vigye át a projektjébe.

Játék motor

Minden játék lényege a motor. Ez egy olyan szoftver, amely lehetővé teszi annak fejlesztését és futtatását. Programok egész sorát tartalmazza, beleértve a renderelő motort, a fizikai motort, a hangot, az animációt és még sok mást. A programok írásának megkönnyítése érdekében a külső fejlesztők saját játékmotorokat készítenek kifejezetten Android-alkalmazásokhoz.

Mindegyik más-más funkciót kínál: egyesek 3D-re, mások 2D-re készültek, több platform is támogatható. Rengeteg ilyen motor létezik, de ha kezdő vagy, akkor jobb, ha a legnépszerűbbet választja, mivel ott minden szükséges funkció megtalálható.

UDK

Nyomaték 2d/3d

Mi az a játéktervező?

A Constructor egy játékmotort és egy integrált fejlesztői környezetet ötvöző program. A konstruktor a fejlesztési folyamatot elérhetővé teszi olyan emberek számára, akik nem rendelkeznek programozási ismeretekkel. Egyes tervezők lehetővé teszik bizonyos műfajú játékok létrehozását, mások maximális funkcionalitással rendelkeznek, de sokkal több pénzbe kerülnek. Egy kezdő mobilalkalmazás-készítő számára a tervező kiválasztása az egyik legfontosabb pillanat, mert a jövőbeli alkalmazás sorsa a képességeitől függ.

A konstruktor segítségével különféle műfajú játékokat hozhat létre Windows, Android és iOS rendszerre. Kész helyszínek, tárgyak, karakterek és hangdizájnok széles választékát kínálja, így az első Android-játék elkészítése nem fog sok időt igénybe venni. A JS és C++ programozási nyelveket ismerő felhasználók használhatják a beágyazott GML-t. Az egyetlen hátránya, hogy a program nincs lefordítva oroszra.

Következtetés

Androidos játék létrehozása nem egyszerű, de nagyon jövedelmező vállalkozás. Ha úgy dönt, hogy játékot fejleszt, és pénzt keres vele, először dolgozza ki az ötletet. Ezután írjon egy „tervdokumentumot”, és válassza ki a játékmotort, amely maximalizálja a benne rejlő lehetőségeket. Ezt követően közvetlenül folytathatja az alkalmazás létrehozását a konstruktorban.

Videó

Ha többet szeretne megtudni az Android-játékok létrehozásának folyamatáról, tekintse meg az ehhez a tevékenységhez szentelt videósorozatot.

Hogyan lehet gyorsan és viszonylag egyszerűen létrehozni egy egyszerű játékot vagy alkalmazást Androidra? Erről az alábbi cikkben olvashat, amely a Unity3D motorral való együttműködéssel foglalkozik.

Játszol számítógépes játékokat? Ha igen, akkor az biztos, hogy a következő játék kasszasikerének átadása közben néha olyan gondolatok támadtak, mint: "De itt rosszul tettem volna!". Szeretnél magad is fejlesztő lenni? Akkor ajánlok egy apró, de nagyon szórakoztató "kalandot" ;)

Mi az a motor és miért van rá szükség?

Korábban, az első számítógépek idejében, a játékokat és programokat úgynevezett „hardcore” módszerrel hozták létre. Vagyis a teljes értékű fejlesztéshez elég tapasztalt programozónak kellett lennie, aki alaposan ismeri a programozási nyelvét, és szinte az egész játékot (a pixelgrafikát és a speciális effektusokat is!) egy egyszerű Jegyzettömbbe tudja írni. Kevés ilyen ember volt, és nagyon megbecsülték (és még mindig értékelik) ...

Mára a programozás témakörébe való belépési küszöb jelentősen csökkent. Ezt pedig nemcsak a szakirodalom és mindenféle oktatóanyag elérhetősége segíti elő, hanem az egyre egyszerűsödő fejlesztési folyamat is. Manapság már ritkán találkozni igazi "hardcore" emberrel, hiszen megjelentek a meglehetősen kényelmes fejlesztői környezetek, amelyeket "motoroknak" neveznek.

A motor lényege, hogy lehetővé teszi az összes szükséges játékobjektum egyszerűsített vizuális módban történő importálását, virtuális színpadon való elrendezését és az összes paraméter konfigurálását. Vagyis a programozó feladata csak a játék logikájának helyes megírása!

A munka kényelméért azonban a projekt méretének enyhe (néha akár többszöröse!) növelésével kell fizetnie a régi "hardcore" módon megírt megfelelőjéhez képest. Ez az oka annak, hogy egyes fejlesztők nem szeretik a motorokat, vagy megpróbálnak saját magukat írni, amelyekben csak a szükséges alkatrészeket használják ...

De te és én messze vagyunk az igazi programozóktól :) Ezért készítsünk egy egyszerű játékot Androidra a népszerű és erős Unity3D motor alapján.

Kezdő lépések egy projekttel a Unity3D-ben

Tehát miért választottuk a Unity3D használatát:

  • teljes értékű 2D és 3D játékok létrehozásának képessége;
  • a kész játék összeállításának képessége bármilyen eszközre;
  • a motor viszonylag könnyű vezérlése;
  • a funkcionalitás jó bővíthetősége bővítmények csatlakoztatásával;
  • a játék végső összeállításának viszonylag kis mérete (más motorokhoz képest).

A Unity3D fő ütőkártyája természetesen a sokoldalúság és a multiplatform. Befejezett játék(talán egy kis módosítással) Portolhatod PC-re (Windows, Linux vagy MacOS), Androidra, PlayStationre vagy XBoxra! Ehhez már csak magát a motort kell letöltenünk, ami egyébként egy gigabájtnál is többet "súlyoz" és a szükséges SDK-kat (ha mobil platformra vagy konzolra tervezik a fejlesztést). Ha Windows-ra szeretne játékot készíteni, akkor nem kell letöltenie semmit, de mivel Androidra készülünk, le kell töltenünk az Android SDK-t (Software Development Kit) is. Azt tanácsolom, hogy töltse le az SDK-t ZIP-archívumban, hogy kényelmesebben dolgozhasson vele.

Ha mindent letöltött, kicsomagolhatja bármelyik Önnek megfelelő Android SDK mappába, majd folytathatja magának a Unity3D-nek a telepítését. A rendszer ugyanúgy telepítve van, mint bármely normál Windows-program, így a telepítéssel nem lehet probléma. A telepítés után a motor elindul, és először létre kell hoznunk egy új projektet:

Ehhez be kell zárnunk az összes üdvözlő és bevezető ablakot, majd a "Fájl" menüből válasszuk az "Új projekt" lehetőséget. A megnyíló ablakban (lásd a fenti képernyőképet) meg kell adnunk a projekt mentési mappáját (a neve megegyezik a projekt nevével), importálni néhány szabványos függvénykészletet (nincs szükségünk rájuk) és adja meg az üzemmódot. Válassza ki a 2D módot, és kattintson a "Létrehozás" gombra. Ezzel befejeződött a munka előkészítő része :)

Motor interfész és projekthierarchia

A projekt létrehozása után betöltődik a Unity3D munkaterületre:

Ez a munkaterület maga moduláris felépítésű, és több egymásba ágyazott ablakból áll, amelyek tetszés szerint mozgathatók. Én így állítottam be (balról jobbra és fentről lefelé):

  1. Hierarchia ablak – megjeleníti az aktív és inaktív objektumok hierarchikus helyzetét a helyszínen. Alapértelmezés szerint az egyetlen objektum közvetlenül a listában a Fő kamera.
  2. Jelenet ablak – megjeleníti a játék teljes jelenetét és a rajta lévő objektumokat (beleértve a kamerákat, hangokat, textúrákat stb.).
  3. Ellenőrző ablak - megjeleníti a hierarchiában vagy a színpadon kiválasztott objektum összes tulajdonságát, és lehetővé teszi azok szerkesztését, kiegészítését vagy törlését.
  4. Játékablak – megjeleníti a kamera számára látható játékvilágot, és lehetővé teszi a virtuális játék tesztablak méretének pixelben történő kiválasztását. Ezenkívül lehetővé teszi a játékablak teljes méretben történő bővítésének aktiválását (Maximalizálás a játékban), és engedélyezi / letiltja a különféle információk megjelenítését a fejlesztő számára.
  5. Projekt és konzol ablakok. A Projekt ablakban navigálhat a projekt erőforrásai között: feltöltött képek, hangok, modellek stb. Ezen az ablakon (helyi menü) keresztül is létrehozhat új, különböző típusú és szkriptű üres játékobjektumokat. A Konzol ablak hibaüzenetek (piros), figyelmeztetések (sárga) és különféle, Ön által kért hibakeresési információk (szürke) megjelenítésére szolgál.
  6. Az Eszközcímke ablak az ellenőrző ablak alsó része, amely a Projekt ablakban kiválasztott objektum vagy fájl előnézetét jeleníti meg.

A fentieken kívül ügyeljen a felső középső három gombra. Lehetővé teszik a projekt elindítását, szüneteltetését (néha hasznos lehet például hibakereséskor, hogy megnézze, mi történik a hierarchiában), és ennek megfelelően kikapcsolhatja.

Létrehozunk egy hangszer szimulátort: ​​az indiai népi dobokat "tabla" néven, ezért a kezdéshez két üres mappát hozunk létre a projektben, amelyben a hangok és a képek lesznek tárolva. Új mappát úgy hozhat létre, hogy meghívja a helyi menüt a projektnavigátor ablakában (Project), és a "Létrehozás" listában kiválasztja a "Mappa" elemet.

Itt érdemes néhány szót ejteni arról, hogyan nevezzék el ezeket a mappákat. Egy egyszerű játéknál, mint amilyen a mi szimulátorunk is, elvileg tetszés szerint "nevezhetők" a mappák, azonban van legalább két olyan név, amit jobb nem használni, mivel azokat a motor lefoglalja. Ezek a nevek Erőforrások és Beépülő modulok. Nagy projekteknél azonnal létrejön az Erőforrások mappa, és az összes játék "tartalék" (képek, hangok, modellek, textúrák és előregyártott elemek) már benne van tárolva (almappákba rendezve). A Pluginsben, ahogy a neve is sugallja, minden további, harmadik féltől származó funkciókészlet (az úgynevezett "eszközök" (eszközök)) tárolva van, amelyek közül jó néhány található az Asset Store-ban - a Unity3D bővítményeinek tárolójában.

Fájlok importálása és játékobjektumok létrehozása

Új létrehozása előtt játék projekt kívánatos előre elkészíteni a működéséhez szükséges összes fájlt. Esetünkben ezek a fájlok képek és hangok. A legegyszerűbben úgy importálhatja őket egy projektbe, hogy egyszerűen áthúzza őket a kívánt mappába. Kezdjük a képekkel...

Miután a képek megjelennek a Képek mappában, kicsit módosítani kell őket:

A helyzet az, hogy a Unity3D alapértelmezés szerint minőségromlással tömöríti a projekthez hozzáadott összes képet. Ha nincs szükségünk ekkora veszteségre (különösen igaz ez a HD grafikával rendelkező játékokra), akkor minden képet ki kell jelölnünk, és a "Default" fülön a "Format" paraméter értékét "Compressed"-ről "Truecolor"-ra változtatjuk. Felügyelő ablak. Lehetséges, hogy módosítania kell a „Maximális méret” paramétert is, ha az kisebb, mint a tényleges képszélesség (alapértelmezett 1024 pixel). Az összes módosítás után ne felejtse el kattintani az "Alkalmaz" gombra az alkalmazáshoz. Ha szükséges, hasonló műveleteket hajtunk végre az összes többi képnél.

Most pedig készítsünk játékobjektumokat a képeinkből. Ehhez egyszerűen húzza a kívánt képet a Hierarchia ablakba. A kép vagy a 3D-s modell automatikusan játékobjektummá alakul, és a kiindulási koordinátaponton jelenik meg a kamera előtt.

Mindenekelőtt egy háttérképet adtunk hozzá, amelyet teljes képernyőn kell megjeleníteni. Ellenőrizheti, hogy ez így van-e, ha kiválaszt egy kamerát a hierarchia ablakban, és megnézi, hogyan jelenik meg a kerete. A fenti képernyőképen látható, hogy a hátterünk egy része a kamera nézetén kívül marad, ezért ennek a nézetnek a méretét módosítanunk kell a keretet közvetlenül a színpadra húzva, vagy az Inspector ablakban a "Méret" paraméter szerkesztésével. Esetünkben az alapértelmezett (5) értéket 5,4-re kellett módosítanunk.

Ennyi, a kamerához már nem nyúlunk, hanem a többi képet adjuk hozzá, igazítjuk. Hozzáadáskor azt látjuk, hogy némelyik túl nagy a mi játékunkhoz. Fizikailag a grafikus szerkesztőben vagy a motor segítségével csökkentheti őket. Próbáljuk meg az utolsó utat. Ehhez válassza ki a képet a Hierarchia ablakban, és az Inspector ablakban módosítsa az X és Y koordináták "Scale" értékét 1-ről 0,5-re (azaz felére csökkentse). Ugyanitt, az átfedések elkerülése érdekében, kívánatos, hogy minden játékobjektumhoz (a háttér kivételével) a rétegek nullától eltérő sorrendjét rendeljék (Rétegrend):

A játéktárgyak képekből történő előkészítésének utolsó lépése az ütközők „akasztása” lesz rájuk. A Unity3D-ben az ütközőket objektumok közötti interakciódetektorként használják. Azaz valójában egy virtuális shell kerül a képünkre, ami érintéseket tud regisztrálni rajta.

Ütköző hozzáadásához egy objektumhoz jelölje ki azt a Hierarchia ablakban, majd kattintson az "Összetevő hozzáadása" gombra az Ellenőrző ablakban. A megjelenő komponenslistában a Physics 2D-t keressük (a hétköznapi 3D fizika a mi módunkban nem fog működni), és az összes lehetőség közül a "Circle Collider 2D" a legmegfelelőbb számunkra. Őt választjuk. Az objektum körül zöld körvonal jelenik meg, amely az ütköző határait jeleníti meg. Csak be kell jelölni az "Is Trigger" jelölőnégyzetet, hogy ütköztetőnk csak a kattintásokat regisztrálja, és többé ne lépjen kapcsolatba a környező játéktérrel:

Hasonló műveletek ismétlődnek az összes többi objektumnál. Csak a hátterünk különbözik a többi objektumtól. Ehhez egy Box Collider 2D-t alkalmazunk, és a Z pozíciót nullánál nagyobbra állítjuk, hogy az ütközőt és magát a hátteret a háttérbe toljuk (erre később lesz szükségünk).

Munka hanggal

A Unity 3D hangjával első pillantásra minden kissé zavaros. De próbáljuk meg sorban kitalálni :)

Először is az összes hangot át kell húznunk a Hangok mappába, és kicsit módosítanunk kell őket:

Ha az összes hang hangereje kezdetben be van állítva, akkor mindössze annyit kell tennie, hogy kikapcsolja a 3D hangfeldolgozást. A 3D-s játékokban erre a feldolgozásra azért van szükség, hogy szimulálják a hangforrás közeledését, amikor a kamera közeledik hozzá. De 2D-ben erre nincs szükségünk, ezért sorra választunk ki minden hangot, és töröljük belőle a "3D Sound" jelölést.

Most elkezdhetjük a hangok hozzáadását a játékobjektumokhoz. Ehhez sorra kell kiválasztanunk az egyes gombokat, és hozzá kell adnunk egy új "Audio Source" komponenst az "Audio" részből. Az összetevő hozzáadása után válassza ki a megfelelő "Audio Clip" gombot, és törölje a jelölést az alapértelmezés szerint aktív "Play On Awake" jelölőnégyzetből (lejátszás, amikor megjelenik):

Ha minden hang a megfelelő gombokhoz van kötve, itt az ideje a szórakoztató résznek - a forgatókönyvírásnak...

Első forgatókönyv

Mielőtt elkezdené az első szkriptünk elemzését, érdemes néhány szót ejteni magáról a Unity 3D szkriptrendszeréről.

A Unity lehetővé teszi, hogy egyszerre három nyelven írjon kódot: JavaScript (pontosabban a UnityScript kissé módosított változata), C # és Boo. Számos könyvben és útmutatóban találkozhatunk azzal a véleménnyel, hogy a kezdők számára a Unity programban való szkriptelést könnyebb elsajátítani példaként JavaScript használatával. Ez a nyelv azonban nem olyan kényelmes, mint a többi, és a jövőben nagy valószínűséggel újra kell tanulnia. Ezért jobb azonnal a C # megtanulásával kezdeni (a Boo is jó, de kevés a tananyag rajta).

Most arról, hogy hova kell írni a kódot. A Unity 3D alapértelmezett kódszerkesztője a MonoDevelop IDE. Ennek a fejlesztői környezetnek az az előnye, hogy tippeket tartalmaz a szabványos metódusok, osztályok és függvények gyors beviteléhez, valamint szintaktikai ellenőrző rendszert is tartalmaz. Számomra azonban a terjedelmesség és a nagy erőforrás-intenzitás volt a hátrányom. Szerencsére a Unity beállításaiban bármit be lehet állítani szövegszerkesztőnek, így "akasztottam" magamnak a könnyű és funkcionális Notepad ++-t (majdnem minden példa látható lesz benne).

És az utolsó. Természetesen a motor összes bonyolultságának elsajátításában referenciaanyagok nélkül nem megy messzire, ezért itt található néhány ésszerű internetes forrás lista a Unity 3D témájában:

  • http://docs.unity3d.com/ru/current/Manual/UnityManualRestructured.html - hivatalos kézikönyv a motorhoz részleges orosz nyelvű fordítással (a közelmúltban jelent meg, és néha instabil);
  • http://docs.unity3d.com/ru/current/ScriptReference/index.html - hivatalos angol nyelvű szkriptelési kézikönyv;
  • http://unity3d.ru/distribution/index.php - orosz fórum Unity 3D fejlesztők számára;
  • http://habrahabr.ru/post/141362/ - egy leckesorozat a Habrahabr háromdimenziós játékok létrehozásáról;
  • http://msdn.microsoft.com/ru-ru/library/618ayhy6.aspx – a Microsoft hivatalos C# hivatkozása oroszul.

Nos, hogy ne húzza sokáig, azt javaslom, hogy azonnal készítse el az első forgatókönyvet. Szkriptek alatt, ha sok van belőlük, érdemes külön mappát kijelölni, de a játékunk egyszerű lesz, így közvetlenül a projekt gyökérmappájában tudunk szkriptet készíteni. Ehhez hívja meg a helyi menüt a Projekt ablakban, válassza ki a Létrehozás listát, és kattintson a "C # Script" gombra. Adjunk nevet az új szkriptünknek, például Hangok, és nyissa meg dupla kattintással. A szokásos Frissítés és Indítás metódusok eltávolítása, majd a szükségesek regisztrálása után a következő szkriptet kapjuk:

Ha nem konfigurálta újra a szerkesztőt, akkor a szkriptünk megnyílik a MonoDevelopban. Nézzük a szerkezetét...

Valójában minden C# szkript három fő részből áll:

  1. A legfelül azok a könyvtárak vannak felsorolva, amelyeket a szkript működéséhez csatlakoztatni kell (például a „Unity.Engine használatával” magát a motort kapcsolja össze, a „System.Collections használatával” pedig egy számot tartalmazó könyvtárat beépített osztályok száma, hogy a szkript különböző rendszereken működjön).
  2. Osztály és változó deklaráció. A C#-ban nincs fogalma a szkriptnek, mint olyannak. Ehelyett az "osztály" fogalmát használják, amely számos módszert és függvényt tartalmaz. Bár valójában a Unity 3D kontextusában ez majdnem ugyanaz :) A legfontosabb dolog, amit meg kell jegyeznünk, hogy az osztálynévnek meg kell egyeznie azzal a névvel, amelyet a szkriptnek adtunk. A változók sajátossága a C#-ban, hogy (kivéve az ideigleneseket, amelyeket magában a szkriptben deklarálunk) be kell gépelni. Ez a gyakorlatban azt jelenti, hogy a változóhoz meg kell adni a hozzáférési szintet (privát vagy publikus) és típust (int, float, bool vagy ahogy a szkriptben is megvan AudioClip), ugyanakkor megadhatja a változót vagy azonnal megadhat egy értéket.
  3. Módszerek és függvények halmaza. A metódus a C#-ban szinte minden olyan függvény, amely bizonyos műveleteket hajt végre. Elvileg a Unity 3D szakirodalmában függvényeknek hívják, de ha a C #-ről, mint külön programozási nyelvről beszélünk, akkor ezek végül is módszerek :). A Unity tiszta függvényei például szabványos hangkimeneti funkciók, grafikus felület elemek rajzolása stb., amelyeket a metódusokon belül használnak.

A szkript szerkezetének ismeretében könnyen megérthető a jelentése, ami a következőkben csapódik le... A Hangok osztályban (script) Hangok osztályban 9 AudioClip típusú változót deklarálunk azokkal a nevekkel, amelyekre szükségünk van a kényelem érdekében. megkülönböztetve őket. Feltétlenül nyilvánossá tesszük őket (a privátok nem jelennek meg a szerkesztőben, és hangokat kell rájuk "akasztanunk" a szerkesztőn keresztül). Ezután a szkript törzsében a szabványos "void OnMouseDown ()" metódust használjuk. Korábban csak az egérkattintás feldolgozásáért volt felelős, de az új verziókban az érintőképernyő érintéseként is értelmezik. Ebben írjuk azokat a feltételeket, amelyek alapján ellenőrizzük a lenyomott ütköztetők nevét, és ha valamelyik megnyomását észleljük, akkor a megfelelő hangot adjuk ki (a szabványos audio.PlayOneShot(); függvényt használjuk).

A kód írásakor ügyeljen arra, hogy minden nyitó és záró zárójelet tartalmazzon, különben folyamatosan hibajelentéseket fog kapni a Console-ban, és egyáltalán nem tudja futtatni a projektjét! Ügyeljen a nagybetűk használatára is a metódusok és függvények nevében. Gyakran ezek okozzák a hibákat is. És természetesen figyeljen minden jelre (pont, kettőspont és zárójel), röviden a nyelv szintaxisára. Eleinte nehéz lesz, de idővel a nulláról kezdesz írni, hibák nélkül!

Amikor a szkript készen áll, jelölje ki, és az Inspector ablakban rendeljen minden változóhoz más hangot. Most már csak a forgatókönyvünket kell alkalmaznunk a jelenet objektumaira. Ennek legegyszerűbb módja, ha a szkriptet közvetlenül a kívánt játékobjektumra húzza a Hierarchia listában:

Ha a szkriptet megfelelően húzta, akkor meg kell jelennie az Inspector ablakban azon objektum mellett, amelyre húztuk. Ennek megfelelően húzzuk a szkriptet az összes objektumra, amelynek meg kell szólalnia a játékban, és megpróbálhatjuk futtatni. Ha rákattint játékgombjainkra, most végre megszólal a megadott hang!

Bevezetés a GUI-ba

Nálunk elvileg már működik a Játék, de valahogy túl "kopasz". Valami hiányzik belőle... Vagy legalább egy felirat a névvel, ami előttünk van! Más szóval, valamiféle közérthető felhasználói felületet kell megvalósítania.

Valójában a GUI az angol rövidítése. "Grafikus felhasználói felület", azaz grafikus felhasználói felület. Hagyományosan olyan összetevőket tartalmaz, mint:

  • gombok;
  • ablak;
  • szöveges területek;
  • jelölőnégyzetek és/vagy rádiógombok;
  • csúszkák (görgetősávok) stb.

A Unity 3D-ben Mindez (és még ennél is több) teljes mértékben jelen van. A lényeg, hogy megtanuld használni! Nézzük meg, hogyan tud a Unity grafikus felhasználói felülete egyszerű címsort készíteni.

Ehhez hozzon létre egy új Interface nevű szkriptet, és módosítsa az alábbiak szerint:

Gondosan fontolja meg a képernyőképen látható szkriptet. Itt csak egy GUIStyle típusú nyilvános változót írunk, ami új számunkra. Ezzel a típussal vizuálisan módosíthatja azon elemek megjelenését, amelyekhez ez a stílus hozzá van rendelve. A stílusok akkor hasznosak, ha sok azonos típusú interfész elem (például gombok) van, de ezeknek eltérő megjelenésűnek kell lenniük.

Ezután létrehozunk egy gombot ("GUI.Button"), amelynek szintaxisa a következő: feltétel - 4 koordináta (vízszintes behúzás a bal széltől, függőleges behúzás a felső éltől, szélesség, magasság) - látható szöveg idézőjelben és tovább , opcionálisan stílusjelzés. A szükséges funkciók a gombfeltételek közé vannak írva. Esetünkben regisztráltuk az átállást a fejlesztői oldalra ("Application.OpenURL(");").

A GUI-szkriptek bármilyen játékobjektumról működhetnek, de általában azt tanácsolják, hogy „akasztják” őket a kamerára, amit úgy teszünk meg, hogy a szkriptet ráhúzzuk a fő kamera objektumra. Most, ha a Hierarchia ablakban kiválasztjuk, akkor az Inspector ablakban láthatjuk majd stílusunk publikus változóját, amelyet kibontva teljes hozzáférést kapunk ennek a stílusnak a beállításaihoz!

Bármilyen helyzetben megadhatjuk a háttér szövegszínét és textúráját (a gombhoz be kell jegyezni a három opcióját (Normál - normál nézet, Lebeg - lebegtetéskor és Aktív - kattintáskor), be kell állítani a kitöltést és a betűtípust. Alapértelmezés szerint a Unity 3D-ben az egyetlen elérhető betűtípus az Arial, azonban bármilyen más betűtípust manuálisan betölthet a projektbe, és alkalmazhatja a "Font" mezőben, minden kapcsolódó paraméter beállításával.

Ami érdekes és egyben nem túl kényelmes, hogy a GUI elemek nem jelennek meg a színpadon, amíg el nem kezdjük a projektet, így az egyes elemek paramétereinek beállítása sok időt vehet igénybe. Futtassuk a projektet, és nézzük meg, hogyan fog kinézni a fent létrehozott gombunk:

Az interfész módosítása feltétel és statikus változók szerint

Sokat tettünk már, de mindig van hova fejlődni :) Ezért utolsó példaként javaslom egy súgóablak létrehozását, amellyel a normál fejlesztők általában ellátják játékaikat, alkalmazásaikat. Ehhez adjunk hozzá egy képet egy ilyen gombhoz kérdőjel formájában a képekkel ellátott mappához, és készítsünk belőle játéktárgyat. Akassunk rá egy ütközőt, és írjunk egy forgatókönyvet névvel, például "Súgó" a következő tartalommal:

Ebben a szkriptben két változónk van. Az első változó határozza meg a felszínt, amelyet az ebben az osztályban leírt összes interfészelemhez használni fog. A fentebb tárgyalt stílusoktól eltérően a skinek lehetővé teszik, hogy ne csak az egyes elemek megjelenését módosítsa, amelyekhez hozzá vannak rendelve, hanem egy bizonyos típushoz tartozó összes elem megjelenését egyszerre. Ezenkívül a stílusokkal ellentétben a felszínek nincsenek hozzárendelve az elemekhez, hanem azonnal deklarálódnak a teljes metódusra, és addig működnek, amíg egy másik felszínt nem deklarálnak. Ne felejtse el azt is, hogy a felszínek nem csak változókként léteznek, hanem külön fájlokként is. Ezért a felszín deklarálása előtt azonnal létre kell hoznia azt a "Projekt" ablakban a helyi menüből: "Létrehozás" - "GUI felület".

A második változónk egy logikai (vagy egyébként logikai változó). Csak két értéke lehet: "true" (igaz) vagy "false" (hamis). Bináris jellege miatt egy ilyen változó tökéletes mindenféle kapcsoló megvalósítására. Esetünkben ez lesz a felelős a játékunkat leíró szöveg megjelenítéséért.

Ha azonban alaposan megnézi, észre fogja venni, hogy az utolsó változónak van egy csodálatos paramétere - "statikus". Ha ezt a paramétert a változókhoz adjuk, akkor azokat statikussá teheti, és más szkriptekből is elérheti őket!

De térjünk vissza a kód többi részéhez. Az itt már ismert "void OnMouseDown()" metódus az "isVisible" változó kapcsolójaként szolgál egy egyszerű feltétel segítségével. A feltétel után azonban van egy másik funkció is. Ez a függvény ("Debug.Log();") arra szolgál, hogy "menet közben" adja ki a konzolra a szükséges változók értékeit (ezeket idézőjelek nélkül adjuk meg zárójelben). Amint látja, egy függvényen belül kombinálhat megváltoztathatatlan szöveget (idézőjelek között) és változókat (idézőjelek nélkül). A lényeg az, hogy az összes adat között legyen egy „+” jel.

A szkript szövegében továbbá van egy módszerünk az interfész megrajzolására ("void OnGUI()()"), amelyen belül egy új felszín ("GUI.skin = HelpSkin;") és egy új felszín deklarációját látjuk. GUI.Box típusú interfész elem. A gombokkal ellentétben a doboz inaktív elem, és általában különféle szöveges vagy grafikus adatok megjelenítésére szolgál.

Ügyeljen arra, hogyan állítjuk be a doboz elhelyezését. Itt az összes érték nem közvetlenül, hanem matematikai kifejezések segítségével van megadva, ami valójában a "folyékony elrendezés" analógja a webfejlesztésben. A probléma az, hogy amikor a grafikus felület elemeinek pontos méretét adjuk meg különböző képernyőfelbontásoknál, azok nem fognak alkalmazkodni, és túl kicsik, vagy éppen ellenkezőleg, nagyok lehetnek. A motor következő verziójában a fejlesztők azt ígérik, hogy adaptívvá teszik a GUI-t, de egyelőre torzítanunk kell :(

A sikerhez vezető út utolsó lépése bőrünk testreszabása lesz. Megadjuk a skin fájlt a script változóban, majd a projekt ablakban kiválasztjuk ezt a fájlt. Más fájlokhoz hasonlóan a bőrbeállítások is megjelennek az Inspector ablakban. Itt keressük a módosítható elemet (esetünkben Box), nyissa meg és állítsa be a fent tárgyalt stílushoz hasonlóan:

Annak ellenőrzéséhez, hogy a szkriptünk megfelelően működik-e, futtassuk a projektet, és próbáljunk meg a súgó gombra kattintani:

Most már minden működik, de nem mindig kényelmes megnyomni a súgó gombot, hogy elrejtse a leírást. Gyakrabban előfordul, hogy a szabad területet kipiszkálják, hogy eltűnjenek az értesítések, mint a gombokra célozni. És itt már csak azt kell használni, hogy az "isVisible" változót statikussá tettük, valamint a háttérképre akasztott ütköztetőt...

Térjünk vissza a legelső forgatókönyvünkhöz ("Hangok"), amely nyomon követhető gombot megnyomja a hangok lejátszásához. Elég lesz, ha csak egy sort írunk bele (pontosabban a "void OnMouseDown ()" metóduson belül:

if (this.name != "HelpButton")(Help.isVisible = false;)

Ezzel a sorral egy feltételt állítunk be: ha a lenyomott ütköző neve nem egyezik meg a súgó gomb nevével, akkor a "Help" szkriptben az "isVisible" változó "false" lesz. Csak az szükséges, hogy az "isVissible" változóban feltétlenül legyen "static" postscript, különben hibát kapunk.

Most, indításkor látni fogjuk, hogy a súgóablak bezárul, ha nem csak a jobb felső sarokban lévő gombra kattintunk, hanem a képernyő bármely szabad részének megérintésekor is. Csak annyit lehet javítani, hogy az ablak elrejtőzik, ha rákattint... Ez lesz a "házi feladatod";) Csak annyit tudok mondani, hogy a GUI dobozt át kell cserélni egy hasonló kialakítású gombra, ismét , a beállító bőrrel és egy olyan funkciót ír elő, amely megváltoztatja az "isVisible" változót. Minden, maradj csendben :)

A játék összeállítása és a projekt mentése

Végre nálunk minden működik! Ez azt jelenti, hogy ideje elmenteni a játékunkat és tesztelni egy valódi eszközön. És ehhez le kell fordítani egy futtatható fájlba (Windows-hoz például EXE-ben, Androidhoz pedig APK-ban).

Ha PC-re akarsz játékot fordítani, akkor nem kell semmilyen előzetes beállítást megadnod. Android esetén azonban először csatlakoztatnia kell az Android SDK-t, amelyet a legelején letöltöttünk. Ez egyszerűen megtehető: lépjen a "Szerkesztés" menübe, hívja a "Beállítások" elemet, és a megnyíló ablakban lépjen a "Külső eszközök" fülre. Itt az "Android SDK helye" sort keressük, és ebben jelezzük az SDK-val kicsomagolt archívum elérési útját (lásd az alábbi képernyőképet). Egyébként itt az alapértelmezés szerint aktív MonoDevelop szörnyű szövegszerkesztőt is lecserélheted kedvencedre :)

És most eljött az igazság pillanata! Lépjen a "Fájl" menübe, és keresse meg ott a "Build Settings" elemet. A megnyíló ablakban azonnal fel kell adnunk jeleneteket az összeállításhoz. Ha csak egy jelenet van (mint a projektünkben), akkor elegendő az "Aktuális hozzáadása" gombra kattintani. Ha több van belőlük, akkor mindegyiket meg kell nyitnia, és ugyanúgy hozzá kell adnia a jelenetek listájához, majd húzással állítsa be a kívánt sorrendet:

Következő lépésként válasszuk ki a build platformot (Androidra tervezünk játékot, ami azt jelenti, hogy azt választjuk), és kattintsunk a lenti "Player Settings" gombra. Az Inspector ablak számos beállítást nyit meg, amelyek közül néhány kötelező vagy nagyon kívánatos. A beállításlista tetején kívánatos feltüntetni a fejlesztő cég, a program és annak ikonját (Cégnév, Terméknév és Alapértelmezett ikon).

Alul, az „Egyéb beállítások” részben két kötelező paraméter található: „Csomagazonosító” és „Csomagverzió”. Az alapértelmezett verzió 1.0, de az azonosítót kézzel kell létrehozni, és lehetőleg egyedinek kell lennie. Három részből kell állnia, amelyeket pontok választanak el egymástól: a fenntartott "com" szóból, majd a fejlesztő cég nevéből, és a végén magának az alkalmazásnak a neve.

Az összeállítás többi beállítását saját belátása szerint módosíthatja, vagy egyáltalán nem módosíthatja. A lényeg, hogy most már el is indulhat az összeállítás. Ehhez csak kattintson a "Build" gombra a "Build Settings" ablakban, és várja meg, amíg a program ad nekünk egy kész alkalmazást APK fájlba csomagolva :)

Következtetés

Ezzel véget is értünk a legegyszerűbb Android-alkalmazások létrehozásáról szóló áttekintésünknek. Hogy megismételhesse mindazt, amiről beszéltünk, a cikk végén adok egy linket az archívumhoz, amely a játék összes erőforrását külön mappaként tárolja (ha mindent a semmiből akar csinálni) és mint egy unitypackage kiterjesztésű fájl. Ez utóbbi lehetővé teszi, hogy a teljes projektet egyszerre importálja a Unity-be, beleértve a függőségeket stb.

Projektünk (és mellesleg az Internetről vagy az Eszközboltból letöltött pluginok) importálásához menjen az "Eszközök" menübe, válassza ki a "Csomag importálása" elemet, és abban az "Egyéni csomag", majd adja meg a fájlunk elérési útját, és nyomja meg az "Importálás" gombot. A projektről egyébként teljes biztonsági másolatot készíthet, ilyen egységcsomagba mentve, ugyanebből a menüből ("Eszközök"), az "Export Package" menüpontra kattintva.

Úgy tűnik, hogy minden :) Mint egy személy, aki a semmiből sajátította el a Unity 3D-t, a cikkben megpróbáltam válaszolni a maximális számú kérdésre, és kiemelni a motorral való munkavégzés kezdetben felmerülő főbb árnyalatait. De lehet, hogy valakinek ez nem lesz elég, ezért ha kérdése van, forduljon hozzám közvetlenül levélben vagy a fórumon: amiben tudok, segítek!

Sok sikert és sikeres megvalósítást kívánok mindenkinek!

P.S. A cikk szabadon másolható és idézhető, feltéve, hogy a forrásra mutató nyílt aktív hivatkozást feltüntetik, és Ruslan Tertyshny szerzőségét megőrzik.