From 870dfa9a2d5cfeb6f91da3e6c8d661159548f417 Mon Sep 17 00:00:00 2001 From: Oleg Petruny Date: Mon, 19 May 2025 22:09:17 +0200 Subject: [PATCH] wip --- ch2.tex | 142 ++++++++++++------------------ img/InteractableScreenCapture.pdf | Bin 0 -> 37712 bytes refs.bib | 60 ------------- 3 files changed, 56 insertions(+), 146 deletions(-) create mode 100644 img/InteractableScreenCapture.pdf diff --git a/ch2.tex b/ch2.tex index 99a0da8..a3c14b8 100644 --- a/ch2.tex +++ b/ch2.tex @@ -1,103 +1,73 @@ -\chapter{More complicated chapter} -\label{chap:math} +\chapter{Vývoj hry} +\label{chap:main} -After the reader gained sufficient knowledge to understand your problem in \cref{chap:refs}, you can jump to your own advanced material and conclusions. +Přenos starého projektu na~další major verzi~UE nebyl nijak problematický, dokonce v~editoru je~možnost rychlého exportu assetů do~jiného projektu. Rozhodně tomu pomohlo, že~se~C++~kód nepřenášel, ale~napsal znovu. UE~citelně rozšířil seznam dostupných tříd, ale~zaroveň některé jsou~již deprecated nebo~odstraněny úplně. Tak~například byly~odstraněny třídy Matinee (bývalý format animací pohybu objektů) pro~podporu novejší třídy Sequencer nebo~starý PhysX rozhraní (Fyzický engine), které~je nahrazeno systémem Chaos. Přesto se~něco pokazilo při~exportu objektů s~dynamickou fyzikou (závěsy, které~reagují na~simulaci větru, se~museli předělat). -You will need definitions (see \cref{defn:x} below in \cref{sec:demo}), theorems (\cref{thm:y}), general mathematics, algorithms (\cref{alg:w}), and tables (\cref{tab:z})\todo{See documentation of package \texttt{booktabs} for hints on typesetting tables. As a main rule, \emph{never} draw a vertical line.}. \Cref{fig:f,fig:g} show how to make a nice figure. See \cref{fig:schema} for an example of TikZ-based diagram. Cross-referencing helps to keep the necessary parts of the narrative close --- use references to the previous chapter with theory wherever it seems that the reader could have forgotten the required context. Conversely, it is useful to add a few references to theoretical chapters that point to the sections which use the developed theory, giving the reader easy access to motivating application examples. +Přenos byl~odůvodněn převážně malou velikostí starého projektu a~taky lákavou nabídkou nových technologií zejména Nanite a~Lumen. Navíc pátá verze Unrealu -- přesněji verze~5.5 -- přinesla značná vylepšení jako: +\begin{itemize} +\item Nový systém zpracování vstupu Enhanced Input\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/enhanced-input-in-unreal-engine}. Místy má~příliš mnoho objektové abstrakce, ale~rozhodně velký krok vpřed. Umožňuje snadné dynamické přepínání různých sad ovládání (multiplayer hry, gameplay/menu), dynamické modifikátory a~spouštěče vstupu (změna senzitivity, víceklik, podržení tlačítka určitou dobu), podpora vstupu více než~jedné periferie naraz a~podpora přeřazení vstupu (např.~změna tlačítka odpovídající za~skok herní postavy). Předtím tohle a~spoustu dalšího se~muselo naprogramovat ručně. +\item Podporu vektorové grafiky v~UI. Veškeré staré UI~elementy byly~tvořeny pomocí základních vektorových obdélníkových tvarů práve proto, aby~se~vyhnulo použití rastrové grafiky, která~je~hodně závislá na~rozlišení. Aktuálně všechny UI~elementy jsou tvořeny ještě starou metodou, pro~udržení konzistentního vzhledu. Dnes bychom určitě využili této~možnosti. +\item Přepracované vykreslování textů -- rychlejší vykreslování a~efektivnější využití paměti. +\item MetaSound\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/metasounds-the-next-generation-sound-sources-in-unreal-engine} pro~přehrávaní nebo procedurální generování zvuků, který~nahrazuje starou třídu~Cue. De-facto se~jedná o~Digital Signal Processing (DSP) grafový engine a~editor. Bohůžel jsem nestihl tento nastroj využit v~práci. +\item World partition systém\footnote{https://dev.epicgames.com/documentation/en-us/unreal-engine/world-partition-in-unreal-engine} který~dokáže automaticky rozdělit jeden velký svět na~streamovací kousky a~propojit sdílení dat mezi nimi i~při multiplayer hře přes internet. Taky není využit v~této práci. +\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í. -\section{Example with some mathematics} -\label{sec:demo} +\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í. -\begin{defn}[Triplet]\label{defn:x} -Given stuff $X$, $Y$ and $Z$, we will write a \emph{triplet} of the stuff as $(X,Y,Z)$. -\end{defn} +Například tak každý svět musí obsahovat vlastní game mode (třída AGameMode), který funguje jako správce dáneho světu -- přestože svět se může spravovát sám. Veškerá funkcionalita používaná v singlplayer hrách mohla by být přímo v kódu levelu nebo v globální instanci celé hry. Důvodem teto abstrakce je právě nativní podpora multiplayer her, která potom vývoj takových her zjednodušuje. -\newcommand{\Col}{\textsc{Colour}} +Protože tento projekt je zaměřen pro hru jednoho hráče, práce je často programováná navzdory ustaleným UE C++ guidelines pro pohodlí a rychlost vývoje. Proto často třídy managerů systémů, game modů, instance hráče a další jsou na architektuře singletonu. Šetří od tří do desetí různých volání getteru, castu reflexe, vyhledávání v hash tabulkach a iteraci polí v každém místě použití. Přesto nemá žádný vliv na stabilitu programu a dokonce šetří výkonem zařízení. -\begin{thm}[Car coloring]\label{thm:y} -All cars have the same color. More specifically, for any set of cars $C$, we have -$$(\forall c_1, c_2 \in C)\:\Col(c_1) = \Col(c_2).$$ -\end{thm} +Jen pro představu co obnaší klasické ziskání reference na instanci vlastní třídy hráče na pozadí. GetGameMode() \textrightarrow GetPlayerController(index) \textrightarrow GetPlayerPawn() \textrightarrow Cast(). A blueprinty disponují zkrácenou verzí GetPlayerPawn(index) \textrightarrow Cast(). V případě C++ je potřeba navíc ověřovat zda nějaké z volání nevratílo nullptr. -\begin{proof} -Use induction on sets of cars $C$. The statement holds trivially for $|C|\leq1$. For larger $C$, select 2 overlapping subsets of $C$ smaller than $|C|$ (thus same-colored). Overlapping cars need to have the same color as the cars outside the overlap, thus also the whole $C$ is same-colored.\todo{This is plain wrong though.} -\end{proof} +\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. -\begin{table} -% uncomment the following line if you use the fitted top captions for tables -% (see the \floatsetup[table] comments in `macros.tex`. -%\floatbox{table}[\FBwidth]{ -\centering\footnotesize\sf -\begin{tabular}{llrl} -\toprule -Column A & Column 2 & Numbers & More \\ -\midrule -Asd & QWERTY & 123123 & -- \\ -Asd qsd 1sd & \textcolor{red}{BAD} & 234234234 & This line should be helpful. \\ -Asd & \textcolor{blue}{INTERESTING} & 123123123 & -- \\ -Asd qsd 1sd & \textcolor{violet!50}{PLAIN WEIRD} & 234234234 & -- \\ -Asd & QWERTY & 123123 & -- \\ -\addlinespace % a nice non-intrusive separator of data groups (or final table sums) -Asd qsd 1sd & \textcolor{green!80!black}{GOOD} & 234234299 & -- \\ -Asd & NUMBER & \textbf{123123} & -- \\ -Asd qsd 1sd & \textcolor{orange}{DANGEROUS} & 234234234 & (no data) \\ -\bottomrule -\end{tabular} -%}{ % uncomment if you use the \floatbox (as above), erase otherwise -\caption{An example table. Table caption should clearly explain how to interpret the data in the table. Use some visual guide, such as boldface or color coding, to highlight the most important results (e.g., comparison winners).} -%} % uncomment if you use the \floatbox -\label{tab:z} -\end{table} +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. + +\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ě \begin{figure} \centering -\includegraphics[width=.6\linewidth]{img/ukazka-obr02.pdf} -\caption{A figure with a plot, not entirely related to anything. If you copy the figures from anywhere, always refer to the original author, ideally by citation (if possible). In particular, this picture --- and many others, also a lot of surrounding code --- was taken from the example bachelor thesis of MFF, originally created by Martin Mareš and others.} -\label{fig:g} +\includegraphics[width=1\linewidth]{img/InteractableScreenCapture.pdf} +\caption{.} +\label{fig:InteractableScreenCapture} \end{figure} -\begin{figure} -\centering -\tikzstyle{box}=[rectangle,draw,rounded corners=0.5ex,fill=green!10] -\begin{tikzpicture}[thick,font=\sf\scriptsize] -\node[box,rotate=45] (a) {A test.}; -\node[] (b) at (4,0) {Node with no border!}; -\node[circle,draw,dashed,fill=yellow!20, text width=6em, align=center] (c) at (0,4) {Ugly yellow node.\\Is this the Sun?}; -\node[box, right=1cm of c] (d) {Math: $X=\sqrt{\frac{y}{z}}$}; -\draw[->](a) to (b); -\draw[->](a) to[bend left=30] node[midway,sloped,anchor=north] {flow flows} (c); -\draw[->>>,dotted](b) to[bend right=30] (d); -\draw[ultra thick](c) to (d); -\end{tikzpicture} -\caption{An example diagram typeset with TikZ. It is a good idea to write diagram captions in a way that guides the reader through the diagram. Explicitly name the object where the diagram viewing should ``start''. Preferably, briefly summarize the connection to the parts of the text and other diagrams or figures. (In this case, would the tenative yellow Sun be described closer in some section of the thesis? Or, would there be a figure to detail the dotted pattern of the line?)} -\label{fig:schema} -\end{figure} +\subsection{Cutscény} +\subsection{Quick Time Eventy} +\subsection{Dialogy} +\subsection{Minihry} +\subsection{Nehratelné postavy} +\subsection{API načítání nového obsahu za běhu} +\subsection{Nastavení} -\begin{algorithm} -\begin{algorithmic} -\Function{ExecuteWithHighProbability}{$A$} - \State $r \gets$ a random number between $0$ and $1$ - \State $\varepsilon \gets 0.0000000000000000000000000000000000000042$ - \If{$r\geq\varepsilon$} - \State execute $A$ \Comment{We discard the return value} - \Else - \State print: \texttt{Not today, sorry.} - \EndIf -\EndFunction -\end{algorithmic} -\caption{Algorithm that executes an action with high probability. Do not care about formal semantics in the pseudocode --- semicolons, types, correct function call parameters and similar nonsense from `realistic' languages can be safely omitted. Instead make sure that the intuition behind (and perhaps some hints about its correctness or various corner cases) can be seen as easily as possible.} -\label{alg:w} -\end{algorithm} +\section{Grafika} +\subsection{Statické objekty} +\subsection{Dynamické a procedurální objekty} +\subsection{Osvětlení, efekty, Post-Processing} +\subsection{Materiály a shadery} +\subsection{UI} +\subsection{Načítací obrazovka} +\subsection{Textové překlady} -\section{Extra typesetting hints} +\section{Audio} +\subsection{Kategorie a parametry audio assetů} +\subsection{Dynamický hudební doprovod} -Do not overuse text formatting for highlighting various important parts of your sentences. If an idea cannot be communicated without formatting, the sentence probably needs rewriting anyway. Imagine the thesis being read aloud as a podcast --- the storytellers are generally unable to speak in boldface font. - -Most importantly, do \underline{not} overuse bold text, which is designed to literally \textbf{shine from the page} to be the first thing that catches the eye of the reader. More precisely, use bold text only for `navigation' elements that need to be seen and located first, such as headings, list item leads, and figure numbers. - -Use underline only in dire necessity, such as in the previous paragraph where it was inevitable to ensure that the reader remembers to never typeset boldface text manually again. - -Use \emph{emphasis} to highlight the first occurrences of important terms that the reader should notice. The feeling the emphasis produces is, roughly, ``Oh my --- what a nicely slanted word! Surely I expect it be important for the rest of the thesis!'' - -Finally, never draw a vertical line, not even in a table or around figures, ever. Vertical lines outside of the figures are ugly. +\section{Tipy při vývoji v UE} +\paragraph{Skripty pro editor} +% Blueprunty a python +\paragraph{C++ typy a reflexe} +\paragraph{Kompilace a export projektu} diff --git a/img/InteractableScreenCapture.pdf b/img/InteractableScreenCapture.pdf new file mode 100644 index 0000000000000000000000000000000000000000..511c0f52fe90f0f50da3c4da197da75bc3a3cc1a GIT binary patch literal 37712 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 e;Am?OIaP&@h%Dx|}Z+JWYb!x`8O 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 N7N)$as;>TSTmZS(77hRa literal 0 HcmV?d00001 diff --git a/refs.bib b/refs.bib index edffd3c..9f4bf55 100644 --- a/refs.bib +++ b/refs.bib @@ -35,63 +35,3 @@ year = 2023, note = {[cit. 2025-04-01]. Dostupné z: \url{https://alfredbaudisch.com/blog/gamedev/godot-engine/godots-3d-confusing-workflow-inconsistencies-conflicting-behaviours-and-annoyances/}} } - - -@book{knuth1979tex, - title={TEX and METAFONT: New directions in typesetting}, - author={Knuth, Donald Ervin}, - year={1979}, - publisher={American Mathematical Society} -} - -@book{lamport1994latex, - title={LATEX: a document preparation system: user's guide and reference manual}, - author={Lamport, Leslie}, - year={1994}, - publisher={Addison-Wesley} -} - -@book{glasman2010science, - title={Science research writing for non-native speakers of English}, - author={Glasman-Deal, Hilary}, - year={2010}, - publisher={World Scientific} -} - -@book{sparling1989english, - title={English or Czenglish? Jak se vyhnout čechismům v angličtině}, - author={Sparling, Don}, - year={1989}, - publisher={Státní pedagogické nakladatelství} -} - -@book{tufte1990envisioning, - title={Envisioning information}, - author={Tufte, Edward R and Goeler, Nora Hillman and Benson, Richard}, - year={1990}, - publisher={Graphics press Cheshire, CT} -} - -@book{tufte1983visual, - title={Visual display of quantitative information}, - author={Tufte, Edward R}, - year={1983}, - publisher={Graphics press Cheshire, CT} -} - -@book{wilke2019fundamentals, - title={Fundamentals of Data Visualization}, - author={Wilke, Claus O}, - year={2019}, - publisher={O'Reilly Media, Inc.}, - url={https://clauswilke.com/dataviz/}, - isbn={9781492031086} -} - -@techreport{tantau2015tikz, - title={The TikZ and PGF Packages (Manual for version 3.1.8b)}, - author={Tantau, Till}, - year={2020}, - institution={Institut f{\"u}r Theoretische Informatik Universit{\"a}t zu L{\"u}beck}, - url={http://mirrors.ctan.org/graphics/pgf/base/doc/pgfmanual.pdf} -}