Unreal engine 4 hry na engine. Video: Ostudný debutový trailer

23.06.2019 Konstrukce

Nový mobil Rodová linie 2 na Unreal Engine 4 rozhodli jsme se sestavit malý výběr zajímavých remaků her na tomto enginu, které si zaslouží vaši pozornost.

Takže 5 nejlepších remaků her na Unreal Engine 4. Jdeme na to!

1.

Oznámení o remaku legendárního Final Fantasy 7 na E3 2015 byl pro mnoho lidí vrcholem toho roku.

Následně na PlayStation Experience 2015 byl ukázán trailer obsahující několik sekund hraní, který byl poprvé uveden za účasti Clouda a Barreta na samém začátku hry.

Abychom pochopili, jaké místo zaujímá Final Fantasy 7 v herním průmyslu a jak moc lidé na tento okamžik čekali, stačí se podívat na reakce na oznámení tohoto remaku.

2.

3.

22letý umělec 3D prostředí Kimmo Kaunela z Finska na projektu pracoval poslední rok. Poslední zastávka, inspirovaný výtvorem studia – hrou. Kimmovi se podařilo vytvořit úžasnou mapu ukazující, jak by hra vypadala, kdyby vyšla na Unreal Engine 4.

Ten chlap má účet Deviantní umění A vlastní webové stránky, kde si můžete prohlédnout jeho nejnovější tvorbu. Tento projekt ho podle autora naučil pracovat s Unreal Engine 4.

4.

Nadšenec Airam Hernandez sdílel začátkem tohoto roku video amatérského remaku prvního dílu, na kterém pracuje sám.

Hernandezovo dílo využívá upravenou verzi grafického enginu Unreal Engine 4. Podle jeho slov chtěl nejprve pouze znovu vytvořit ostrov Shadow Moses pomocí nové technologie, aby hráči obeznámení s originálem a nováčci mohli prozkoumat jeho zajímavosti. Poté, co na technické demo upozornila zahraniční média, se však Hernandez rozhodl ujmout plnohodnotného remaku stealth akční hry.

V jeho příspěvky na Facebooku autor předělaného Metal Gear Solid neupřesnil, kdy čekat finální verze. Video, jak napovídá úvodní sdělení, vychází z raného prototypu remaku.

5.

Modder s přezdívkou Logithx vyrazil natočit remake kultovní střílečky. Nadšenec pracuje na ztělesnění dystopického City-17 z HL2 pomocí Unreal Engine 4. Autor zatím nemůže uvést přibližné datum dokončení díla – vše je zatím v rané fázi.

Logithx strávil spoustu času prací na remaku Half-Life 2 pomocí předchozí verze enginu Epic – Unreal Engine 3. Když však společnost začala distribuovat výkonné UE4, rozhodl se začít pracovat od nuly – a už na novém technika.

6.

"Jak to, řekl jste Top 5 - odkud pochází šestý bod?" - ptáš se.

K čertu s pravidly! Tohle je na Unreal Engine 4! Stačí se podívat na tyto grafiky! Autorem projektu portování této nádherné hry na nový engine je Alexander Young.

Pong- první hra, která ukázala, že hry jsou vážné. Je to úsměvné, ale k prvnímu boomu arkádových automatů stačily dvě rakety a pixelový míček: automaty s Pongem byly tak populární, že jeho klony brzy zaplavily trh. Společnost Atari následně vydala verzi Pong pro konzoli Atari 2600, což dokazuje, že i domácí herní systémy mají právo na život. Úspěch Pongu se stal signálem i pro další herní společnosti – například Konami rychle vstoupilo na arkádový trh s hrou Maze.

Tato příručka je navržena tak, aby pomohla vývojářům zlepšit výkon ve hrách vytvořených pomocí Unreal Engine 4 (UE4). Zde si povíme o nástrojích, které lze použít jak v samotném enginu, tak mimo něj, o nejlepších přístupech k používání editoru a také o skriptování, které pomáhá zvýšit snímkovou frekvenci a stabilitu projektu.

Celkovým cílem této příručky je zjistit, co způsobuje problémy s výkonem, a poskytnout několik metod k jejich řešení.

Tato příručka byla napsána pomocí UE4 verze 4.14.

Jednotky

Zlepšení optimalizace se měří pomocí snímků za sekundu (také nazývaných snímková frekvence nebo fps) a milisekund na snímek (ms).

Níže uvedený graf ukazuje vztah mezi průměrnou snímkovou frekvencí a milisekundami.

Abychom zjistili ms při libovolném fps, jednoduše zjistíme převrácenou hodnotu fps (tj. vezmeme 1 a vydělíme ji fps) a pak ji vynásobíme 1000.

1/FPS x 1000 = MS

Použití milisekund k popisu vylepšení výkonu vám umožňuje lépe měřit úroveň optimalizace potřebnou k dosažení cílové snímkové frekvence.

Zde je několik příkladů zvýšení FPS o 20 snímků za sekundu:

  • Chcete-li zvýšit FPS ze 100 na 120, musíte zlepšit výsledek o 1,66 ms
  • Chcete-li zvýšit FPS z 10 na 30, musíte zlepšit výsledek o 66,67 ms

Nástroje

Než začneme, podívejme se na tři nástroje, abychom pochopili, co se děje pod kapotou motoru. Jedná se o UE4 CPU Profiler, UE4 GPU Visualizer a Intel Graphics Performance Analyzers (Intel GPA).

Profiler

UE4 CPU Profiler je nástroj vestavěný do UE4, který vám umožní sledovat váš výkon ve hře, ať už se jedná o živou hru nebo jen uložený úryvek.

Chcete-li najít Profiler, v UE4 klikněte na Window > Developer Tools > Session Frontend.

Jak se dostat do okna Session Frontend

V rozhraní Session Frontend vyberte kartu Profiler.

Profiler v Unreal Engine

Nyní, když jste v okně Profiler, vyberte Play-In-Editor (PIE) a poté vyberte Data Preview a Live Preview, abyste viděli data načítaná ze hry. Chcete-li začít zachycovat data, stiskněte Zachytávání dat a pro uložení dat pro pozdější prohlížení stiskněte Zachytávání dat.

Prohlížení procesů přes Profiler

V Profileru se každá akce a příkaz projeví v milisekundách. U každé oblasti lze zkoumat, jak ovlivňuje snímkovou frekvenci projektu.

Vizualizér GPU

UE4 GPU Visualizer určuje, kolik výpočetních zdrojů je potřeba pro vykreslování průchodů, a také vám umožňuje podrobně zobrazit, co se děje v konkrétním rámci.

GPU Visualizer můžete otevřít prostřednictvím vývojářské konzole zadáním „ProfileGPU“.

Příkaz konzole ProfileGPU

Po zadání příkazu se zobrazí okno GPU Visualizer. Ukazuje, jak dlouho průchody trvají, a také přibližné umístění těchto průchodů ve scéně.

Zobrazení procesů pomocí GPU Visualizer

Stejně jako v Profileru díky identifikaci oblastí, jejichž zpracování trvá nejdéle, budete vědět, kde optimalizovat.

Intel GPA

Analyzátory grafického výkonu Intel (Intel GPA) jsou sada nástrojů pro analýzu a optimalizaci navržená tak, aby pomohla vývojářům zlepšit výkon jejich grafických projektů.

V tomto tutoriálu se zaměříme na dva aspekty této sady: Analyze Application a Frame Analyzer. Chcete-li začít, stáhněte si GPA z Intel Developer Zone. Po instalaci zkompilujte svůj projekt s nastavením Vývoj (pro jeho výběr klikněte na Soubor > Projekt balíčku > Konfigurace sestavení > Vývoj).

Po zkompilování projektu spusťte Graphics Monitor, klikněte na Analyze Application, vyberte požadovaný soubor *.exe v poli Příkazový řádek a kliknutím na tlačítko Spustit jej spusťte.

Dále se hra spustí – stejně jako obvykle, nicméně v levém horním rohu bude nyní nabídka se statistikami. Chcete-li jej rozbalit, klikněte na Ctrl+F1. Pokud jednou stisknete Ctrl+F1, objeví se několik oken s indikátory měřenými v reálném čase. Pokud znovu stisknete Ctrl+F1, objeví se seznam příkazů (plus klávesové zkratky, které musíte stisknout, abyste je provedli), se kterými můžete experimentovat se spuštěnou hrou.

Nabídka Intel GPA ve hře

Chcete-li vytvořit snímek pro následnou analýzu v aplikaci Frame Analyzer, musíte jít do hry a provést dvě další akce.

Nejprve povolte Přepnout události kreslení. Chcete-li to provést, zadejte do konzoly „ToggleDrawEvents“.

Příkaz konzoly ToggleDrawEvents

Když tuto funkci povolíte, budou příkazy vykreslování přicházející z enginu pojmenovány. To vám umožní pochopit, co se děje, když se podíváte na zachycený snímek v Frame Analyzeru.

Nakonec rám uložte stisknutím klávesové zkratky Ctrl+Shift+C.

Po uložení snímku spusťte Graphics Monitor, klikněte na Graphics Frame Analyzer a vyberte snímek, který chcete načíst. Po dokončení ukládání program zobrazí všechny informace o grafice dostupné v rámci.

