{"id":2654,"date":"2020-07-01T22:18:00","date_gmt":"2020-07-01T20:18:00","guid":{"rendered":"https:\/\/davidlebech.com\/thoughtflow\/?p=2654"},"modified":"2020-07-01T22:39:09","modified_gmt":"2020-07-01T20:39:09","slug":"dipping-the-feet-in-the-game-design-pond","status":"publish","type":"post","link":"https:\/\/davidlebech.com\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/","title":{"rendered":"Dipping the feet in the game design pond"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">For my wife&#8217;s birthday this year, I created a prototype of a small game-like 3D environment that she could &#8220;walk around&#8221; in using the keyboard and mouse. The idea was to have an &#8220;exhibit&#8221; for each year we have known each other, consisting of a few photos from that year as well as a short text describing major events that happened during the year.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unfortunately, I am terrible at planning things and started a bit too late so I did not finish the game in time for the birthday.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">With the help of <a href=\"https:\/\/unity.com\/\">Unity<\/a>, I managed to finish the project eventually. This post is about that journey as well as some observations on Unity and game design in general.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em><strong>Note<\/strong>: I usually make my stuff available online, e.g. on Github. Not this time though. This was a personal thing I created for my wife. I&#8217;m reproducing the images for this blog post with her permission :-)<\/em><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Focus on the content<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The prototype was created for the browser and used <a href=\"https:\/\/threejs.org\/\">three.js<\/a> for most of the 3D stuff. I am a fan of WebGL, and I had some prior experience from working on <a href=\"https:\/\/photo-amaze.appspot.com\/\">Photo Amaze<\/a> and <a href=\"https:\/\/zombie-hugs.herokuapp.com\/\">Zombie Hugs<\/a>, so it seemed like a natural choice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here are two screenshots from the initial prototype:<\/p>\n\n\n\n<figure class=\"wp-block-gallery aligncenter columns-2 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"1021\" height=\"1024\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype1-1021x1024.jpg\" alt=\"\" data-id=\"2670\" data-full-url=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype1.jpg\" data-link=\"https:\/\/davidlebech.com\/thoughtflow\/?attachment_id=2670\" class=\"wp-image-2670\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype1-1021x1024.jpg 1021w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype1-300x300.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype1-150x150.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype1-768x771.jpg 768w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype1.jpg 1200w\" sizes=\"auto, (max-width: 1021px) 100vw, 1021px\" \/><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1017\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype2-1024x1017.jpg\" alt=\"\" data-id=\"2671\" data-full-url=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype2.jpg\" data-link=\"https:\/\/davidlebech.com\/thoughtflow\/?attachment_id=2671\" class=\"wp-image-2671\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype2-1024x1017.jpg 1024w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype2-300x298.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype2-150x150.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype2-768x763.jpg 768w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/game_prototype2.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure><\/li><\/ul><figcaption class=\"blocks-gallery-caption\">Two screenshots from the game prototype, showing a welcome message plus animated model and one of the &#8220;exhibits&#8221; in the game. Cake model by <a href=\"https:\/\/skfb.ly\/6RsDx\">nodoxi<\/a>, <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/\">CC BY<\/a>. The fog and shadows are created by three.js.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">The thick fog was added as a way to limit the initial view and ensure only one piece of text was visible at a time, and the rest was hidden in the fog until the player started moving forward. This fog then cleared up once the first exhibit was reached, making the scene more open.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I found photos for three out of ten exhibits and wrote the initial intro text, but the rest remained unfinished. One reason for this was that I quickly started obsessing over details like shadows and lighting instead of <em>focusing on the core content<\/em>, which was selecting good photos and writing the right text.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Missing the birthday deadline had both good and bad consequences. I was very disappointed and embarrassed that I only had an early prototype to show, but it also allowed me to step back and rethink the project.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beyond the browser<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">An appealing aspect of using three.js is that everything has to be defined in code. This provides a lot of control, but I quickly realized that I was not able to iterate and tweak the experience very fast. I had wanted to get my feet wet with a more full-fledged game engine for a while, so this was a good opportunity to do that.<span id='easy-footnote-1-2654' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/davidlebech.com\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/#easy-footnote-bottom-1-2654' title='I went through Unity&amp;#8217;s &lt;a href=&quot;https:\/\/learn.unity.com\/project\/roll-a-ball-tutorial&quot;&gt;roll-a-ball tutorial&lt;\/a&gt; a few years prior, but none of that knowledge had stuck with me.'><sup>1<\/sup><\/a><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After researching the pros and cons of different game engines as well as experimenting briefly with Unity, <a href=\"https:\/\/www.unrealengine.com\/\">Unreal Engine<\/a>, <a href=\"https:\/\/godotengine.org\/\">Godot<\/a> and <a href=\"https:\/\/www.babylonjs.com\/\">Babylon.js<\/a> (spending way too long trying to make <a href=\"https:\/\/doc.babylonjs.com\/extensions\/fur\">grass out of fur<\/a>), I ended up sticking with Unity, because it has a native Linux editor and good platform support.<span id='easy-footnote-2-2654' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/davidlebech.com\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/#easy-footnote-bottom-2-2654' title='Unreal works on Linux but requires compiling the editor from source. I actually did this and plan on trying it out more in the future, but for various other reasons, it was not a great fit for this project.'><sup>2<\/sup><\/a><\/span><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unity is easy to get started with and includes lots of helpful tools out of the box. For example, I had good initial impressions of the built-in <a href=\"https:\/\/docs.unity3d.com\/Manual\/terrain-UsingTerrains.html\">terrain editor<\/a> and <a href=\"https:\/\/docs.unity3d.com\/Manual\/class-Tree.html\">tree creator<\/a>, and it seemed very easy to set up a basic outdoor environment. The Unity asset store also has a generous offering of free assets, including a ready-made first-person controller which is very handy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Once the surface is scratched though, it becomes apparent that Unity is neither perfect nor complete, and creating games is not easy. Some of the challenges I faced were fun while others were frustrating.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The first (fun) obstacle I came across was creating the photo exhibits.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">3D modeling the photo exhibit<\/h3>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_drawing.jpg\" alt=\"\" class=\"wp-image-2680\" width=\"242\" height=\"372\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_drawing.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_drawing-195x300.jpg 195w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_drawing-97x150.jpg 97w\" sizes=\"auto, (max-width: 242px) 100vw, 242px\" \/><figcaption>Concept art for the &#8220;photo exhibit&#8221;&#8230; I only drew it for this blog post though :-)<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">As you can see in the prototype above, an &#8220;exhibit&#8221; has three wall-like structures with a photo. I wanted the pictures to protrude a bit from the walls, making it look like a white canvas is hanging from the wall, with the photo &#8220;painted&#8221; on top of it. The drawing on the right illustrates the idea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I thought it would be super easy to do this in Unity. Just create two cubes (a canvas cube and a wall cube)<span id='easy-footnote-3-2654' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/davidlebech.com\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/#easy-footnote-bottom-3-2654' title='A cube is a 3D model &lt;a href=&quot;https:\/\/docs.unity3d.com\/Manual\/PrimitiveObjects.html&quot;&gt;primitive&lt;\/a&gt; in Unity and indeed in most other game engines as well.'><sup>3<\/sup><\/a><\/span>, flatten and stretch them a bit, and put them next to each other so they overlap.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Actually, this worked ok, but there were two problems:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>There was a weird flicker where the cubes touched each other.<\/li><li>When adding the photo to the canvas cube, it showed the photo on <em>all<\/em> sides, not just the front.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">I fixed the second problem by putting a &#8220;quad&#8221; &#8212;  a flat surface &#8212; on top of the canvas cube (or rather, <em>next to<\/em> it). The wall structure thus consisted of three 3D objects that were technically separate from each other, and it did not look good. There was still a weird flicker, and it also <em>felt like<\/em> the wrong way to solve the problem.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_unity-544x1024.jpg\" alt=\"\" class=\"wp-image-2683\" width=\"317\" height=\"596\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_unity-544x1024.jpg 544w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_unity-159x300.jpg 159w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_unity-80x150.jpg 80w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_unity.jpg 602w\" sizes=\"auto, (max-width: 317px) 100vw, 317px\" \/><figcaption>Wall structure with photo canvas, created in Unity using two cubes and a quad. There is a flickering artifact at the edge of the photo, framed in red.<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">So I hit an early roadblock: Either I had to define the wall structure programmatically, or I had to make my own 3D model. I opted for the latter choice.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After going through some basic tutorials for <a href=\"https:\/\/www.blender.org\/\">Blender<\/a>, I was able to create the wall structure and learn a thing or two about 3D modeling along the way. This is the result in all its simple glory:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"381\" height=\"708\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_blender.png\" alt=\"\" class=\"wp-image-2684\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_blender.png 381w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_blender-161x300.png 161w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/wall_blender-81x150.png 81w\" sizes=\"auto, (max-width: 381px) 100vw, 381px\" \/><figcaption>Blender render of a wall structure aka. &#8220;photo exhibit&#8221;. I used different colors to indicate that separate materials and textures can be used for different parts of the structure.<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Even though I only did very basic stuff in Blender, it felt like a big win to be able to make basic models. I also created an exhibit sign and a cylinder with one open end (to simulate a tunnel or tube). <a href=\"https:\/\/drive.google.com\/drive\/folders\/1UJiTUObdZgD6EJWr7EicwAFqR-h6Qu0Q?usp=sharing\">All models can be found here<\/a>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Free models are great<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Besides the photos and text, I decided to also create a &#8220;display&#8221; for each exhibit. This consisted of a 3D model or effect that was either a direct or indirect reference to the year the exhibit was for. For example, I used a Big Foot model standing on top of Mt Saint Helens for the year when we visited the area.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/big_foot_helens-1024x576.jpg\" alt=\"\" class=\"wp-image-2703\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/big_foot_helens-1024x576.jpg 1024w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/big_foot_helens-300x169.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/big_foot_helens-150x84.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/big_foot_helens-768x432.jpg 768w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/big_foot_helens.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Big Foot standing on top of a model of Mt Saint Helens erupting.<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Using pre-made models was a fun and easy way to make the exhibits a bit more interesting. It took some time to find the right model, and it sometimes needed tweaking after import, but it gave me the opportunity to include visuals I could not have created on my own.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the record, here is the list of the models I used:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/skfb.ly\/6TBoJ\">2nd &#8211; Restoration \/\/ Mona Mono<\/a> by Ringo Gunther<\/li><li><a href=\"https:\/\/skfb.ly\/6TBov\">15legend<\/a> by Amphivena<\/li><li><a href=\"https:\/\/skfb.ly\/6SxzY\">Bottlenose Dolphin<\/a> by popcornbag<\/li><li><a href=\"https:\/\/skfb.ly\/6TBoM\">Crocigator<\/a> by k0bold<\/li><li><a href=\"https:\/\/skfb.ly\/6TBoD\">Doric Column with material<\/a> by e.g.dev5<\/li><li><a href=\"https:\/\/skfb.ly\/6TAXO\">Flying Island 2<\/a> by guten_morgen<\/li><li><a href=\"https:\/\/skfb.ly\/6TBoK\">Gold Band Ring<\/a> by GetDeadEntertainment<\/li><li><a href=\"https:\/\/skfb.ly\/6ssVt\">Low Poly Jumping Kangaroo<\/a> by sirleech<\/li><li><a href=\"https:\/\/skfb.ly\/6RpCC\">Lowpoly Coronavirus (SARS-CoV-2)<\/a> by tales<\/li><li><a href=\"https:\/\/skfb.ly\/6t9QI\">Mad Cow: Furry road<\/a> by Nours<\/li><li><a href=\"https:\/\/skfb.ly\/6wtDU\">MtHelens_Aug71980<\/a> by SValkan<\/li><li><a href=\"https:\/\/skfb.ly\/6RyS7\">UNICORNISAURUS<\/a> by Freddy Drabble<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">All models are licensed under <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/\">CC BY<\/a> except for MtHelens (<a href=\"https:\/\/creativecommons.org\/licenses\/by-nc-nd\/4.0\/\">CC BY-NC-ND<\/a>) and 15Legend (<a href=\"https:\/\/creativecommons.org\/licenses\/by-nc\/4.0\/\">CC BY-NC<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">All the models were found on <a href=\"https:\/\/sketchfab.com\">Sketchfab<\/a>, an online community with a lot of 3D models available either for free or purchase. It was a nice discovery!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">An extra dimension<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Besides downloading models, I also researched the possibility of adding models to the scene by simply scanning my environment or specific objects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A technique known as <a href=\"https:\/\/en.wikipedia.org\/wiki\/Photogrammetry\">photogrammetry<\/a> makes it possible to turn multiple photos into 3D models. I played around with an open-source tool called <a href=\"https:\/\/github.com\/alicevision\/meshroom\">Meshroom<\/a> which is amazingly simple to work with. Just add a lot of photos from different viewing angles, wait a few hours, and a finished 3D model comes out.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A scan of a birch log from the forest made its way into the scene:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/birch_scan-1024x576.jpg\" alt=\"\" class=\"wp-image-2718\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/birch_scan-1024x576.jpg 1024w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/birch_scan-300x169.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/birch_scan-150x84.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/birch_scan-768x432.jpg 768w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/birch_scan.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Photogrammetry scan of a fallen birch log. The rough\/spiky surface is the result of reducing the model complexity by removing polygons. The light reflections are unnatural but I kept them because they look kind of fun.<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">I did not get outstanding results, but it is worth noting I also just took the photos with my bad phone camera and spent very little time making sure I got good shots from all angles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is mindblowing that it is possible to go from 2D photos to 3D model, and I will definitely revisit photogrammetry again in the future.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Creating fake rain<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A small feature I had fun creating was a super simple rain effect. There are numerous weather system plugins available for Unity (some are free), and there was even a &#8220;hose&#8221; effect available in the standard assets that kind-of did the trick (it simulates spraying water). But I needed a more uniform down-pour, and I <em>really<\/em> just needed something simple.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The effect was created by taking a bunch of small <a href=\"https:\/\/en.wikipedia.org\/wiki\/Particle_system\">particles<\/a>, give them a blue\/white gradient color, apply gravity too them, and that is basically it.<\/p>\n\n\n\n<figure class=\"wp-block-video alignwide\"><video height=\"720\" style=\"aspect-ratio: 1280 \/ 720;\" width=\"1280\" controls src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/rain.webm\"><\/video><figcaption>A simple rain effect using a Unity particle system.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">I reused a texture from a water surface effect in the standard assets to give the raindrops a blue-ish appearance. The tails on the raindrops are automatically created by the particle system when using a render setting called &#8220;stretched billboard&#8221;. A bit of noise was added to the movement of the rain drops, so the rain does not fall straight down but looks slightly more natural and chaotic.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">After playing around with the particle speed and size, I got the right look and feel I wanted. I was expecting this to be much more complicated, so it was a nice surprise when the process was fairly straightforward.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Designing for the player<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The most enjoyable aspect of creating this game-like experience was going through our old photos to find a few that represented each year as well as thinking about the various events that happened throughout the year. It was a nice trip down memory lane.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Although the photos and text tell a story which is sequential in nature, the question was if they necessarily had to be <em>experienced<\/em> sequentially as well.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I considered two ways to handle progression through the game:<\/p>\n\n\n\n<ol class=\"wp-block-list\"><li>Limit the initial environment with something like walls and corridors, guiding the player from exhibit to exhibit.<\/li><li>Make the environment completely open, allowing the player to freely visit each exhibit in any order and with no restrictions.<\/li><\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">The first option, limiting the player, would give me more control over the player&#8217;s movements and the &#8220;narrative&#8221; (if there was such a thing) of the experience, but it also felt like it would constrain the player. This can sometimes be a good technique to control pacing (a lot of games do this), but here it seemed unnecessarily constricting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So I decided to go for 2., the open environment, but I still wanted to provide some guidance to help navigate the scene. I did this by creating a dirt path that leads through the grass between the exhibits. I thought it was a nice, obvious and non-constricting way to guide the player a bit:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"1015\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/topdown_view-1024x1015.jpg\" alt=\"\" class=\"wp-image-2698\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/topdown_view-1024x1015.jpg 1024w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/topdown_view-300x297.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/topdown_view-150x150.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/topdown_view-768x761.jpg 768w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/topdown_view.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Aerial top view showing the entire scene. The player starts in the center. The gray lines are dirt paths that go from exhibit to exhibit.<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/dirt_path_example-1024x576.jpg\" alt=\"\" class=\"wp-image-2700\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/dirt_path_example-1024x576.jpg 1024w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/dirt_path_example-300x169.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/dirt_path_example-150x84.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/dirt_path_example-768x432.jpg 768w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/dirt_path_example.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Example of a dirt path, this one leading between the 1st and 2nd exhibit.<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">During the first 5-60 seconds of the game, the player is presented with the movement keys and the purpose of the game in a series of three welcome messages that show up on the screen as 3D text.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I wanted to be absolutely sure that the player could not miss the information, especially the movement keys. The way I achieved this was to add some constraint to the otherwise open environment at the initial stage of the game.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you look closely at the aerial top view above, you might notice a long green shape at the center of the scene. This is actually a cylinder (or tunnel) floating 50 meters above the ground. The player starts the game inside the tunnel, and can only move forward and backward, ensuring that the information is difficult (but not impossible) to miss.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Furthermore, during the first 1-2 seconds, the camera is actually fixed in place, showing the movement keys while the start menu is fading out.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To make the cylinder\/tunnel slightly more interesting, I painted it a bright green and used a normal map from a tree bark texture to give some resemblance of walking inside of a tree trunk.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When the player steps over the edge of the cylinder, they land near the first exhibit.<span id='easy-footnote-4-2654' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/davidlebech.com\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/#easy-footnote-bottom-4-2654' title='The player can continue to move forward while falling from the cylinder, because that is how the default controller works. I kept this behavior just for fun.'><sup>4<\/sup><\/a><\/span><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"576\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/tunnel_view-1024x576.jpg\" alt=\"\" class=\"wp-image-2701\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/tunnel_view-1024x576.jpg 1024w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/tunnel_view-300x169.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/tunnel_view-150x84.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/tunnel_view-768x432.jpg 768w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/tunnel_view.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>The player starts the game inside a green cylindrical shape, and is presented with the movement keys and other information further ahead.<\/figcaption><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">The launch<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">I hope the above sections have provided at least some idea of how my little game-like experience turned out. I have not described everything, and there were even a few more ideas that did not make their way into the game at all, but I decided to stop the project when the core content was in a state I was satisfied with.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And then it was time to launch it, i.e. get my wife to play the game. I really wanted to see her reaction while playing, but I let her go through it by herself at her own pace.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I got quite emotional about it actually. Having revisited the memories of nice moments from the past while working on the project, I was already on a trip of nostalgia. Showing the game to my wife was the culmination of that journey, and when I heard a giggle coming from her room, I shed a little tear.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Moving forward<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Even for a simple game-like experience like the one I created, there are still many little decisions that go into making it. Thinking through these decisions, playing around with solutions and seeing the result is often rewarding and interesting, and I can totally understand the appeal to work professionally with games and similar creative endeavors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I also have a newfound appreciation for how long it takes to produce game content. Even though I am an amateur in everything that has to do with game design (except for writing code), and my project was extremely small in scope, it is still easy to see why it takes so long to create games, and why people specialize in modeling, programming, animation, sound design etc. instead of trying to do everything.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I do not think this is the last time I will dabble with creating games. I hope to be able to combine aspects of my professional work-life (data science\/ML\/AI) with game creation. That would be a win-win for a side-project indeed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><em>Continue on <a href=\"\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/2\/\">page 2<\/a> if you are interested in reading a bit more about my experience with Unity. If this does not sound interesting, you can just stop reading here. Thank you for making it this far :-)<\/em><\/p>\n\n\n\n<!--nextpage-->\n\n\n\n<h2 class=\"wp-block-heading\">Appendix: On Unity<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The following sections describe some of my frustrations, obstacles and general observations I experienced while working with Unity. Instead of adding this information to a separate blog post, I am including it here as an appendix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can end your read here if this does not interest you. The main content was about the game and that was concluded in the previous sections.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Lighten it up a bit<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">In Unity, shadows and lighting effects are either calculated in real-time or pre-calculated in a process known as &#8220;baking&#8221;. The advantage of baking a shadow is that it requires less resources to render when running the game, but the disadvantage is that baked shadows only work for static objects, i.e. objects that do not move.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ohhh, the fun I had with shadows&#8230; <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">First, there was the weird light leakage. The light seemed to &#8220;pass through&#8221; the photo exhibit where the &#8220;canvas&#8221; meets the wall.<span id='easy-footnote-5-2654' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/davidlebech.com\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/#easy-footnote-bottom-5-2654' title='Rendering both the front and back of the exhibit&amp;#8217;s wall material fixed the light leakage for real-time shadows, but I still cannot understand why the leakage occurred in the first place.'><sup>5<\/sup><\/a><\/span> This problem disappeared when using baked lighting, but that gave rise to two other problems: Dark colors and fuzzy shadows. The three issues are illustrated in the image below.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"730\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/light_problems-1024x730.jpg\" alt=\"\" class=\"wp-image-2687\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/light_problems-1024x730.jpg 1024w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/light_problems-300x214.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/light_problems-150x107.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/light_problems-768x548.jpg 768w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/light_problems.jpg 1200w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><figcaption>Screenshot of three default photo walls (one showing the front, two showing the back). The left uses <em>real-time lighting<\/em> and casts shadows as expected. The middle uses <em>real-time lighting<\/em> but the light leaks through the model. The right uses <em>baked lighting<\/em> which results in darker colors and a fuzzy shadow on the ground.<\/figcaption><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The right photo exhibit in the screenshot above has soft\/fuzzy shadows. This actually shows the final result, because I used baked shadows for most models. Before getting there, the shadow was almost invisible on the ground and had to be tweaked by increasing the size of the terrain in the shadow map (a special texture that holds information about all baked shadows in the scene). The documentation for this was not great.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The worst problem was <em>the darkness<\/em>. On most objects, the side facing away from the sun became almost <em>completely black<\/em> when rendered with baked lighting, especially for darker colors. This effect is already somewhat visible in the screenshot above, but it gets worse with certain colors.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I used a green color for the walls with the exhibit text and this green was dramatically different when viewed on the sunny and shady side. The final solution was to add an extra light to the scene as a kind-of artificial sun shining in the opposite direction of the real sun. This felt like a hack, but it provided <em>a bit<\/em> of extra lighting, as can be seen on the right screenshot below.<\/p>\n\n\n\n<figure class=\"wp-block-gallery alignwide columns-3 is-cropped wp-block-gallery-2 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"462\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_front_light.jpg\" alt=\"\" data-id=\"2690\" data-full-url=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_front_light.jpg\" data-link=\"https:\/\/davidlebech.com\/thoughtflow\/?attachment_id=2690\" class=\"wp-image-2690\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_front_light.jpg 800w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_front_light-300x173.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_front_light-150x87.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_front_light-768x444.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"blocks-gallery-item__caption\">Sunny side<\/figcaption><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"497\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_extradark.jpg\" alt=\"\" data-id=\"2689\" data-full-url=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_extradark.jpg\" data-link=\"https:\/\/davidlebech.com\/thoughtflow\/?attachment_id=2689\" class=\"wp-image-2689\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_extradark.jpg 800w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_extradark-300x186.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_extradark-150x93.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_extradark-768x477.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"blocks-gallery-item__caption\">Shady side (1 light)<\/figcaption><\/figure><\/li><li class=\"blocks-gallery-item\"><figure><img loading=\"lazy\" decoding=\"async\" width=\"800\" height=\"486\" src=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_dark.jpg\" alt=\"\" data-id=\"2688\" data-full-url=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_dark.jpg\" data-link=\"https:\/\/davidlebech.com\/thoughtflow\/?attachment_id=2688\" class=\"wp-image-2688\" srcset=\"https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_dark.jpg 800w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_dark-300x182.jpg 300w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_dark-150x91.jpg 150w, https:\/\/davidlebech.com\/thoughtflow\/wp-content\/uploads\/exhibit_back_dark-768x467.jpg 768w\" sizes=\"auto, (max-width: 800px) 100vw, 800px\" \/><figcaption class=\"blocks-gallery-item__caption\">Shady side (2 lights)<\/figcaption><\/figure><\/li><\/ul><figcaption class=\"blocks-gallery-caption\">Three renders of an exhibit. Left: Viewed from the sunny side. Middle: Viewed from the shady side with <em>one<\/em> light source. Right: Viewed from the shady side with <em>two<\/em> light sources.<\/figcaption><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Besides the extra light source, I also tried increasing ambient lighting, but this resulted in objects being overexposed, if they were in the sun. I do not know how many hours I spent trying to tweak the lighting settings, and in the end, I could never get the result I really wanted.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">My biggest gripe with the way Unity handled the baked shadows was that objects seemed to almost <em>lose their color<\/em> when being in the shade. This is not really how shadows work in real life. I started paying more attention to shadows when going on walks, taking note of how different materials (walls, tree bark, pavement etc.) change appearance when they are in the shade &#8212; and they do not seem to lose their color :-)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But of course, a game is just a simulation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I might be missing something obvious, and I might be wrong about my observations on shading. It is also possible that with the right amount of tweaking, the result could be better, but I will save that for another time.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Code is everywhere<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Before starting out with Unity, I got the impression that it would not take long before I had to start writing some code. However, I was a bit surprised how quickly this turned out to be true.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For example, I needed a simple mechanism for showing\/hiding a game object when the player is within a certain distance of the object, and there did not seem to be a way to do this without writing a bit of code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Considering that Unity is supposed to be easy to learn but difficult to master, it seemed a bit weird that I had to write code (although it was almost just a one-liner) to do something as simple as showing\/hiding an object based on proximity. I would have assumed this could be handled with a drag-and-drop state machine.<span id='easy-footnote-6-2654' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/davidlebech.com\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/#easy-footnote-bottom-6-2654' title='It is my understanding that this is something Unreal&amp;#8217;s Blueprints could handle, but I have not tried it out.'><sup>6<\/sup><\/a><\/span><\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Compatibility issues<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Unity has two main <a href=\"https:\/\/docs.unity3d.com\/Manual\/render-pipelines.html\">render pipelines<\/a>: The  &#8220;built-in render pipeline&#8221; and the &#8220;universal render pipeline&#8221; (URP). URP seems to have been pushed by Unity for several years by now (under a different name), promising performance improvements and uniquely available features such as the Visual Effects (VFX) Graph. So I naturally thought it would make sense to use URP.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This was probably a bad idea.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I previously mentioned the tree creator. This was one of the built-in tools that initially impressed me a lot, and I had fun creating random trees (using the built-in renderer) when initially testing out Unity.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unfortunately, the tree creator does not work well with URP. Digging into this a bit, I found that the tree creator is <a href=\"https:\/\/forum.unity.com\/threads\/treecreator-trees-broken-in-deferred-mode-again.348637\/#post-2287435\">probably<\/a>, <a href=\"https:\/\/forum.unity.com\/threads\/tree-always-pink.814938\/#post-5404137\">maybe<\/a> deprecated, but the <a href=\"https:\/\/docs.unity3d.com\/Manual\/class-Tree.html\">manual page for the tree creator<\/a> mentions nothing about deprecation. Either way, it works fine in the built-in renderer but not in URP, so this was a bit of a bummer.<span id='easy-footnote-7-2654' class='easy-footnote-margin-adjust'><\/span><span class='easy-footnote'><a href='https:\/\/davidlebech.com\/thoughtflow\/dipping-the-feet-in-the-game-design-pond\/#easy-footnote-bottom-7-2654' title='I managed to get around the issue by just using the generated tree mesh and then manually adding materials.'><sup>7<\/sup><\/a><\/span> It is a real disappointment when a feature mentioned in the manual is not actually working.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The same story repeated itself with the <a href=\"https:\/\/docs.unity3d.com\/Manual\/com.unity.textmeshpro.html\">TextMesh Pro package<\/a> which is a verified package for creating rich text in Unity. Support for URP is apparently <a href=\"https:\/\/forum.unity.com\/threads\/textmesh-pro-surface-shaders-work-for-hdrp.869179\/#post-5725750\">in the works<\/a>, so I had to make do with simple text rendering without any fancy shading. This was ok for my use case, but it was a disappointing experience anyway.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">&#8220;In preview&#8221;<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Besides the lacking compatibility and documentation, the package manager has a lot of &#8220;preview&#8221; packages, i.e. packages that are not &#8220;production ready&#8221;, i.e. there is a risk they are unstable and unsupported.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The aforementioned VFX graph was actually a <a href=\"https:\/\/blogs.unity3d.com\/2020\/02\/21\/create-beautiful-and-complex-effects-with-the-visual-effect-graph-verified-in-2019-3\/\">preview package until recently<\/a>, even though it is mentioned as a major feature of URP for at least a year. A sub-feature called VFX Shader Graph is still in preview, and another interesting &#8220;Terrain Tools&#8221; package is also still in preview. This is a common thread.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It is unclear when packages become verified packages, so one has a choice between taking the risk of using a preview package (and getting the latest features) or use only verified packages (and sticking with slightly older features).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Bad taste<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It is clear that Unity is a powerful and full-featured platform for creating games, and it even has a lot of extra tools to help with e.g. distribution and monetization of the games. Many popular games have been made with Unity, so it is clearly possible to be successful with their platform.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">But there is something about Unity that leaves me with a slightly bad taste in my mouth. It is the same feeling I get when I look at spaghetti code (usually my own). Something is off, something is smelly, it is <em>not beautiful<\/em>. But it gets the job done.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I do not want to hate on Unity, but I am not in love with their product either. And I do not think I should have this feeling already. After all, my &#8220;game&#8221; is pretty simple. Just a basic environment with some grass and trees as well as basic shapes and downloaded 3D models thrown into the mix.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yet I found myself hitting my head (lightly) against a wall quite often. I managed to fix or work around these obstacles in most cases, but I wonder how my experience would have been if my game had been larger in scope.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Throughout the project, I also used Blender a bit, and using them side by side, I think they are good examples of the difference between good software and great software.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Blender is beautiful, unlike Unity, and although it has a very steep learning curve, Blender feels more solid, complete and well-designed.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">A final word<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">My rant above is slightly melodramatic. It is highly likely that I will continue using Unity, because it has a lot going for it. It is easy to use, user-friendly for the most part, and I also quite enjoy writing code in C#.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">However, I am determined to at least give Unreal and\/or Godot a more serious try for my next project, whenever that will happen and whatever it might be.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Thank you for reading!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For my wife&#8217;s birthday this year, I created a prototype of a small game-like 3D environment that she could &#8220;walk around&#8221; in using the keyboard and mouse. The idea was to have an &#8220;exhibit&#8221; for each year we have known each other, consisting of a few photos from that year as well as a short [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":2673,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[37],"tags":[24,41,226],"class_list":["post-2654","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-projects","tag-3d","tag-game","tag-unity"],"_links":{"self":[{"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/posts\/2654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/comments?post=2654"}],"version-history":[{"count":0,"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/posts\/2654\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/media\/2673"}],"wp:attachment":[{"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/media?parent=2654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/categories?post=2654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/davidlebech.com\/thoughtflow\/wp-json\/wp\/v2\/tags?post=2654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}