From 7fde56bcb8ba2121e12f312cedcf2a742a17e6e2 Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Tue, 20 May 2025 07:50:33 +0200 Subject: [PATCH] interactables --- ch2.tex | 28 +++++++++++++++++++++------- img/InteractableSystemDiagram.pdf | Bin 0 -> 32594 bytes 2 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 img/InteractableSystemDiagram.pdf diff --git a/ch2.tex b/ch2.tex index a3c14b8..531ef9f 100644 --- a/ch2.tex +++ b/ch2.tex @@ -13,6 +13,8 @@ Přenos byl~odůvodněn převážně malou velikostí starého projektu a~taky l \end{itemize} Samozřejmě je~toho daleko víc, ale~většina ostatních vylepšení jako~například nový systémy animací postav Motion Matching\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/motion-matching-in-unreal-engine} nebo~nový fyzikální engine Chaos\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/destruction-overview} neměli vliv na~rozhodnutí. +Podrobné informace jak každá implementace funguje a jak vývojaři s ní pracovat jsou popsané v programatorské dokumentaci. + \section{Herní logika a systémy} \subsection{Architektura} Protože Unreal Engine byl na začátku vývíjen primárně pro online multiplayer hru Unreal Tournament a dnes stejně tak vyvíjen spolu s extremně velkou online multiplayer hrou Fortnite, je backend enginu dost abstraktní. @@ -26,26 +28,38 @@ Jen pro představu co obnaší klasické ziskání reference na instanci vlastn \subsection{Scény a ukládání hry} Scény resp. levely (třídy UWorld a ALevelScriptActor)\footnote{UWorld instance je přímo celý svět, který funguje jako balík metadat a kontejner pro veškeré instancované objekty v něm. ALevelScriptActor je objekt instancovaný v UWorld automaticky a obsahuje uživatelskou logiku světa.} taktéž lze získat v podobě singletonu. Základní implementace byla rozšířená pro high level mechanismus volání událostí ve scéně. Ten je za potřebí například, když hráč aktivuje spínací plošinu ve hře a ta následně otevře dveře. Narozdíl od jiných enginů, v UE objekty ve světě nemůžou referencovat jiné nezávislé objekty. Jednoduše referenci nejde přiřadít z důvodu abstrakce popsané v předchozí podsekci, protože každý objekt může mít vlastní herní svět (a nejen to). Proto pokud plošina z našeho príkladu chce otevřít dveře, musí zkusit poslat požádavek správcí herního světa, ten požadavek se nějak zpracuje a jen potom správce buď provede akci otevírání dveří samostatně nebo zavolá odpovidající funkci v instanci objektu. Pokud by byla potřeba zbavit se použití singleton architektury pro podporu paralelní existenci světů, stači předělat member funkci instance světa na statický multicast delegate\footnote{Delegate jsou obaly na C++ funkce, lambdy, funkce s reflexi a funkce z Blueprintu. Delegate může být typu single, pro uložení reference na jednou funkci, nebo multicast pro uložení dynamického seznamu funkcí. Podrobněji jsou popsané v programatorské dokumentaci.}, ke kterému se každý svět při konstrukci bude vázat. -Navíc hra byla rozšířena o implementaci obnovení hry z úložených dat. Při návrhu byla snaha udělat postup nejvíc triviální. Hru ukládá globální herní instance (třída GameInstance)\footnote{GameInstance je první objekt vytvořený enginem hned po úvodním načtení základu enginu a taky poslední objekt na destrukci při vypínání hry.} při vypínání hry a načíta taktéž při spouštění. Využit byl existující v UE systém serializace, který ukládá inventař postavy, jmeno levlu a checkpoint na něm spolu s posledním stavem levlu. Podrobný proces obnovení uložené hry a práce se serializací je popsan v programatorské dokumentaci. +Navíc hra byla rozšířena o implementaci obnovení hry z úložených dat. Při návrhu byla snaha udělat postup nejvíc triviální. Hru ukládá globální herní instance (třída GameInstance)\footnote{GameInstance je první objekt vytvořený enginem hned po úvodním načtení základu enginu a taky poslední objekt na destrukci při vypínání hry.} při vypínání hry a načíta taktéž při spouštění. Využit byl existující v UE systém serializace, který ukládá inventař postavy, jmeno levlu a checkpoint na něm spolu s posledním stavem levlu. \subsection{Interakce} Interakce jsou často řešeny pomoci architektury interface tříd\footnote{Interface třídy jsou konkurenčním přístupem komponentní architektuře. Interface je běžná praktika v OOP, která funguje jako domluva, že objekt bude obsahovat určité member funkce. Komponentny jsou samostatné určité podinstance objektu. Komponentní přístup se osvědčuje jako intuitivnější a více flexibilní zatímco Interface přístup při vývoji her je spíše nepřijemné vynucení ze světu OOP.} především kvůli populárním návodům vyzdvihující tuto metodu jako nejlepší ještě z doby, kdy jen vzníkal Unreal Engine 4. Nevýhodou je potřeba v obsáhlem a repetetivním nastavení každeho objektu, který chceme zapojit do mechaniky interakce. -Byla navržena celá třída pro kompletní spravu každého intekačního objektu a komponent. Objekt dědicí třídu AInteractable při instancování samostatně nastaví a následně přepína potřebné kolize. Navíc spravuje interakční komponenty a reaguje na požadavky k ním. Komponenty se dělí na aktivatory a modifikatory. - -\paragraph{AInteractableActivator} Aktivatory jsou komponenty s úrčitými mechanismy detekce objektů. Instance hráče automaticky vytváří pro sebe jednu podinstanci každého aktivatoru zaregistrovaného v enginu. Libovolný objekt taky může obsahovat libovolný aktivator. Podrobně o aktivatorech je popsano v dokumentaci. Práce obsahuje klasický způsob detekce objektů pomoci raytracingu a castu objektu v případě nárazu paprsku. - -Navíc je k dispozici detekce objektů v zornem poli hráče. Ta funguje na zpomaleném snímání určité stencil vrstvy s vynecháním většiny render pipliny a v malém rozlišení. Zachycený snímek obsahuje pouze viditelné hráčem interakční objekty v podobě masky. Nasledně maska v grafickém vlakně je zpracovaná pomocí algoritmu vyhledávání komponent z počítačového vidění, kterou poskytuje kníhovna OpenCV. Nakonec na nalezené komponenty se promítné paprsek a zachytí objekt (viz. výsledek \Cref{fig:InteractableScreenCapture}). Původně +Byl navržen kompletní systém pro spravu každého interačního objektu a komponent (viz.\Cref{fig:InteractableSystemDiagram}). Objekt dědicí třídu AInteractable při instancování samostatně nastaví a následně přepína potřebné kolize. Navíc spravuje interakční komponenty a reaguje na požadavky k ním. Komponenty se dělí na aktivatory a modifikatory. \begin{figure} \centering \includegraphics[width=1\linewidth]{img/InteractableScreenCapture.pdf} -\caption{.} +\caption{Debug náhled aktivace interakčních objektů v zornem poli hráče.} \label{fig:InteractableScreenCapture} \end{figure} +\paragraph{AInteractableActivator} Aktivátory jsou komponenty s úrčitými mechanismy detekce objektů. Instance hráče automaticky vytváří pro sebe jednu podinstanci každého aktivatoru zaregistrovaného v enginu. Libovolný objekt taky může obsahovat libovolný aktivator. Práce obsahuje klasický způsob detekce objektů pomoci raytracingu a castu objektu v případě nárazu paprsku. + +Navíc je k dispozici detekce objektů v zornem poli hráče. Ta funguje na zpomaleném snímání určité stencil vrstvy s vynecháním většiny render pipliny a v malém rozlišení. Zachycený snímek obsahuje pouze viditelné hráčem interakční objekty v podobě masky. Nasledně maska v grafickém vlakně je zpracovaná pomocí algoritmu vyhledávání komponent z počítačového vidění, kterou poskytuje kníhovna OpenCV. Nakonec do středu nalezených komponent se promítné paprsek a zachytí objekty (viz. \Cref{fig:InteractableScreenCapture}). Původně bylo předpokládáno využití HLSL compute shaderu pro vyhledání komponent v textuře, ale z časových důvodu jsem nedodělal přenos dat mezi CPU a GPU, jelikož dohledat dokumentaci o použití shaderu je dost náročné. Proto aktuální vyhledávání komponent je spouštěno na procesoru a v renderovacím vlakně na moderních zařízeních trvá pět až deset milisekund. + +\begin{figure} +\centering +\includegraphics[width=1\linewidth]{img/InteractableScreenCapture.pdf} +\caption{Debug náhled aktivace interakčních objektů v zornem poli hráče.} +\label{fig:InteractableScreenCapture} +\end{figure} + +\paragraph{AInteractableModificator} Modifikátory jsou komponenty s úrčitou logikou libovolné modifikace objektu, ve kterém jsou instancovány. Tyto komponenty mohou obsahovat pouze objekty označené jako interakční (dědí třídu interákčního objektu). Aktuální implementace nabízí modifikátory pro aktivaci nějaké události pomoci dosahu ,,ruky'' nebo zahlednutím ,,očí'' hráče, pohyb a rotace předmětu v prostoru, ukládání předmětu do inventáře hráče. Z časových důvodu byla zamítnuta implementace modifikace meshe objektu, která by využivala nového rozhraní Chaos. + +Právě u modifikátorů nejvíc přispěl nový system vstupu pro Unreal Engine 5. Modifikatory využívájí možnosti přidávání resp. odstranění kontextů vstupu za běhu. \subsection{Cutscény} + + \subsection{Quick Time Eventy} \subsection{Dialogy} \subsection{Minihry} diff --git a/img/InteractableSystemDiagram.pdf b/img/InteractableSystemDiagram.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3e3cf9c348694628b73665a4d6f7f9e0c2b03412 GIT binary patch literal 32594 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 literal 0 HcmV?d00001