Příklad použití Intel GPA

Množství dat v Intel GPA se na první pohled zdá ohromující, takže začněme těmi největšími informacemi. V pravém horním rohu okna nastavte obě osy (X a Y) na GPU Duration – výsledkem bude graf, které vykreslovací příkazy v tomto snímku jsou nejnáročnější na zdroje.

V našem příkladu, tj. v rámci s pouštní krajinou je jasné, že nejnáročnější na zdroje byla základní pasáž. Po výběru největšího vrcholu v grafu (tj. v podstatě nejnáročnějšího vykreslovacího příkazu) a také položky Zvýrazněné v levém dolním okně náhledu (nazvané Náhled cíle vykreslení) vidíme, že příčinou vrcholu bylo krajina (je zvýrazněna růžově).

Poté, když přejdeme do okna Process Tree List (je umístěno nad oknem náhledu a zobrazuje seznam procesů), kde najdeme vybraný příkaz pro vykreslování, uvidíme, že tato krajina se skládá z 520 200 primitiv a GPU jej musí zpracovat (tento je indikátor GPU Duration) trvá 1,3185 milisekund (ms).

Nalezení nejnáročnějšího vykreslovacího příkazu ve snímku

Nyní, když víme, co způsobilo tento nárůst, můžeme začít s optimalizací.

Za prvé, terén lze přestavět pomocí režimu Manage nástroje pro vytváření terénu UE4, který umožňuje snížit počet primitiv na 129032 a GPU Duration na 0,8605 ms. Scéna je tedy optimalizována o 5 %.

Vidíme snížení GPU Duration

Abychom znovu snížili „náklady“ krajiny na zdroje, podívejme se na materiály. Náš terén používá materiál s 13 texturami 4096 x 4096 (4K), což má za následek celkem 212,5 MB streamování textur.

Zobrazení vykreslených textur v Intel GPA

Komprimací všech textur krajiny na 2048 x 2048 (2K) jsme snížili dobu trvání GPU na 0,801 ms a zlepšili výkon o dalších 6 %.

Výsledkem bylo snížení streamování textur pro krajinu na 53,1 MB a snížení počtu primitiv, čímž byl projekt rychlejší. A to vše za cenu jen velmi malého snížení vizuální kvality krajiny.

Vidíme snížení GPU Duration dosažené zmenšením velikosti textury

Celkově jsme jednoduchým přebudováním scény a změnou textur dokázali dosáhnout následujícího:

  • Snížená výdrž GPU při zpracování terénu o 40 % (z 1,3185 na 0,801 ms)
  • Vylepšené FPS o 18 snímků (ze 143 na 161)
  • Sníženo ms o 0,7 milisekundy

Optimalizace v editoru

Dopředné vykreslování vs odložené vykreslování

Odložené vykreslování je standardní metoda vykreslování používaná v UE4. Použití Deferred Rendering obvykle zlepšuje obraz, ale může také způsobit problémy s výkonem, zejména ve VR hrách a na slabších strojích. V těchto případech má větší smysl přejít na dopředné vykreslování.

Například ve scéně Reflection z obchodu Epic můžete vidět, že existují určité rozdíly mezi metodami vykreslování Deferred a Forward.

Odrazová scéna vykreslená pomocí metody Deferred

Odrazová scéna vykreslená metodou Forward

Při dopředném vykreslování trpí odrazy, osvětlení a stíny, ale ostatní vizuální prvky se nemění. Výsledkem je zlepšení produktivity, ale zda jsou takové oběti nutné, je samozřejmě na vás.

Pokud se podíváme na snímek Intel GPA této odložené renderované scény, vidíme, že scéna běží rychlostí 103,6 ms (9 fps) a značnou část tohoto času zabere zpracování osvětlení a odrazů.

Data snímků ze scény Reflection vykreslená pomocí Deferred na Intel HD Graphics 530

A pokud se podíváme na snímek vykreslený metodou Forward, vidíme, že indikátor „ms“ se zlepšil ze 103,6 na 44,0 (tedy o 259 %) a většinu času stráví základní průchod a postprocessing. které lze také optimalizovat.

Data snímků ze scény Reflection vykreslená pomocí Forward na Intel HD Graphics 530

Úroveň detailu

Statické sítě v UE4 se mohou skládat z tisíců nebo dokonce stovek tisíc trojúhelníků - aby bylo vidět co nejvíce nejmenší detaily, kterým 3D umělec ozdobil své dílo. Když je však hráč daleko od modelu, tyto detaily nevidí a engine tyto trojúhelníky stále zpracovává. K vyřešení tohoto problému a tím k optimalizaci hry můžeme použít takzvané „levels of detail“ (nebo jednoduše LOD – z anglického „level of detail“), takže tyto detaily jsou zobrazeny na blízko, ale ne na daleká vzdálenost.

generace LOD

Ve standardním potrubí jsou LOD vytvářeny 3D modelářem během vytváření samotného modelu. Ačkoli vám tato metoda umožňuje kontrolovat konečný výsledek, UE4 má v sobě zabudovaný skvělý nástroj pro automatické generování LOD.

Automatické generování LOD

Chcete-li to provést, vyberte požadovaný model, přejděte na kartu Podrobnosti a poté na položku Nastavení LOD. Tam najděte položku Počet LODů (tedy počet úrovní detailu) a zadejte tam požadovanou hodnotu.

Automatické generování úrovní detailů

Klepněte na tlačítko Použít změny. To bude signál pro motor, aby vygeneroval několik LOD a původní model mezi nimi bude LOD0. Níže uvedený příklad ukazuje, že při vytváření pěti LODů se počet trojúhelníků v naší statické síti sníží z 568 na 28 – to je výrazné snížení zátěže GPU.

Počet trojúhelníků a vrcholů, stejně jako velikost obrazovky pro každý LOD

Pokud tento model umístíme na scénu, uvidíme, jak se bude měnit, když se bude vzdalovat od kamery.

Vizuální ukázka LOD zobrazených v závislosti na velikosti na obrazovce

Materiály pro LOD

Další vlastností LOD je, že každý z nich může používat svůj vlastní materiál. To nám umožňuje dále snížit „náklady“ na statickou síť.

Materiály přiřazené ke každé úrovni detailu

Například normální mapy jsou široce používány v herním průmyslu. Problém, který ale ve VR hrách nastává, je ten, že normální mapy nejsou dokonalé, protože při bližším prozkoumání hráč vidí, že jde jen o rovný povrch.

Tento problém lze vyřešit pomocí LODů. Vzhledem k tomu, že LOD0 je detailní až do bodu, kdy jsou viditelné malé detaily, jako jsou šrouby a šrouby, když se hráč podívá na objekt zblízka, hráč zažije pohlcující zážitek. Vzhledem k tomu, že všechny tyto detaily jsou modelovány, lze normální mapu opustit na prvním LODu. Když se hráč od tohoto objektu vzdálí, motor se přepne na jiný LOD, který má normální mapu, která snižuje detaily modelu. Když se hráč vzdálí, může být normální mapa odstraněna, protože bude příliš malá a jednoduše nebude viditelná.

Statické sítě instancí

Pokaždé, když se na scéně objeví nový objekt, vyžaduje to zavolání dalšího příkazu vykreslení na grafickém zařízení. Pokud tohle statická síť, pak bude každá kopie této sítě vyžadovat samostatné volání příkazu kreslení. Jedním ze způsobů, jak to optimalizovat (tj. situace, kdy se stejná statická síť opakuje ve scéně vícekrát), je vytvořit instanci statických sítí a tím snížit počet volaných příkazů renderu.

Máme například dvě koule skládající se z 200 osmihranných ok – jednu zelenou a druhou modrou.

Sféra statických sítí a sítí instancí

Zelené osmistěny jsou pravidelné statické sítě. To znamená, že ke generování každého z těchto modelů se používá samostatná sada vykreslovacích příkazů.

Kreslicí příkazy pro 200 statických sítí (maximálně 569)

Modré osmistěny jsou instanční sítě. To znamená, že ke generování všech těchto modelů byla použita pouze jedna sada vykreslovacích příkazů.

Kreslicí příkazy pro 200 instancí sítě (maximálně 143)

Podíváme-li se na oba příklady prostřednictvím GPU Visualizer, základní průchod pro zelenou (se statickými sítěmi) kouli trvá 4,30 ms a pro modrou (se sítěmi instancí) to trvá 3,11 ms. Scénu tak optimalizujeme o 27 %.

Jedna věc, kterou potřebujete vědět o sítích instancí, je, že pokud taková síť vykreslí nějakou část, bude také vykreslena pro všechny ostatní „klony“ této sítě. To znamená, že pokud jeden z „klonů“ skončí mimo kameru, náš potenciál optimalizace je promarněn. Proto doporučujeme vyrábět vzorky mřížky v malých hromádkách - jako je hromada kamenů, hromada pytlů na odpadky, hora krabic nebo modulární budovy umístěné na dálku.

Pokud je většina instancí sítě mimo obrazovku, jsou stále vykresleny

Hierarchické statické mřížky instancí

Pokud používáte statické mřížky s LOD, zvažte hierarchické mřížky instancí.

