Import 3D modelů do Unreal Engine 4
Tato práce se zabývá vývojem zásuvného modulu, který bude zajišťovat import 3D modelů z RESTFull API do Unreal Engine 4.
- Komunikace s RESTFull API
- Práce je ukázkou práce s blueprinty
![SetJsonHeader](img/SetJsonHeader.png)
link na zdroje https://gitlab.fit.cvut.cz/vmck/htc-vive/runtime-import-plugin
Pro vytvoření pluginu je potřeba mít vytvořený Unreal Engine projekt. V tomto tutoriálu budeme probírat pouze vývoj skrze c projekt. Pro blueprint projekt není však postup příliš odlišný, pouze nám nenabízí možnosti psaní c kódu. Možnost c++ projektu si můžeme vybrat při vytváření nového projektu zde.
![image1](img/image1.png)
Společně s projektem by se mělo otevřít i Visual Studio, ve kterém bude probíhat případné psaní kódu.
![image2](img/image2.png)
My však přejdeme opět do projektu v Unreal Engine a otevřeme okno s pluginy. Okno otevřeme v levém horním rohu následovnně Edit→Plugins.
![image3](img/image3.png)
Dále je potřeba kliknout na tlačítko “New Plugin” nacházející se v pravém dolním rohu nového okna.
![image4](img/image4.png)
Tímto se nám otevře okno, kde budeme nuceni vyplnit název a určit šablonu vytvářeného pluginu. V našem případě se plugin nazývá “Plugin_tutorial” a vybereme si šablonu content only. Tato šablona se hodí pokud chceme vytvářet plugin pomocí blueprint, protože nám znemožní psát kód a zpřístupní nám pouze složku content. V této contect složce lze následně vytvářet blueprint třídy.
![image5](img/image5.png)
Výše zmíněné atributy jsou potřeba vyplnit naprosto vždy. Unreal Engine však nabízí k vyplnění také informace jako je jméno autora, popis našeho pluginu, webovou stránku autora atd, které jsou dobrovolné.
![image6](img/image6.png)
Po úspěšném vyplnění všech atributů je čas kliknout na tlačítko Create Plugin
![image7](img/image7.png)
Po kliknutí na tlačítko Create Plugin se objeví v Content Browser Content složka našeho pluginu
![image8](img/image8.png)
Ve Visual studiu zase můžeme vidět složku našeho pluginu pod složkou Plugins. Protože jsme zvolili šablonu content only. Obsahuje složka pouze konfigutační soubor .uplugin a složku Resources, do které se umisťuje například ikona pluginu. V případě zvolení jiné šablony by se zde nacházela i složka Source, do které se vkládají c++ kódy.
![image9](img/image9.png)
Nyní lze začít s vývojem funkcionalit pluginu. Nejprve se podíváme na tvar konfiguračního souboru. Pokud jsme zvolili šablonu content only, měl by být konfigurační soubor v následujícím tvaru.
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "Plugin_tutorial",
"Description": "",
"Category": "Other",
"CreatedBy": "",
"CreatedByURL": "",
"DocsURL": "",
"MarketplaceURL": "",
"SupportURL": "",
"CanContainContent": true,
"IsBetaVersion": false,
"IsExperimentalVersion": false,
"Installed": false
}
Pokud využíváme k vývoji i c++, rozšíří se konfigurařní soubor o kolonku:
"Modules": [],
ve které je třeba zmínit veškeré moduly Unreal engine, které bude náš plugin využívat.
Pokud pak chceme aby náš plugin využíval jiné pluginy, je možné přidat do konfiguračního souboru kolonku:
"Plugins": [],
do té pak můžeme napsat název pluginu a zdali ho chceme aktivovat. Unreal engine pak prohledá plugin složky projektu a enginu a pokud v některé najde plugin s vyplněným jménem, automaticky ho v projektu aktivuje. Kdybychom tedy chtěli náš plugin využít v některém jiném pluginu, napsali bychom:
"Plugins": [
{
"Name": "Plugin_tutorial",
"Enabled": true
}
]
Pro samotnou funkcionalitu je v rámci blueprint vývoje nejdůležitější pak content složka pluginu. V této složce pak lze v Unreal engine editoru vytvářet blueprint třídy, stejně jako v normálním projektu.
K vytvoření nové blueprint třídy je důležité se ujistit, že se nacházíme v content složce pluginu. Pak je nunté kliknout na tlačítko Add new a vybrat Blueprint class.
![image12](img/image12.png)
Ze zobrazené nabídky je pak nutné si vybrat typ blueprint třídy, my si vybereme Actor. Jedná se o základní třídu, kterou lze umístit do scény.
![image13](img/image13.png)
Po vytvoření blueprint třídy na ní dvakrát klikneme, aby se otevřela. Nejdůležitější pro funkcionalitu je pak event graph.
![image14](img/image14.png)
Po tomto úvodu se podíváme na příklad pluginu, který využívá pluginy VaRest a RuntimeMeshLoader k runtime importu modelů do Unreal Engine. Takto vypadá konfigurační soubor:
{
"FileVersion": 3,
"Version": 1,
"VersionName": "1.0",
"FriendlyName": "RuntimeImportPlugin",
"Description": "",
"Category": "Other",
"CreatedBy": "Tadeas Busek",
"CreatedByURL": "",
"DocsURL": "",
"MarketplaceURL": "",
"SupportURL": "",
"CanContainContent": true,
"IsBetaVersion": false,
"IsExperimentalVersion": false,
"Installed": false,
"Modules": [],
"Plugins": [
{
"Name": "VaRest",
"Enabled": true
},
{
"Name": "RuntimeMeshLoader",
"Enabled": true
}
]
}
Plugin se skládá z vícero uživatelských rozhraní a dalších komponent. Uživatelské rozhraní je možné vytvořit podobně jako blueprint třídu, pouze je nutné vybrat widget blueprint.
![image15](img/image15.png)
Widget se liší od normální blueprint třídy možností vytvářet design. Po otevření widgetu se zobrazí designer, do kterého lze z paletty vlevo přidávat grafické komponenty. Nové komponenty se pak mohou přidávat pod již vytvořené komponenty a tím vytvářet složitější struktury. V příkladu níže je do designeru přidán button, pod button je pak přidán text.
![image16](img/image16.png)
Funkcionalita přidaných grafických komponent je pak možná upravovat v event graphu. V event graphu můžeme vytvářet proměnné, funkce, eventy a další věci. Proměnné se nacházejí vlevo a jsou schopny uchovávat různorodé informace. Mezi tyto informace patří i instance, či reference na námi vytvořené blueprint třídy.
![image17](img/image17.png)
Pokud některou z proměnných zvolíme, můžeme dále upravovat její atributy. Například jméno, typ, jestli je možné jí editovat, či jestli se zobrazí při vytváření nové instance. Z proměnné je pak také možné udělat pole, množinu, či mapu.
![image18](img/image18.png)
Vytvořené proměnné je možné přetáhnutím do event graphu nastavovat, či číst.
![image19](img/image19.png)
Obrázek výše například při eventu, který nastane při vytvoření, nastaví text v komponentě name na referenci na sebe (převedenou na text). Komponenta name je vytvořená v designeru a jedná se o text u kterého bylo vybráno, že je to proměnná.
![image20](img/image20.png)
Druhá část obrázku výše při eventu stisknutí tlačítka provede funkci Load Model from Memory se vstupními parametry reference na sebe a reference na rodiče. Event pro stisknutí je pak vytvořen pomocí tlačítka vytvořeného v designeru. Po vybrání této komponenty je možné v pravo kliknout na plus, které přidá požadovaný event do event graphu.
![image21](img/image21.png)