{"id":26,"date":"2016-10-11T23:13:28","date_gmt":"2016-10-11T23:13:28","guid":{"rendered":"https:\/\/spearmintsblog.wordpress.com\/?p=26"},"modified":"2016-10-11T23:13:28","modified_gmt":"2016-10-11T23:13:28","slug":"spearmint-1-accompaniment","status":"publish","type":"post","link":"https:\/\/spearmints.co\/?p=26","title":{"rendered":"Spearmint 1: Accompaniment"},"content":{"rendered":"<blockquote><p><span style=\"font-weight:bold;\">WARNING: IF YOU HAVEN\u2019T PLAYED SPEARMINT 1 YET, GO <\/span><span style=\"color:#1155cc;text-decoration:underline;font-weight:bold;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"https:\/\/spearmints.itch.io\/no-1\">DOWNLOAD IT AND TRY IT<\/a><\/span><span style=\"font-weight:bold;\">\u00a0OUT. IT\u2019S A QUICK GAME; I\u2019LL WAIT HERE FOR YOU.<\/span><\/p><\/blockquote>\n<p>Spearmint 1 started as an experiment in making and releasing a game in 30 days. Instead, it took about 70 days. I\u2019ll be posting later about the process of making the game and my learnings thereon. This essay instead focuses on what the game taught me about VR game design.<\/p>\n<p>The motivating\u00a0question for S1 was: \u201c<span style=\"font-weight:bold;\">do small, intricate game-spaces work better for VR than open-area traversal?\u201d<\/span>\u00a0Before VR, almost all 3D games challenged the player to traverse a large open world. You see this in almost every 3D game, whether or not it\u2019s an \u201copen-world\u201d game.<\/p>\n<p>Developers in VR have sometimes taken the need for large spaces for granted, leading to the many developers trying to understand how to \u201csolve the locomotion problem\u201d without creating nausea (<span style=\"color:#1155cc;text-decoration:underline;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"http:\/\/www.gamasutra.com\/view\/news\/266687\/Do_the_locomotion_How_VR_devs_are_expanding_the_virtual_space.php\">1<\/a><\/span>, <span style=\"color:#1155cc;text-decoration:underline;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"https:\/\/www.youtube.com\/watch?v=DwZt2jRE8PY\">2<\/a><\/span>, <span style=\"color:#1155cc;text-decoration:underline;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"http:\/\/blog.leapmotion.com\/5-experiments-bleeding-edge-vr-locomotion\/\">3<\/a><\/span>). The state of the art solution is teleportation. However, I\u2019ve found that when playing a game that relied on teleportation, I\u00a0stop walking around my play space and lose the physical connection to the game that makes VR so special. In short, the headset just becomes a screen.<\/p>\n<p>This led me to ask: what if I don\u2019t use any teleportation and instead focus on a dense game world that fits inside a living room? This led to the escape-room game you see in Spearmint 1. The game\u2019s theming, puzzle design, and environment detailing were built in service of this main investigation.<\/p>\n<p>The rest of this essay focuses on some interesting successes and failures gleaned in building this game. Here are some questions to ask yourself before continuing on:<\/p>\n<ul>\n<li>Do you still remember the layout of the space? Is this memory more or less detailed than other VR games you\u2019ve played?<\/li>\n<li>Did you feel claustrophobic or constrained? Did you find yourself wondering what was outside the walls?<\/li>\n<li>Are there other game types that lend themselves to small spaces? Can they be adapted into VR well?<\/li>\n<\/ul>\n<h2 id=\"h.hop12owbrabw\">Interesting Success #1: Sense of space<\/h2>\n<p>In many ways, the original question about small, intricate game-spaces was answered to my satisfaction. The small room that I created seems to become a real space for players. They know their way around it and explore the entire playspace. I found some good signs of this:<\/p>\n<ul>\n<li>Many playtesters tried to lean on the table while thinking through a puzzle. It wasn\u2019t ethereal to them; it was a real object.<\/li>\n<li>People smiled during the wire puzzle when they had to stretch their arms across the room. The physicality was novel and enjoyable.<\/li>\n<li>A lot of players had fun just throwing the papers around the room and making a general mess.<\/li>\n<\/ul>\n<p>Even though the room had to be small enough to fit within the average person\u2019s living room, I didn\u2019t run out of space to place things. Adding more detail and systems to the room could easily make for an experience 10x in length. An intricate puzzlebox of a room could be a real joy to play in. However, the intricacy of the space is directly related to time invested by the developer and how many assets they\u2019re willing to create.<\/p>\n<h2 id=\"h.hficd7iqsix5\">Interesting Success #2: Watchable booleans<\/h2>\n<p>This learning is focused more on Unity development and not VR in particular. \u201cWatchable booleans\u201d were an ergonomics solution that ended up really punching above their weight. Here\u2019s the challenge: the game uses a bunch of small LEDs to indicate the state of systems in the room to the player. They\u2019re all the same prefab, they just need to be hooked up to different things in the room.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-27 aligncenter\" src=\"\/wp-content\/uploads\/2016\/10\/26_uans7ztyuk.png\" alt=\"26_uans7ztyuk\" width=\"441\" height=\"214\" srcset=\"https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_uans7ztyuk.png 441w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_uans7ztyuk-300x146.png 300w\" sizes=\"auto, (max-width: 441px) 100vw, 441px\" \/><\/p>\n<p>UnityEvents seem like a good fit here, letting you\u00a0tie the behavior of objects together from the editor very quickly. This is good when the same conditions on different objects should have different actions. For example, the condition of \u201cpressing a button\u201d can easily be tied to different actions. The MonoBehavior encapsulates the condition and you specify its action in the editor.<\/p>\n<p>I created a somewhat analogous tool to UnityEvents: Watchable Booleans. They\u2019re the inverse of the above picture &#8212; the action is encapsulated in the behavior, and you specify its condition in the editor. An LED can really only turn on or off; you then say in the editor what boolean value in the scene you want to mate that to. This let me set up the conditions for each light straight from the editor.<\/p>\n<p><span style=\"overflow:hidden;display:inline-block;margin:0;border:0 solid #000000;transform:rotate(0.00rad) translateZ(0px);-webkit-transform:rotate(0.00rad) translateZ(0px);width:624px;height:468px;\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-28 alignnone\" src=\"\/wp-content\/uploads\/2016\/10\/26_vyvmxywolq.png\" alt=\"26_vyvmxywolq\" width=\"960\" height=\"720\" srcset=\"https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_vyvmxywolq.png 960w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_vyvmxywolq-300x225.png 300w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_vyvmxywolq-768x576.png 768w\" sizes=\"auto, (max-width: 960px) 100vw, 960px\" \/><\/span><\/p>\n<h3><\/h3>\n<h3 id=\"h.tv1izextfggk\">More details<\/h3>\n<p>Lights look for an object that implements IWatchableBool. Objects that implement IWatchableBool report one boolean value, which was generally some version of \u201cam I activated?\u201d<\/p>\n<ul>\n<li>Batteries report whether they\u2019re charged.<\/li>\n<li>Safety switches report if they\u2019ve been flipped.<\/li>\n<li>Dials report whether they\u2019ve been set to the right value.<\/li>\n<li>Some Unity objects served simply as holders for invisible state. For example, turning the ignition while the battery is charged turns on the \u201cTargeting System Power\u201d object.<\/li>\n<li>Aggregators could perform the \u201cAND\u201d or \u201cOR\u201d operation on these parts of the system, and lights could watch these.<\/li>\n<\/ul>\n<p style=\"text-align:center;\"><span style=\"overflow:hidden;display:inline-block;margin:0;border:0 solid #000000;transform:rotate(0.00rad) translateZ(0px);-webkit-transform:rotate(0.00rad) translateZ(0px);width:379px;height:178px;\"><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-29 aligncenter\" src=\"\/wp-content\/uploads\/2016\/10\/26_ydbegz8xpw.png\" alt=\"26_ydbegz8xpw\" width=\"379\" height=\"178\" srcset=\"https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_ydbegz8xpw.png 379w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_ydbegz8xpw-300x141.png 300w\" sizes=\"auto, (max-width: 379px) 100vw, 379px\" \/><\/span><\/p>\n<p>This is a slightly non-standard use of the Unity inspector; it doesn\u2019t let you show interfaces in the inspector and the resulting pathways of conditions through aggregators can be hard to trace. However, this <span style=\"text-decoration:italic;\">significantly<\/span>\u00a0improved my iteration time and made bugs much easier to track down.<\/p>\n<h2>Interesting Failure #1: Tone and narrative<\/h2>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-30 aligncenter\" src=\"\/wp-content\/uploads\/2016\/10\/26_k_cyqjz-yj.png\" alt=\"26_k_cyqjz-yj\" width=\"1600\" height=\"1131\" srcset=\"https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_k_cyqjz-yj.png 1600w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_k_cyqjz-yj-300x212.png 300w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_k_cyqjz-yj-1024x724.png 1024w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_k_cyqjz-yj-768x543.png 768w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_k_cyqjz-yj-1536x1086.png 1536w\" sizes=\"auto, (max-width: 1600px) 100vw, 1600px\" \/><\/p>\n<p>A big part of the original design is completely absent from the final game: the dark comedy tone. This tone fell naturally out of the puzzle design. And, by the same token, when those puzzles had to change, the tone left with them as well. This left a gaping hole in the feeling of the game.<\/p>\n<p>Where did this dark comedy tone come from? The puzzles were going to be built off of the technology on the nuclear submarine being old, rundown, and broken. Some examples:<\/p>\n<ul>\n<li>The radio crackles while transmitting vital information, creating a puzzle for the player of eliminating impossible combinations.<\/li>\n<li>The safe would need to be broken into to retrieve the data.<\/li>\n<li>The targeting and launch systems are so old that they needed to be jumpstarted by a wire.<\/li>\n<\/ul>\n<p>This created potential for a bit of a joke: when old technology breaks, people find workarounds. What\u2019s the one system you don\u2019t want people finding workarounds for?<\/p>\n<p>Nuclear failsafes.<\/p>\n<p>Early challenges would lead the player to a failsafe system that appears completely broken. The player, having been trained to subvert the systems on the sub, would then willingly bypass this failsafe in the pursuit of beating the game.<\/p>\n<p>However, this fell apart as the game developed. I had to cut some of those early training challenges (they were bug-prone and confusing). The assets weren\u2019t good enough to communicate that the sub was obsolete and rundown. Thus, when players came up to this broken failsafe, they hadn\u2019t been trained to think laterally in previous puzzles.<\/p>\n<p>All of these little cuts led to a bland tone in the game. Is it serious? Is it a comedy? It ends up feeling like a standard puzzle game, but in VR.<\/p>\n<h2 id=\"h.lgwvot9s9ivj\">Interesting Failure #2: Physics\u00a0and VR<\/h2>\n<p>A lot of VR games rely on physics for their gameplay. It makes sense at first blush; physics are familiar to players when they put on the headset, and most modern engines make it pretty easy to get started.<\/p>\n<p>However, let\u2019s be clear about something: developing with game physics sucks.<\/p>\n<p>This glut of physics-based VR games has really brought the issues with game physics right back into view. Before VR, most 3D games didn\u2019t rely on physics for much of their gameplay. Many of the issues with the physics were easy to ignore because they weren\u2019t that important to the game; they were just <span style=\"color:#1155cc;text-decoration:underline;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"https:\/\/youtu.be\/9_UNRp7Wrog?t=35s\">eye<\/a><\/span>\u00a0<span style=\"color:#1155cc;text-decoration:underline;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"https:\/\/youtu.be\/xbugZbOsrnM?t=1m10s\">candy<\/a><\/span>.<\/p>\n<p>So, what are the problems with building gameplay off of game physics?<\/p>\n<h3 id=\"h.s6mcuw5jwx4l\">Physics are hard to direct<\/h3>\n<p>Going from the mental picture of the interaction you want, to a robust, physics-based interaction can be a nightmare. For example, this ignition interaction in Spearmint 1:<\/p>\n<div style=\"width: 640px;\" class=\"wp-video\"><video class=\"wp-video-shortcode\" id=\"video-26-1\" width=\"640\" height=\"360\" loop autoplay preload=\"metadata\" controls=\"controls\"><source type=\"video\/webm\" src=\"https:\/\/zippy.gfycat.com\/ThirdWealthyHyena.webm?_=1\" \/><a href=\"https:\/\/zippy.gfycat.com\/ThirdWealthyHyena.webm\">https:\/\/zippy.gfycat.com\/ThirdWealthyHyena.webm<\/a><\/video><\/div>\n<p>It took a day of prototyping, building, and debugging to get this one interaction to work, and it\u2019s still a bit unreliable. It looks nice and smooth, but behind the scenes we\u2019re creating, configuring, and destroying multiple joints in those few seconds. Those joints are built off of the behemoth that is ConfigurableJoint. Anyone who says they understand all of its parameters and their interactions is lying to you:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\" size-full wp-image-31 aligncenter\" src=\"\/wp-content\/uploads\/2016\/10\/26_iq39vaseyg.png\" alt=\"26_iq39vaseyg\" width=\"289\" height=\"900\" srcset=\"https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_iq39vaseyg.png 289w, https:\/\/spearmints.co\/wp-content\/uploads\/2016\/10\/26_iq39vaseyg-96x300.png 96w\" sizes=\"auto, (max-width: 289px) 100vw, 289px\" \/><\/p>\n<h3 id=\"h.76s6ybmzg606\">They\u2019re prone to weird bugs that are essentially undebuggable<\/h3>\n<p>PhysX is remarkably robust and accurate; it truly is shocking just how much of the time it looks right.<\/p>\n<p>Despite this, any physics-based game is going to encounter its fair share of weird bugs.<\/p>\n<ul>\n<li>Maybe two objects pass right through each other because they\u2019re going too fast.<\/li>\n<li>Perhaps thin objects don\u2019t lie flush with other objects and start jiggling.<\/li>\n<li>Sometimes your fixed joints start to drift apart from each other because you\u2019ve chained too many together.<\/li>\n<\/ul>\n<p>If you\u2019re lucky, the bug will happen at a time that doesn\u2019t affect gameplay. However, there\u2019s always the danger that your critical-path item will be sent flying by a weird interaction. These problems are significantly worse because the physics system is largely opaque to debugging without building something like <span style=\"color:#1155cc;text-decoration:underline;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"http:\/\/www.gdcvault.com\/play\/1020064\/Physics-for-Game-Programmers-Debugging\">this<\/a><\/span>. The physics engine is a <span style=\"color:#1155cc;text-decoration:underline;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"https:\/\/en.wikipedia.org\/wiki\/Complex_system\">complex system<\/a><\/span>\u00a0that spins off unpredictable issues. That\u2019s a tough foundation to build a game on.<\/p>\n<h3 id=\"h.7nrqjw3ssbq1\">Games require all sorts of weird, fundamentally wrong interactions<\/h3>\n<p>VR systems can\u2019t yet impart forces back on the player. This is obvious, but causes problems when interacting with a physical simulation.\u00a0This limitation leads to lots of little questions whose answers interact in messy, unphysical ways:<\/p>\n<ul>\n<li>Should I be able to put my hands through objects? If not, what happens when my in-game hands stop tracking my real-life hands?<\/li>\n<li>What happens if I grab an object with both hands and pull them apart?<\/li>\n<li>What happens if I grab an object that\u2019s bolted down and pull on it? Should my hand separate from the object?<\/li>\n<li>How do I represent heaviness if all objects can be moved in the same way by my virtual hands?<\/li>\n<li>What happens when objects accidentally clip out of bounds? Should they respawn?<\/li>\n<li>How do I represent fine motor control without finger tracking?<\/li>\n<li>How do I pick up objects? Which button is it? Should it \u201csnap\u201d to my hand?<\/li>\n<\/ul>\n<p>Any answer to the above questions is a non-physical workaround, and any combination of these answers is gonna have some weird, unintended consequence that feels wrong. There isn\u2019t yet a set of conventional answers to the above questions, either, which means every game has to overtutorialize some of its interactions.<\/p>\n<p>In Spearmint 1, I ran up against these issues all the time. Making small fixes for every interaction was a frustrating time-sink. Some examples I ran into:<\/p>\n<ul>\n<li>When pushing the wire against the battery, the ends of the wire would jump around and vibrate a lot because they had become separated from the physical hand holding them.<\/li>\n<li>Picking up the desired sheet from a stack of paper was a challenge for players, and picking up the wrong one sent the rest of the papers flying.<\/li>\n<li>When the keys had been inserted into the ignition, the keys would start to turn automatically as if the player had been starting the machine. This was because of an obscure orientation error in setting up the joints.<\/li>\n<li>At one point, the handles on the safe wheel would come off as you tried to turn the wheel. This was caused by setting up multiple chained fixed joints (the handles were fixed to the wheel, the wheel was fixed to the door, the door was fixed to the body). The solution was to lower the mass of the handles, which makes no physical sense but solved the issue.<\/li>\n<\/ul>\n<p>For my next project, I\u2019m leaning towards something less physical and more ethereal. If force\/interaction is only one-way in the current VR systems, then perhaps games should reflect those limitations.<\/p>\n<h2 id=\"h.s8cgvzxvgedl\">Interesting Failure #3: Text sucks in first-gen VR<\/h2>\n<p>This is a quick one. First-gen VR headsets aren\u2019t hi-res enough to build games around text. Text can easily be blurry if the player has the wrong fit on their head and even then it has to be unreasonably large (think 48pt documents) to be readable. This doesn\u2019t mean your game should have no text; it just means that you may not want to make it important to the gameplay.<\/p>\n<h2 id=\"h.y5bamblraq5b\">Interesting Failure #4: Took too long to get playable<\/h2>\n<p>I should have known better, but I only had a fully playable version of the game 2 weeks before release. Getting playable early gives me more time to understand what parts of the game work and what parts need to be cut. It also motivates me more if I\u2019m able to actually show people what I\u2019m working on. So what went wrong?<\/p>\n<p>The escape game genre doesn\u2019t get to a playable state very early. The puzzles and interactions in escape games often rely on the actual asset being present. If your key doesn\u2019t look like a key, people aren\u2019t going to know what to do with it. A better approach is still a bit of a mystery for me &#8212; what does an early, prototype version of this escape game really look like? What was the real bare minimum I needed?<\/p>\n<h2 id=\"h.o1wvcgucy53x\">Parting Words<\/h2>\n<p>While I\u2019m not head over heels about the final project, I\u2019m thrilled to have something finished and uploaded. In the name of complete transparency, I\u2019m also uploading <span style=\"color:#1155cc;text-decoration:underline;\"><a style=\"color:inherit;text-decoration:inherit;\" href=\"https:\/\/drive.google.com\/open?id=0B7MzYbblkPoaS2l5b1FsZEJkQTA\">all of my design documents <\/a><\/span>and sketches for the game. If you\u2019ve ever wanted to look into the head of another developer, here\u2019s your chance. I\u2019m also going to work on getting Spearmint 1 open sourced &#8212; there\u2019s no reason for me to hide the code. I just have to work through the licensing issues around the assets.<\/p>\n<p>After that, Spearmint 2 starts development soon. Hopefully I\u2019ll scope a little better and pop it out in something like 30 days. Seeya then!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>WARNING: IF YOU HAVEN\u2019T PLAYED SPEARMINT 1 YET, GO DOWNLOAD IT AND TRY IT\u00a0OUT. IT\u2019S A QUICK GAME; I\u2019LL WAIT HERE FOR YOU. Spearmint 1 started as an experiment in making and releasing a game in 30 days. Instead, it took about 70 days. I\u2019ll be posting later about the process of making the game [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":25,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-26","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/spearmints.co\/index.php?rest_route=\/wp\/v2\/posts\/26","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spearmints.co\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spearmints.co\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spearmints.co\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spearmints.co\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=26"}],"version-history":[{"count":0,"href":"https:\/\/spearmints.co\/index.php?rest_route=\/wp\/v2\/posts\/26\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/spearmints.co\/index.php?rest_route=\/wp\/v2\/media\/25"}],"wp:attachment":[{"href":"https:\/\/spearmints.co\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=26"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spearmints.co\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=26"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spearmints.co\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=26"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}