Sféra hierarchické instance sítě s LOD

Stejně jako standardní sítě instancí, hierarchické sítě instancí snižují počet kreslicích příkazů, ale také využívají informace LOD.

Sféra hierarchických instancí se propojuje s LOD; blízký pohled

Occlusion Culling

V enginu UE4 je Occlusion Culling systém, který vám umožňuje zajistit, aby nebyly vykresleny objekty, které hráč nevidí. To vám umožní snížit Požadavky na systém do hry, protože engine už nemusí kreslit absolutně všechny objekty v absolutně všech scénách a absolutně ve všech snímcích.

Osmiúhelníky rozeseté po pódiu

Chcete-li vidět uzavřené objekty (budou zobrazeny jako průhledné krychle se zelenými okraji), zadejte do konzole editoru „r.VisualizeOccludedPrimitives 1“. Chcete-li toto nastavení deaktivovat, zadejte „0“ místo „1“.

Okraje oplocených sítí; tyto hrany byly viditelné po použití příkazu r.VisualizeOccludedPrimitives 1

Zda bude síť vykreslena nebo ne, závisí na takzvaném „ohraničovacím rámečku“. Díky němu mohou být některé objekty neviditelné pro hráče, ale viditelné pro kameru – v tomto případě se engine rozhodne tyto objekty vykreslit.

Zobrazení hranic objektu v okně pro práci s objektem

Pokud je třeba síť vykreslit dříve, než ji hráč uvidí – například pro vykreslení nečinné animace, což je animace postavy, která se aktivuje, když stojí a nic nedělá, může to být škrábání na hlavě, sbírání země nohou , atd.) – pak lze zvětšit velikost hraniční krychle. To lze provést v okně pro práci s objektem v nabídce Nastavení statické sítě. Hledejte tam položky Positive Bounds Extension a Negative Bounds Extension.

Nastavte měřítko pro hranice objektu

Hraniční krychle složitých sítí a tvarů vždy přesahuje tyto sítě, takže čím více prázdného prostoru je v hraniční krychli, tím častěji budou tyto sítě vykreslovány. Proto je při práci na scéně důležité vědět, jak rozměry hraničních krychlí ovlivňují její výkon.

Představme si myšlenkový experiment, kdy vytvoříme 3D model a následně jej exportujeme do UE4. Jak bychom měli přistupovat k vytvoření arény ve stylu Kolosea?

Řekněme, že hráč stojí uprostřed arény a rozhlíží se po obrovském Koloseu a snaží se zastrašit své protivníky. Když hráč otočí kameru, její směr a úhel budou určovat, co engine potřebuje vykreslit. Vzhledem k tomu, že Koloseum je velmi důležitým prvkem naší hry, udělali jsme ho velmi detailní, ale abychom ušetřili na příkazech kreslení, musí být vyrobeno z několika objektů.

Nejprve ale musíme opustit myšlenku, že by celá aréna měla být jedním velkým pevným objektem. V tomto případě bude počet trojúhelníků, které bude potřeba vyrenderovat, odpovídat velikosti celé arény – bez ohledu na to, zda se díváme na její jednotlivé části či nikoliv. Jak můžeme optimalizovat tento model?

Závisí na několika faktorech. Jednak na to, na jaké kousky bude aréna rozřezána, a zadruhé na to, jak tvar těchto kusů ovlivní velikost hraničních kostek (což je důležité pro Occlusion Culling). Pro usnadnění si představme, že hráč používá kameru s 90stupňovým zorným polem.

První možností je „plátková pizza“. To znamená, že vytvoříme 8 stejných ostrých kusů, jejichž „nosy“ směřují do středu arény. Tato metoda je jednoduchá, ale není příliš vhodná pro Occlusion Culling, protože v tomto případě se budou hraniční kostky hodně překrývat. Pokud se hráč postaví do středu a rozhlédne se, jeho kamera zachytí 3-4 kostky, tzn. většina motor bude muset vykreslit polovinu arény. V nejhorším případě se hráč může postavit zády ke zdi, podívat se na arénu kolem sebe a zajmout tak všech 8 kusů „pizzy“ v rámečku. Žádná optimalizace.

Druhá možnost je „tic-tac-toe“. Zde vytvoříme 9 kusů. Toto není nejtradičnější metoda, ale má tu výhodu, že nedochází k překrývání hraničních krychlí. Stejně jako v případě „pizzy“, pokud hráč stojí uprostřed arény, zajme 3-4 figurky v rámu. Když je však zády ke zdi, zachytí v záběru 6 z 9 kusů, což ve srovnání s „pizzou“ poskytuje určitou optimalizaci.

Poslední možností je „nakrájené jablko“ (1 středový díl a 8 bočních dílků). Toto je nejběžnější metoda pro tento myšlenkový experiment a velmi dobrá - mezi hraničními krychlemi je překrytí, ale je malé. Pokud se hráč postaví do středu arény, zajme 5-6 figurek v rámci, ale na rozdíl od prvních dvou možností bude v nejhorším případě (zády ke zdi) vykresleno stejných 5-6 figurek. .

Myšlenkový experiment ukazující, jak lze rozřezat velký model a jak by to ovlivnilo hraniční krychle a přesahy mezi nimi

Kaskádové stínové mapy

I když dynamické stínové kaskády vaší hře přidávají vysoká úroveň detaily, mohou být z hlediska výkonu velmi „drahé“ – pro hraní takové hry bez ztráty snímkové rychlosti budete potřebovat výkonný počítač.

Naštěstí, jak název funkce napovídá, jsou tyto stíny vytvářeny dynamicky na bázi snímku po snímku. To znamená, že můžeme vytvořit několik možností, díky kterým může hráč optimalizovat své grafické nastavení.

„Cena“ dynamických stínových kaskád na Intel Graphics 350

Hodnotu v dynamických stínových kaskádách lze ovládat dynamicky. To lze provést několika způsoby:

  • Změnou kvality stínu v Nastavení > Nastavení škálovatelnosti modulu > Stíny
  • Úpravou parametrů v souboru „BaseScalability.ini“: v nastavení Shadow.CSM.MaxCascades (mezi „0“ a „4“) a sg.ShadowQuality (mezi „0“ a „3“ - pro „nízká“, „střední“, „vysoké“ a „epické“)
  • Přidáním uzlu Execute Console Command do plánu hry, kde jste ručně změnili parametr Shadow.CSM.MaxCascades

Optimalizace pomocí skriptování

Zakázat zcela průhledné objekty

Kreslicí příkazy lze vyvolat i na zcela průhledné herní objekty. Abyste tomu zabránili, musíte nakonfigurovat engine tak, aby je přestal vykreslovat.

Chcete-li to provést pomocí plánů, musíte v UE4 použít několik různých systémů.

Sada parametrů pro materiály

Nejprve vytvoříme sadu parametrů pro materiály (nebo jednoduše MPC - z anglického „material parameter collection“). Zde budou uloženy lineární a vektorové parametry, které lze propojit s jakýmkoli materiálem ve hře. Pomocí nich lze tyto materiály během hry upravovat – vytvářet dynamické efekty.

MPC vytvoříme kliknutím na záložku Prohlížeč obsahu na Přidat nový > Materiály a textury > Kolekce parametrů materiálu.

Vytvoření MPC

V MPC můžeme vytvářet, pojmenovávat a nastavovat výchozí hodnoty pro lineární a vektorové parametry. V našem případě budeme potřebovat lineární parametr – nazveme ho Opacity (tedy “průhlednost”) a s jeho pomocí budeme řídit průhlednost našeho materiálu.

Nastavte lineární parametr s názvem Opacity

Materiál

Hledání uzlu Parametr kolekce v materiálu

Vytvořený uzel jej spojíme s parametrem Opacity na základním materiálu.

Nastavení parametru kolekce v materiálu

Scénář v plánu

Po vytvoření MPC a materiálu přejdeme do plánu a nakonfigurujeme jej tak, abychom mohli nastavovat a číst hodnoty z MPC. To se provádí pomocí uzlů Získat/nastavit hodnotu skalárního parametru a Získat/nastavit hodnotu vektorového parametru. Dále přejdeme do těchto uzlů, v položce Collection vybereme sadu, kterou chceme použít (MPC) a v položce Název parametru – název parametru z této sady.

Pro tento příklad jsme nastavili lineární hodnotu Opacity na sinus v době hry - takže můžeme vidět hodnoty v rozmezí od "1" do "-1".

Nastavujeme a čteme lineární parametr a také používáme jeho hodnotu ve funkci

Abychom určili, zda je objekt vykreslen nebo ne, vytvoříme novou funkci nazvanou Nastavit viditelnou neprůhlednost. Vstupní hodnoty bude mít parametr Opacity z MPC a statickou síť a výstupem bude booleovská hodnota udávající, zda je objekt viditelný nebo ne.

Dále provedeme kontrolu, abychom zajistili, že hodnota je o něco větší než „0“ (in v tomto případě, více než „0,05“). Kontrola "0" může fungovat, ale když se přiblížíte k "0", hráč již nebude moci vidět objekt, takže jej můžeme jednoduše vypnout, než se hodnota změní na "0". Navíc to umožňuje vytvořit vyrovnávací paměť - v případě chyb s pohyblivou řádovou čárkou, kvůli kterým nebude lineární parametr schopen získat přesnou "0". Pokud je například hodnota „0,0001“, tento systém ji jednoduše vypne.

Dále vytvoříme uzel Branch – pokud je jeho výstup True, pak viditelnost objektu (horní uzel Set Visibility) bude mít hodnotu „true“ a pokud False, pak viditelnost objektu (dolní uzel Set Visibility Viditelnost uzel) bude mít hodnotu „false“.

Nastavte funkci Viditelné krytí

Event Tick uzel, čas a kontrola vykreslení

Pokud plán scény používá uzel Event Tick, budou tyto skripty fungovat, i když na obrazovce nejsou vidět žádné objekty. Obvykle to není velký problém, ale čím méně plánů zaškrtne během každého snímku, tím rychleji scéna poběží.

Zde je několik situací, kdy můžete použít tento typ optimalizace:

  • Věci, které nemusí fungovat, když se na ně hráč nedívá
  • Procesy, které běží v závislosti na herním čase
  • Nehráčské postavy (NPC), které nemusí nic dělat, když hráč není poblíž

Jako nejvíc jednoduché řešení Uzel Bylo nedávno vykresleno můžete umístit před značku události. Aby se náš Event Tick zapnul/vypnul, nepotřebujeme k němu připojovat speciální události a detektory. Kromě toho může být tento systém stále nezávislý na jiných procesech probíhajících ve scéně.

Správa uzlu zaškrtnutí události pomocí kontroly vykreslení

Tuto metodu lze použít i pro složitější úkoly. Například, pokud máme proces, který běží v závislosti na době hry (například nějaké svítící tlačítko, které se každou sekundu rozsvítí a zhasne), můžeme použít níže uvedený graf:

Emisní hodnota ve sbírce materiálů je nastavena tak, že během vykreslování bude fungovat jako absolutní sinusovka herního času

Výše uvedený graf zaznamenává, kolik herního času uplynulo, a poté tuto hodnotu projde absolutním sinusem plus jedna, což má za následek sinusovou vlnu kolísající mezi hodnotami „1“ a „2“.

Výhodou této metody je, že tlačítko bude blikat podle čáry v grafu výše, bez ohledu na to, zda se hráč na tlačítko dívá nebo ne (může se buď točit v kruzích, nebo na něj zírat). A to vše díky hodnotě vypočítané na základě sinusu herního času.

Funguje to i se zbytky celočíselného dělení, ale v tomto případě graf vypadá jinak.

Vykreslení můžete zkontrolovat pomocí uzlu Bylo nedávno vykresleno o něco později. To znamená, že pokud objekt ovládaný uzlem Event Tick má nějaké úkoly, které je třeba provést v každém snímku, ale můžete se ujistit, že tyto úkoly budou provedeny před kontrolou vykreslení (viz graf níže). Čím méně uzlů je voláno s každým „zaškrtnutím“ uzlu Event Tick, tím lépe.

Použití nástroje pro kontrolu vykreslení ke správě vizuálních fragmentů návrhu

Dalším způsobem, jak snížit „náklady“ na plán, je zpomalit jej a umožnit uzlu Event Tick „zaškrtnout“ pouze jednou během určitého intervalu. Tento interval se nastavuje pomocí uzlu Set Actor Tick Interval.

Přepínání mezi intervaly

Kromě toho lze v položce Tick Interval nastavit interval, ve kterém uzel Event Tick „tiká“ – nachází se v záložce Podrobnosti plánu, na kterém pracujete. Zde je interval uveden v sekundách.

Zaškrtněte položku Interval na kartě Podrobnosti

To se hodí například, když potřebujete vyrobit počítadlo, které se spustí každou sekundu.

Vytvořte paralelní počítadlo, které se spustí každou sekundu

Jako příklad toho, jak tento typ optimalizace může snížit vaši průměrnou ms, se podívejme na graf níže:

Neuvěřitelně užitečný příklad toho, co nedělat

Zde máme uzel ForLoop, který počítá od „0“ do „10000“ a je pro něj specifikován celočíselný počet prostřednictvím uzlu SET. Tento graf je velmi náročný na zdroje a neefektivní – natolik, že ukazatel ms pro naši scénu je neuvěřitelných 53,49 ms.

Zobrazení "nákladů" Stat Unit je neuvěřitelně užitečný příklad.

Po přechodu do Profileru chápeme proč. Tento jednoduchý, ale extrémně neefektivní plán spotřebuje 43 ms na každé zaškrtnutí.

Zobrazení fragmentu zodpovědného za spuštění události Tick v každém snímku v Profileru

Ale pokud necháte tento plán „tikat“ každou sekundu, pak většinou „sežere“ 0 ms. Pokud se podíváme na průměrný čas (vyberte nějaký fragment časové osy v okně Zobrazení grafu) přes tři tiky, uvidíme, že průměr je 0,716 ms.

Zobrazení fragmentu odpovědného za spouštění události Tick každou sekundu v Profileru

Nebo si vezměme běžnější případ: řekněme, že náš plán má 1,4 ms, a pokud scéna běží rychlostí 60 fps, pak zpracování tohoto plánu bude trvat 84 ms. Pokud však zkrátíte dobu, po kterou uzel Event Tick „tikne“ na plánu, zkrátí se také celkový čas strávený zpracováním tohoto plánu.

Hromadný pohyb, uzel ForLoop a multithreading

Když se pohybuje více modelů současně, vypadá to velmi cool a může to vytvořit velmi atraktivní vizuální styl. Je pravda, že v tomto případě padá velká zátěž na CPU, a proto FPS nakonec trpí. To však lze také optimalizovat rozdělením hromadného pohybu do několika plánů – díky multithreadingu a schopnosti UE4 spravovat pracovní vlákna.

V této části použijeme skript, který bude dynamicky pohybovat 1600 instancemi koulí nahoru/dolů po upravené sinusové křivce.

Níže je jednoduchý skript, který vytvoří mřížku. Jednoduše přidáme komponentu Instanced Static Mesh, na kartě Podrobnosti vybereme síť, kterou použijeme, a poté přidáme následující uzly:

Skript pro vytvoření jednoduché mřížky

Po vytvoření mřížky přidáme tento skript na kartu Graf událostí.

Několik slov o uzlu Update Instance Transform. Pokud je některá z instancí transformována, tato změna se nezobrazí, dokud položka Označit stav vykreslení jako špinavý nebude označena jako „pravda“. Ale to je operace náročná na zdroje, protože... kontrola prochází každou mřížkou. Chcete-li ušetřit výpočetní prostředky, zejména pokud je tento uzel spouštěn několikrát za zaškrtnutí, můžete na konci plánu aktualizovat mřížky. Ve skriptu níže je položka Mark Render State Dirty označena jako „true“ pouze tehdy, jsou-li splněny dvě podmínky – pokud Uzel ForLoop náklady na poslední index a pokud hodnota v indexu odpovídá velikosti mřížky mínus 1.

Dynamický návrh pohybu pro sítě statických instancí

Navíc pomocí návrhu typu Actor, skriptu mřížky a události dynamického pohybu můžeme vytvořit různé možnosti mřížky, kde se zobrazí 1600 mřížek současně.

Více možností mřížky s 1600 oky

Při běhu scény uvidíme mřížkové prvky plovoucí nahoru a dolů.

Mřížka 1600 statických instancí mřížky, které se dynamicky pohybují nahoru a dolů

Typ chunkingu však ovlivňuje rychlost, jakou scéna běží.

Za prvé, pokud se mřížka skládá z 1600 jednotlivých fragmentů, pak všech 1600 plánů bude zpracováno za 16,86 ms (tj. průměrně 0,0105 ms na plán). To znamená, že ačkoli je „cena“ jednoho plánu malá, jejich celkový počet zpomaluje systém. Jediná věc, kterou zde lze udělat, je snížit počet plánů spouštěných každým „zaškrtnutím“. Dalším důvodem vysokého zatížení je velký počet jednotlivých sítí, což zvyšuje počet příkazů vykreslování i transformace sítě.

Za druhé, pokud se mřížka skládá z jednoho fragmentu, který obsahuje 1600 mřížek, pak bude tato možnost velmi dobře optimalizována z hlediska kreslicích příkazů (protože pro celou mřížku je vyžadován pouze jeden kreslící příkaz), ale „náklady“ na plán , což je jeden „tick“, který bude potřebovat ke zpracování 1600 mřížek, bude 19,63 ms.

Pokud ale mřížku rozdělíte jinak (na 4 fragmenty po 400 mřížkách, 64 z 25 nebo 16 ze 100), výsledek je optimalizovanější – díky zkrácené době zpracování skriptu a schopnosti UE4 pracovat s vícevlákny. Díky posledně jmenovanému může UE4 rozložit zatížení zpracování plánu mezi více pracovních vláken, a tím efektivně využít všechna jádra CPU.

Pokud se podíváme na dobu zpracování plánů a na to, jak jsou distribuovány mezi pracovními vlákny, uvidíme následující:

Datové struktury

Použití správných datových struktur je nezbytným prvkem každého programu, a to platí pro vývoj her stejně jako pro vývoj jiného softwaru. Při programování v UE4 se používají plány a v poli šablon, které slouží jako hlavní kontejner, nejsou žádné datové struktury. Jsou vytvářeny ručně v pozdější fázi vývoje – s přidáním funkcí a uzlů, které se nacházejí v UE4.

Příklad použití

Jako příklad, proč a jak lze datovou strukturu využít při vývoji her, si představme shootmap hru. Jednou z hlavních mechanik střeleckých map je střílení na nepřátele, které generuje tisíce kulek řítící se po obrazovce. Protože kulky nakonec dosáhnou svého cíle (nebo nezasáhnou objekty) a jsou zničeny, herní engine musí tyto úlomky vyčistit, což může ovlivnit výkon hry a dokonce snížit snímkovou frekvenci. Aby se vývojáři vypořádali s tímto problémem, měli by ve svém návrhu poskytnout takzvaný „object pool“ – sadu objektů (v tomto případě odrážky) umístěných do pole/seznamu a zpracovaných při spuštění hry – díky čemuž mohou vývojáři kdykoli povolit / zakázat odrážky. Výsledkem je, že motor dostane pouze za úkol vytvářet kulky.

Nejběžnější metodou použití fondu objektů je vzít první dosud neaktivovanou odrážku v poli/seznamu, přesunout ji na výchozí pozici, zapnout ji a poté ji vypnout, když vyletí z obrazovky nebo zasáhne nepřítele. . Problémem této metody je doba, za kterou se skript spustí, tzn. ve velkém "O". Protože provádíte mnoho smyček, kontrolujete objekty a hledáte, který z nich vypnout, při použití 5000 objektů může nalezení jednoho objektu zabrat mnoho smyček. Pro tuto metodu bude čas reprezentován jako O(n), kde „n“ je počet objektů v sadě.

Ačkoli O(n) není zdaleka nejhorší algoritmus. Čím více se blížíme k O(1) – tzn. na fixní „náklady“, nezávisle na velikosti – čím efektivnější bude skript a tím rychlejší bude hra. Abychom toho dosáhli u fondu objektů, používáme datovou strukturu nazývanou „fronta“. Stejně jako skutečná fronta tato datová struktura vezme první objekt v sadě, použije jej a poté jej odstraní, dokud nepoužije všechny objekty ve frontě.

Pomocí této "fronty" pro náš fond objektů můžeme vzít přední část sady, zahrnout ji, poté ji odstranit a okamžitě ji vložit do zadní části sady. To vytvoří efektivní smyčku ve skriptu a zkrátí dobu běhu skriptu na O(1). Do této smyčky můžeme také přidat kontrolu - pokud byl odstraněný objekt zahrnut, skript jej vezme a bez vytvoření nového objektu jej umístí na konec fronty, čímž se zvětší velikost sady, ale nezvětší se doba zpracování skriptu.

Fronty

Níže je několik obrázků, které ukazují, jak používat fronty. Přidávají do plánů různé funkce, díky nimž je kód čistší a lépe použitelný.

  • Odstranění

Implementace konstruktu queue::pop v plánu UE4; odebere prvek z přední části fronty

  • Přidání

Implementace konstruktu queue::push v Blueprint UE4; vloží nový prvek na konec fronty

  • Určení, zda je fronta prázdná
  • Určení velikosti fronty

Implementace konstrukce queue::size v Blueprint UE4; hlásí velikost fronty

  • Vrácení ukazatele na první prvek ve frontě

Implementace konstruktu queue::front v UE4 Blueprint; vrátí ukazatel na první prvek ve frontě

  • Vrácení ukazatele na poslední prvek ve frontě

Implementace konstrukce queue::back v návrhu UE4; vrátí ukazatel na poslední prvek ve frontě

  • Vložení prvku na určité místo ve frontě

Vloží zadaný prvek do zadaného umístění fronty (s kontrolou pozice)

  • Výměna dat

Implementace konstrukce queue::swap v návrhu UE4; nutí dva kontejnery k výměně dat (s ověřením polohy)

Hromady

Níže je několik obrázků, které ukazují, jak používat zásobníky. Přidávají do plánů různé funkce, díky nimž je kód čistší a lépe použitelný.

  • Odstranění

Implementace konstrukce stack::pop v plánu UE4; odebere prvek z předního konce stohu

  • Přidání

Implementace konstrukce stack::push v návrhu UE4; vloží nový prvek na konec zásobníku

  • Určení, zda je zásobník prázdný

Implementace konstrukce stack::empty v plánu UE4; říká, zda je zásobník prázdný

  • Určení velikosti zásobníku

Implementace konstrukce stack::size v Blueprint UE4; hlásí velikost zásobníku

  • Vrácení ukazatele na poslední prvek v zásobníku

Vrátí ukazatel na poslední prvek v zásobníku

  • Vložení prvku na určité místo v zásobníku

Vloží zadaný prvek do zadaného umístění zásobníku (s kontrolou polohy)

Unreal Engine má své kořeny již v roce 1998. Od té doby vzniklo mnoho úžasných her. V tomto článku si povíme o 7 nejlepších z nich. V době, kdy motor vznikal, sloužil k tvorbě jednoduché hry s 2D pohledem. Postupně se začaly objevovat modernější 3D akční hry. Popularitu enginu zajistil jedinečný operační systém, který má současně: grafické a fyzické jádro, vestavěnou umělou inteligenci a také nástroje pro správu souborových systémů a sítí. Hlavním lákadlem byla dostupnost hotového prostředí pro tvorbu her – UnrealEd.

#7 - Batman: Arkham Knight

Tato hra má žánr akčního thrilleru. Děj je založen na událostech, které se staly 9 měsíců po slavné válce v Arkham City. Vzhledem k tomu, že Joker je mrtev, Gotham se začíná vracet do své obvyklé koleje života, pro jeho obyvatele začíná bezpečnější období, ale rovnováha sil se ztrácí, když se jednoho dne na sebe obyvatelé Gothamu vrhnou v kavárně. žádný zjevný důvod.

Po takovém výkonu se na scéně objeví Strašák s prohlášením, že užil jen 100 g svého nového toxinu a ona hodlá pokračovat a každý den dávku zvyšovat. V tomto ohledu jsou obyvatelé naléhavě evakuováni z města.


Hlavní postava– Batman, který neúnavně bojuje za bezpečí svého rodného města a vymýtí zločin. Během hry se objeví mnoho nepřátel, krásná místa a jedinečné postavy. Hra se vyznačuje pečlivým přístupem ke hře a zaslouží si proto 7. místo mezi nejlepšími.

#6 - Street Fighter V

Jsou hry, které bez nadsázky zná celý svět, Street Fighter mezi takové hry patří. Novodobý pátý díl zaplní prázdnotu po nelogickém vydání třetího a šestého dílu. Pro těch pár, kteří hru ještě neznají, je to bojová hra, kde uživatel bojuje s nepřáteli. Základ jeho oblíbenosti spočívá v možnosti multiplayeru a hraní s kamarádem vždy přináší „živé“ emoce.


Hra je známá od nepaměti díky mnoha postavám s jedinečnými vlastnostmi a bojovými schopnostmi. Dříve existovaly prvotřídní postavy a uživatelé, proti kterým nebylo možné vyhrát, ale postupně se bojová strategie a techniky změnily a získaly větší rovnováhu.

#5 - Jsme šťastní málo

Hra se zaměřuje na rok 1964, kdy ve městě tzv Wellington Wells(název je fiktivní) byly vyvinuty léky ke zvýšení radosti, říká se tomu sérum „Joy“. Je založen na čištění vzpomínek. Jde o to, že během druhé světové války se obyvatelé uchýlili k používání extrémně špatných věcí, což vyvolalo silné potlačení ducha národa. Sérum je navrženo tak, aby odstranilo tyto vzpomínky a učinilo lidi šťastnějšími, a to silou. Ti obyvatelé, kteří odmítají používat „Joy“, se nazývají „Bores“ a jsou vymýceni.


Hlavním hrdinou je Arthur Hastings, obyčejný úředník, který se zabývá cenzurou novin „nešťastných“ zpráv z minulosti. Při procházení novinových archivů objeví svou fotografii a mladší bratr na obalu. Do hlavy se mu vkrádají vzpomínky a přinášejí bolest. Aby poznal sám sebe, odmítá pít „Joy“. Poté, co efekt skončí, jeho kolegové ho poznají jako „Nuru“ a začnou ho pronásledovat. To donutí Arthura uprchnout do sklepení.

#4 - Gears of War 4

Kultovní série her opět inspiruje uživatele k ponoření se do světa „nepořádku“. Po herní stránce zde nejsou žádné výrazné rozdíly oproti předchozím dílům. Hra zůstává vynikající střílečkou, kde je mnoho nepřátel a úkrytů. Zbraní je opravdu hodně, až po kulomet s motorovou pilou jako podhlavňový bajonet. Bitvy se odehrávají jak s Hordou, i když jsou strašidelné, ale živé, tak s COG roboty. Všechny příšery se snaží hrdinu pohltit.


Zajímavostí hry je, že se náhle může objevit vír neuvěřitelné síly, který vyvolá silné otřesy celého povrchu Síry, nikdo a nic neodolá síle přírody. Hráč bude moci vidět domy stoupající do nebe, přežít v takových podmínkách nebude snadné.

#3 - Mortal Kombat X

Mortal Kombat je v první trojici nejlepší hry na Unreal Engine. Má žánr bojové hry, který byl popsán dříve na příkladu Street Fighter V. Je zde mnoho postav, nespočetné množství úderů, ale jejich vytvoření může být docela obtížné, protože kombinace jsou dlouhé a musí být provedeny přesně. Popularita hry je založena na její vynikající hratelnosti, velkolepých bitvách a krásných modelech postav a terénu pro souboje.


Hra má dokonce i zápletku, i když jde spíše o formalitu, protože hodnota hry v této složce netkví. Souboje s přáteli, které vedou ke vzniku soutěživého ducha, jsou nejdůležitější vlastností hry. Chcete-li být vítězem, musíte si zapamatovat a nacvičit kombinace pro údery, a pak ani váš přítel ani počítač neodolají.

#2 - BioShock Infinite

BioShock je zajímavá střílečka, která fascinuje svou atmosférou a má některé RPG prvky, to znamená, že můžete upgradovat schopnosti své postavy. Hra zavede uživatele zpět do roku 1912, děj se odehrává v plovoucím městě Columbia.


Uživatel bude hrát za soukromého detektiva Bookera DeWitta, který vstoupí do města, aby hledal Elizabeth. Po objevení dívky se oba hrdinové stanou válečnými zajatci mezi úřady a rebely, prostou, dělnickou třídou.

Elizabethina jedinečnost spočívá v tom, že dokáže vytvořit trhliny mezi paralelními světy, které odhalují mnohé o městě a minulosti postav.

#1 - Zneuctěno

Stealth akce se v dnešní době stává docela populárním žánrem, ale je těžké konkurovat Dishonored. Navíc hra obsahuje prvky žánru RPG.

Hra vás zavede do města, které je zcela utápěno v morové epidemii – to je Dunwall. Je nápadné, že město v mnoha ohledech připomíná Londýn ve starověku, přibližně viktoriánské době. Hlavní hrdina Corvo Attano chce obnovit spravedlnost, protože byl obviněn z vraždy císařovny. Pán uteče z vězení a snaží se nastolit rovnováhu mezi dobrými a zlými silami.

Corvo nezanedbává žádné způsoby řešení situace, a tak „luní“ jako nájemný vrah. Hlavním úkolem je najít a odstranit konkrétní postavu. Přítomen ve hře velký počet různé zbraně, ale to není vše, protože postava má jedinečné schopnosti.


Hra má zajímavý děj, je nelineární. Téměř každá mise může být splněna mnoha způsoby, zejména - můžete dělat hluk a zabít mnoho protivníků nebo zabít nepřítele tajně, aby si toho nikdo nevšiml.



Zdravím tě, Habr! Rád bych vám představil relativně malý projekt, který jsem vytvořil od nuly za asi 150 hodin (50 spuštění ~ 3 hodiny každý) na Unreal Engine 4. Projekt jsem udělal v žít pouze na streamech jednou týdně (celkem to trvalo rok), přičemž odpovídali na dotazy uživatelů.

Samotný projekt nebyl zamýšlen jako komerční. Mým cílem bylo v praxi ukázat složitost vývoje her, konkrétně problémy jako:

  • Plánování projektů a prototypování
  • Promyšlení a realizace architektury projektu a jeho jednotlivých komponent
  • Implementace uživatelského rozhraní
  • Ladění a oprava chyb
  • Práce s majetkem a grafikou

Na konci celé série streamů jsme skončili u hratelného prototypu „survival“ střílečky. Ti, co mají sklenici napůl plnou, by to mohli dokonce nazvat pre-alfa bez děje.

Pokud vás zajímají podrobnosti o projektu, streamované nahrávky, zdroje atd., čtěte dále.

Celý projekt byl realizován na vizuálním programovacím systému zvaném Blueprints. A samozřejmě, mnozí specialisté to mohou označit za dětinské; Navíc to lze provést poměrně rychle, jak jsme již mohli dokázat.

Chci hned odpovědět na otázku: " Proč Blueprints a ne C++?". No, za prvé, když jsem se sérií začínal, tak jsem plusy skoro neznal. Sice bych takový singl ještě udělal na zdroji. Zadruhé jsou zdroje skoro tak dobré jako plusy u nás, ale zároveň poskytují řadu možností: Neumožňují dělat mnoho chyb jsou možné s výhodami, nemusíte se rozptylovat mezi BP a C++, je to snazší pro začátečníky A v našem případě nejsou o moc pomalejší, vzhledem k tomu, že téměř veškerá logika je postavena na událostech.

Podařilo se nám také trochu zapracovat na grafice. Bohužel jsme neměli čas vytvořit aktiva, takže jsme některé z nich nechali jako figuríny, některé byly vytvořeny přímo v editoru z primitivů a část obsahu byla vypůjčena z bezplatných ukázek Epic Games. Přesto jsme si některé věci zvládli udělat sami, například denní a noční systém, postprocessing pro vodu a některé materiály pro objekty scény.

V plánech mých streamů byly také problémy, které mohou při vývoji nastat. Řešil jsem je konkrétně naživo, abych nejen ukázal, s čím se mohou mladí vývojáři setkat, ale také jak ladit jejich kód, hledat chyby a psát svůj kód tak, aby to celé šlo dvakrát rychleji. Samozřejmě nemám desítky let zkušeností s programováním a to ovlivnilo někdy hloupé chyby, které jsem dělal. A jsem si jistý, že mnoho vývojářů může zpochybnit mnoho bodů v procesu psaní hry.

Přirozeně to lze jen stěží nazvat plnohodnotnou hrou, protože ve hře není žádný děj ani cíl - pouze čistá mechanika. Věřím však, že výsledek je na co být hrdý a že plně odráží to, k čemu byl celý projekt určen.

Seznam všeho, co se nám podařilo implementovat do naší hry

Charakter

  • Ovládání postavy
  • Systém vitálních statistik (boky, brnění, výdrž, hlad, žízeň)
  • Přepínání pohledu (první a třetí osoba)
  • Model (vyrobený ve Fuse, animace převzaty z Mixama)
  • Přizpůsobené animace pohybu a použití zbraní
  • Univerzální interakce s předměty

Systém inventarizace objektů

  • Komponenta inventáře (vložení do libovolného objektu, který chcete)
  • Klecový systém s podporou pro různé velikosti předmětů
  • Velikost inventáře podle buněk na stránku a podle hmotnosti.
  • Třída položek, které lze umístit do inventáře. Položky jsou uloženy jako objekty.
    • Hmotnost, velikost, informace, stav zboží
    • Funkce pro stohování (když je v jedné buňce hodně jedné položky)
    • Schopnost přidat logiku pro použití položky
    • Vyřazení z inventáře
  • Rozhraní pro interakci s inventářem
  • Rozhraní pro výměnu mezi jinou komponentou a její vlastní.
  • Drag&Drop manipulace s objekty mezi inventáři a v rámci jednoho inventáře.
  • Kontextové menu pro položky
  • Rady při ukazování na předměty v inventáři a ve světě.
  • Seznam vygenerovaných položek při vytváření objektu s komponentou / spuštění hry.
  • Seznam počátečních položek při vytváření objektu s komponentou / spuštění hry.
  • Systém obchodování mezi ostatními zásobami
    • Obchodní rozhraní
    • Komponenta pro správu peněz (nutná pro fungování obchodování)

Systém zařízení

  • Vybavte několik typů předmětů: Klobouky, Top, Kalhoty, Boty, Zbraně
  • Kosterní synchronizace topu, kalhot a bot. (Klobouky a zbraně podle zásuvek)
  • Pohodlné okno pro vybavení s podporou Drag&Drop
  • Podpora modifikační logiky při oblékání
Zbraň
  • Zbraně na dálku
    • Znovu načíst
    • Použití položek munice z inventáře
    • Podpora pro třídy projektil/kulka
    • Automatický oheň/jeden požár
    • Zpětný ráz s rozpětím (vlastní + v závislosti na faktorech, např. běh nebo dřep)
  • Zbraně na blízko (s několika typy kontrol poškození na výběr)
  • Stav zbraně se používáním zhoršuje
Craftingový systém
  • Tvoření podle receptu (vybral jsem si recept, vytvořilo to, ala Fallout)
  • Vytváření předmětů (vhození potřebných předmětů, on je vytvořil, ala Minecraft)
  • Uživatelské rozhraní pouze pro druhý typ craftingu.
Agresivní davy
  • Mobové na blízko (pokud je uvidí, rozběhnou se a začnou bít)
  • Davy smíšeného typu (střílejí, ale pokud jsou dostatečně blízko, poběží zasáhnout)
  • Střelci na dlouhé vzdálenosti běhají kolem překážek, pokud nemohou střílet.
  • K dispozici je vestavěný inventář pro kořist po zabití.
  • Spawn zóna
  • Seznam tříd
  • Šance na potěr
NPC
  • Městské NPC hlídkující v jejich spawn zóně
  • Unikátní NPC
  • Základní plánovač pro jedinečné NPC
  • Reakce na poškození (útěk nebo použití stávajících zbraní)
  • Vestavěný inventář pro kořist po zabití.
  • Objektový dialogový systém
    • Strom dialogů
    • Každá odpověď je objekt
    • Ke každé odpovědi můžete přidat libovolnou logiku nebo podmínku přístupnosti.
    • Dialogové rozhraní
    • Nějaký hotové třídy odpověď (zahájí obchodování, vezme zdroje, pokud existují, opustí dialog)
Konstrukce
  • Třída struktur, které podporují umístění
  • Použití surovin z inventáře při umisťování.
  • Zaklapnutí některých typů konstrukcí (např. stěny, základy, okna)
  • Menu s návrhy
  • Zvýraznění struktur, které mají dostatek zdrojů
dodatečně
  • Malá mapa s městem, lesem, vodními plochami (můžete plavat).
  • Systém den/noc
  • Auta
    • Pohled z první nebo třetí. Společný s Peršanem
    • Zapínání/vypínání světlometů.
    • Vestavěná komponenta inventáře (je třeba s ní pracovat v kufru)
  • Poněkud funkční vertikální schody.
  • Hlavní menu
  • Pozastavit nabídku
  • Nabídka nastavení grafiky

O projektu však můžeme mluvit donekonečna. A abyste z článku neudělali knihu, doporučuji vám seznámit se s hrou a jejími možnostmi prostřednictvím videa. A pro ty, které to opravdu zajímá, hned níže najdete nahrávky všech streamů, odkazy na zdroje a build hry.

Obsah po částech

  1. Spouštíme a plánujeme projekt. Vytváříme ovládání a chování postavy.
  2. Začněme vytvářet inventární systém.
  3. Pokračujeme v budování základny inventárního systému.
  4. Připravujeme základnu pro výstroj a zbraně.
  5. Práce na zbraních a používání nábojnic.
  6. Provádíme automatické střílení a míření.
  7. Vytvoření základního crafting systému.
  8. Běh, recyklace věcí a jejich opotřebení.
  9. Realizujeme přebíjení zbraní.
  10. Výroba zbraní na blízko.
  11. Dokončíme mele a uděláme žebřík, po kterém můžete vylézt.
  12. Vyrábíme interaktivní předměty: Dřevo, kámen, keře.
  13. Vytvoříme HUD a začneme vytvářet rozhraní pro inventář.
  14. Pokračujeme v práci na rozhraní inventáře. Vytváříme buňky s objekty.
  15. Pokračujeme ve generování buněk a hledání místa pro položku. Přidávání stránek inventáře.
  16. Provedeme malou interakci s předměty v inventáři a okno s podrobnými informacemi.
  17. Udělal Drag&Drop přetahování předmětů přes inventář a do jiného inventáře.
  18. Tato část je o vizualizaci craftingu.
  19. Vytvoříme okno s volbou počtu položek ze zásobníku pro převod do jiného inventáře.
  20. Poskytujeme podporu různé recepty crafting, a také opravit různé chyby v inventáři.
  21. Vytváříme systém pro změnu dne a noci a také vytváříme novou scénu pro náš projekt.
  22. Začínáme vytvářet AI pro agresivní roboty.
  23. Děláme útok na moby, stejně jako reakci na útok. Navíc realizujeme sběr kořisti od mrtvých davů.
  24. Vytváříme spawn zónu pro NPC. Přidáváme také generování náhodných předmětů v inventáři.
  25. Aktualizujeme na 4.13 a také vyrábíme agresivní NPC na velký dosah.
  26. Přidání různých prvků do HUD. Přidání ručního nabíjení zbraně.
  27. Dokončujeme podporu pro skeleton oblečení a klobouky. Přidání animace pro zbraně v první osobě.
  28. Vytváříme rozhraní pro práci s naším systémem zařízení.
  29. Začínáme vytvářet obchodní systém a komponentu pro správu peněz.
  30. Pokračujeme v obchodování vytvářením a přizpůsobením obchodní komponenty.
  31. Zrušíme obchod a také nastavíme animaci opětovného načtení.
  32. Vytváříme vozidlo s vlastním inventářem, světlomety a přepínáním pohledu. Vytváříme baterku.
  33. Vytváříme konstrukci (nebo spíše systém umisťování předmětů před nás).
  34. Vyrábíme rozhraní pro stavbu, vyrábíme vazbu na stěny.
  35. Vyrábíme několik dalších typů konstrukcí: Stan, postel, židle, stůl, lampa, dveře. hrudník, oheň.
  36. Přidejte střechu a okna. Dokončujeme zarovnání vzhledem k ostatním konstrukcím.
  37. Vytvoříme malou osadu a také ji zaplníme NPC, které také vytvoříme v této lekci.
  38. Začínáme vytvářet systém dialogu pro naše obyvatele.
  39. Nastavení mlhy a následného zpracování. Importujeme model zombie a přizpůsobujeme jeho animace.
  40. Dokončujeme dialogový systém.
  41. Provádíme interakci s předměty od třetí osoby, stejně jako modifikátory pro brnění.
  42. Vytváříme hlavní menu, menu pauzy a nastavení grafiky. Také dáváme dohromady první build hry.
  43. Implementujeme plán pro jedinečné obyvatele A také proto, aby městská NPC utekla před útoky.
  44. Do inventáře přidáváme kontextové menu a také opravujeme některé chyby v našem inventáři.
  45. Přidáváme zpětný ráz, roztažení, animaci výstřelu a možnost zásahu střelnými zbraněmi.
  46. Dokončíme agresivní a městská NPC a opravíme různé chyby s nimi spojené.
  47. Nastavení animací pro hlavní postavu. Přidání různého oblečení.
  48. Opravujeme různé chyby v naší hře.
  49. Opravujeme různé chyby ve výrobě, NPC a vybavení v naší hře.
  50. Mapu trochu dokončujeme a dáváme dohromady nejnovější sestavení.
  • Vývoj hry
  • Zdravím tě, Habr! Rád bych vám představil relativně malý projekt, který jsem vytvořil od nuly za asi 150 hodin (50 běhů ~ 3 hodiny každý) na Unreal Engine 4. Projekt jsem dělal naživo pouze na streamech jednou týdně (celkem to trvalo rok), odpovídání na dotazy uživatelů.

    Samotný projekt nebyl zamýšlen jako komerční. Mým cílem bylo v praxi ukázat složitost vývoje her, konkrétně problémy jako:

    • Plánování projektů a prototypování
    • Promyšlení a realizace architektury projektu a jeho jednotlivých komponent
    • Implementace uživatelského rozhraní
    • Ladění a oprava chyb
    • Práce s majetkem a grafikou

    Na konci celé série streamů jsme skončili u hratelného prototypu „survival“ střílečky. Ti, co mají sklenici napůl plnou, by to mohli dokonce nazvat pre-alfa bez děje.

    Pokud vás zajímají podrobnosti o projektu, streamované nahrávky, zdroje atd., čtěte dále.

    Celý projekt byl realizován na vizuálním programovacím systému zvaném Blueprints. A samozřejmě, mnozí specialisté to mohou označit za dětinské; Navíc to lze provést poměrně rychle, jak jsme již mohli dokázat.

    Chci hned odpovědět na otázku: " Proč Blueprints a ne C++?". No, za prvé, když jsem se sérií začínal, tak jsem plusy skoro neznal. Sice bych takový singl ještě udělal na zdroji. Zadruhé jsou zdroje skoro tak dobré jako plusy u nás, ale zároveň poskytují řadu možností: Neumožňují dělat mnoho chyb jsou možné s výhodami, nemusíte se rozptylovat mezi BP a C++, je to snazší pro začátečníky A v našem případě nejsou o moc pomalejší, vzhledem k tomu, že téměř veškerá logika je postavena na událostech.

    Podařilo se nám také trochu zapracovat na grafice. Bohužel jsme neměli čas vytvořit aktiva, takže jsme některé z nich nechali jako figuríny, některé byly vytvořeny přímo v editoru z primitivů a část obsahu byla vypůjčena z bezplatných ukázek Epic Games. Přesto jsme si některé věci zvládli udělat sami, například denní a noční systém, postprocessing pro vodu a některé materiály pro objekty scény.

    V plánech mých streamů byly také problémy, které mohou při vývoji nastat. Řešil jsem je konkrétně naživo, abych nejen ukázal, s čím se mohou mladí vývojáři setkat, ale také jak ladit jejich kód, hledat chyby a psát svůj kód tak, aby to celé šlo dvakrát rychleji. Samozřejmě nemám desítky let zkušeností s programováním a to ovlivnilo někdy hloupé chyby, které jsem dělal. A jsem si jistý, že mnoho vývojářů může zpochybnit mnoho bodů v procesu psaní hry.

    Přirozeně to lze jen stěží nazvat plnohodnotnou hrou, protože ve hře není žádný děj ani cíl - pouze čistá mechanika. Věřím však, že výsledek je na co být hrdý a že plně odráží to, k čemu byl celý projekt určen.

    Seznam všeho, co se nám podařilo implementovat do naší hry

    Charakter

    • Ovládání postavy
    • Systém vitálních statistik (boky, brnění, výdrž, hlad, žízeň)
    • Přepínání pohledu (první a třetí osoba)
    • Model (vyrobený ve Fuse, animace převzaty z Mixama)
    • Přizpůsobené animace pohybu a použití zbraní
    • Univerzální interakce s předměty

    Systém inventarizace objektů

    • Komponenta inventáře (vložení do libovolného objektu, který chcete)
    • Klecový systém s podporou pro různé velikosti předmětů
    • Velikost inventáře podle buněk na stránku a podle hmotnosti.
    • Třída položek, které lze umístit do inventáře. Položky jsou uloženy jako objekty.
      • Hmotnost, velikost, informace, stav zboží
      • Funkce pro stohování (když je v jedné buňce hodně jedné položky)
      • Schopnost přidat logiku pro použití položky
      • Vyřazení z inventáře
    • Rozhraní pro interakci s inventářem
    • Rozhraní pro výměnu mezi jinou komponentou a její vlastní.
    • Drag&Drop manipulace s objekty mezi inventáři a v rámci jednoho inventáře.
    • Kontextové menu pro položky
    • Rady při ukazování na předměty v inventáři a ve světě.
    • Seznam vygenerovaných položek při vytváření objektu s komponentou / spuštění hry.
    • Seznam počátečních položek při vytváření objektu s komponentou / spuštění hry.
    • Systém obchodování mezi ostatními zásobami
      • Obchodní rozhraní
      • Komponenta pro správu peněz (nutná pro fungování obchodování)

    Systém zařízení

    • Vybavte několik typů předmětů: Klobouky, Top, Kalhoty, Boty, Zbraně
    • Kosterní synchronizace topu, kalhot a bot. (Klobouky a zbraně podle zásuvek)
    • Pohodlné okno pro vybavení s podporou Drag&Drop
    • Podpora modifikační logiky při oblékání
    Zbraň
    • Zbraně na dálku
      • Znovu načíst
      • Použití položek munice z inventáře
      • Podpora pro třídy projektil/kulka
      • Automatický oheň/jeden požár
      • Zpětný ráz s rozpětím (vlastní + v závislosti na faktorech, např. běh nebo dřep)
    • Zbraně na blízko (s několika typy kontrol poškození na výběr)
    • Stav zbraně se používáním zhoršuje
    Craftingový systém
    • Tvoření podle receptu (vybral jsem si recept, vytvořilo to, ala Fallout)
    • Vytváření předmětů (vhození potřebných předmětů, on je vytvořil, ala Minecraft)
    • Uživatelské rozhraní pouze pro druhý typ craftingu.
    Agresivní davy
    • Mobové na blízko (pokud je uvidí, rozběhnou se a začnou bít)
    • Davy smíšeného typu (střílejí, ale pokud jsou dostatečně blízko, poběží zasáhnout)
    • Střelci na dlouhé vzdálenosti běhají kolem překážek, pokud nemohou střílet.
    • K dispozici je vestavěný inventář pro kořist po zabití.
    • Spawn zóna
    • Seznam tříd
    • Šance na potěr
    NPC
    • Městské NPC hlídkující v jejich spawn zóně
    • Unikátní NPC
    • Základní plánovač pro jedinečné NPC
    • Reakce na poškození (útěk nebo použití stávajících zbraní)
    • Vestavěný inventář pro kořist po zabití.
    • Objektový dialogový systém
      • Strom dialogů
      • Každá odpověď je objekt
      • Ke každé odpovědi můžete přidat libovolnou logiku nebo podmínku přístupnosti.
      • Dialogové rozhraní
      • Několik připravených tříd odpovědí (zahájí obchodování, vezme zdroje, pokud existují, opustí dialog)
    Konstrukce
    • Třída struktur, které podporují umístění
    • Použití surovin z inventáře při umisťování.
    • Zaklapnutí některých typů konstrukcí (např. stěny, základy, okna)
    • Menu s návrhy
    • Zvýraznění struktur, které mají dostatek zdrojů
    dodatečně
    • Malá mapa s městem, lesem, vodními plochami (můžete plavat).
    • Systém den/noc
    • Auta
      • Pohled z první nebo třetí. Společný s Peršanem
      • Zapínání/vypínání světlometů.
      • Vestavěná komponenta inventáře (je třeba s ní pracovat v kufru)
    • Poněkud funkční vertikální schody.
    • Hlavní menu
    • Pozastavit nabídku
    • Nabídka nastavení grafiky

    O projektu však můžeme mluvit donekonečna. A abyste z článku neudělali knihu, doporučuji vám seznámit se s hrou a jejími možnostmi prostřednictvím videa. A pro ty, které to opravdu zajímá, hned níže najdete nahrávky všech streamů, odkazy na zdroje a build hry.

    Obsah po částech

    1. Spouštíme a plánujeme projekt. Vytváříme ovládání a chování postavy.
    2. Začněme vytvářet inventární systém.
    3. Pokračujeme v budování základny inventárního systému.
    4. Připravujeme základnu pro výstroj a zbraně.
    5. Práce na zbraních a používání nábojnic.
    6. Provádíme automatické střílení a míření.
    7. Vytvoření základního crafting systému.
    8. Běh, recyklace věcí a jejich opotřebení.
    9. Realizujeme přebíjení zbraní.
    10. Výroba zbraní na blízko.
    11. Dokončíme mele a uděláme žebřík, po kterém můžete vylézt.
    12. Vyrábíme interaktivní předměty: Dřevo, kámen, keře.
    13. Vytvoříme HUD a začneme vytvářet rozhraní pro inventář.
    14. Pokračujeme v práci na rozhraní inventáře. Vytváříme buňky s objekty.
    15. Pokračujeme ve generování buněk a hledání místa pro položku. Přidávání stránek inventáře.
    16. Provedeme malou interakci s předměty v inventáři a okno s podrobnými informacemi.
    17. Udělal Drag&Drop přetahování předmětů přes inventář a do jiného inventáře.
    18. Tato část je o vizualizaci craftingu.
    19. Vytvoříme okno s volbou počtu položek ze zásobníku pro převod do jiného inventáře.
    20. Vytváříme podporu pro různé craftingové recepty a také opravujeme různé chyby v inventáři.
    21. Vytváříme systém pro změnu dne a noci a také vytváříme novou scénu pro náš projekt.
    22. Začínáme vytvářet AI pro agresivní roboty.
    23. Děláme útok na moby, stejně jako reakci na útok. Navíc realizujeme sběr kořisti od mrtvých davů.
    24. Vytváříme spawn zónu pro NPC. Přidáváme také generování náhodných předmětů v inventáři.
    25. Aktualizujeme na 4.13 a také vyrábíme agresivní NPC na velký dosah.
    26. Přidání různých prvků do HUD. Přidání ručního nabíjení zbraně.
    27. Dokončujeme podporu pro skeleton oblečení a klobouky. Přidání animace pro zbraně v první osobě.
    28. Vytváříme rozhraní pro práci s naším systémem zařízení.
    29. Začínáme vytvářet obchodní systém a komponentu pro správu peněz.
    30. Pokračujeme v obchodování vytvářením a přizpůsobením obchodní komponenty.
    31. Zrušíme obchod a také nastavíme animaci opětovného načtení.
    32. Vytváříme vozidlo s vlastním inventářem, světlomety a přepínáním pohledu. Vytváříme baterku.
    33. Vytváříme konstrukci (nebo spíše systém umisťování předmětů před nás).
    34. Vyrábíme rozhraní pro stavbu, vyrábíme vazbu na stěny.
    35. Vyrábíme několik dalších typů konstrukcí: Stan, postel, židle, stůl, lampa, dveře. hrudník, oheň.
    36. Přidejte střechu a okna. Dokončujeme zarovnání vzhledem k ostatním konstrukcím.
    37. Vytvoříme malou osadu a také ji zaplníme NPC, které také vytvoříme v této lekci.
    38. Začínáme vytvářet systém dialogu pro naše obyvatele.
    39. Nastavení mlhy a následného zpracování. Importujeme model zombie a přizpůsobujeme jeho animace.
    40. Dokončujeme dialogový systém.
    41. Provádíme interakci s předměty od třetí osoby, stejně jako modifikátory pro brnění.
    42. Vytváříme hlavní menu, menu pauzy a nastavení grafiky. Také dáváme dohromady první build hry.
    43. Implementujeme plán pro jedinečné obyvatele A také proto, aby městská NPC utekla před útoky.
    44. Do inventáře přidáváme kontextové menu a také opravujeme některé chyby v našem inventáři.
    45. Přidáváme zpětný ráz, roztažení, animaci výstřelu a možnost zásahu střelnými zbraněmi.
    46. Dokončíme agresivní a městská NPC a opravíme různé chyby s nimi spojené.
    47. Nastavení animací pro hlavní postavu. Přidání různého oblečení.
    48. Opravujeme různé chyby v naší hře.
    49. Opravujeme různé chyby ve výrobě, NPC a vybavení v naší hře.
    50. Mapu trochu dokončujeme a dáváme dohromady nejnovější sestavení.