Bunk – Downloadable .blend File

With the first of the planned updates out, I’ve improved some of the visual elements that were just sort of roughed in for the initial release. (Because if you wait until everything’s perfect, you’ll never ship.) I wanted to share a little of my process.

Really, Lillie. Make your own bed.

Here is the ZIP file. Everything is modelled in Bforartists, the UI-focused fork of Blender, and the file is 100% compatible with the mainline app. I use proxy Materials in Bforartists, as they’re easily replaced with native URP Materials in the .fbx file import dialogue. I find it more reliable to place unused/support items into a separate Scene Collection, and export the Active Collection from the .fbx export dialogue, rather than selecting items manually. Normally I do the bevelling by hand, but on the bunks I tried out the Bevel Modifier, followed by a light Decimate Modifier, to clean up unnecessary flat geometry. It works okay, and it’s quick, but the polygon count ends up higher than necessary. Because of the way Unity handles animations, the curtains are separate files.

The bunks are based loosely on photo references from the New Brighton Lighthouse. They’re meant to feel friendly and cozy, as they’re Lillie’s first sanctuary after the disastrous boat trip. In my head cannon (which I guess makes it the official cannon) we’re playing through Lillie’s memories, fears and anxieties. In “real life” she succeeded at all of these tasks the first time, but–like many of us–obsesses over what could have gone wrong. (Which are our in-game failures and resets.)

Useful Unity Components: PlaySounds

In this ZIP file you’ll find three C# scripts for Unity: PlaySounds.cs, PlaySoundsMultitrack.cs and PlaySoundsBySpeed.cs. The latter two are subclasses of PlaySounds.cs, and require the former in your project. These small, lightweight scripts are used throughout Lillie is the Keeper (along with a couple other subclasses that are dependent on features of the game).

Basically, they do everything that I wish Unity’s own AudioSource Component did by itself. Play through a list of AudioClips? No problem. Play a random clip from a list? Done. Play OnTriggerEnter()? One click. You can play a single clip or all clips, disable the GameObject after playing, trigger audio from an external script, and monitor playing status with UnityEvents or a simple bool.

Check the scripts’ headers for a full rundown of features and how to use them. You’ll also see helpful tooltips in the Unity Editor.

The two subclassed scripts, PlaySoundsMultitrack and PlaySoundsBySpeed let you do two additional things. With the former, you can swap between up to four wholly different sets of AudioClips. Think of a windmill randomly playing different sounds from a playlist at different speeds: a slow, creaky set of sound clips at lower speeds, and a higher, whooshier set at high speed. PlaySoundsBySpeed lets you specify a minimum velocity at which to trigger sounds, and scales the volume up from 0 to 100% at a maximum speed. (Setting both speeds equal always plays the sound at normal volume.)

There are a couple things you may want to customize. These are written for rapid prototyping, trying things out, and generally seeing what works. Just about everything that can be public is, rather than using [SerializeField] private. If there are no AudioClips in the list, PlaySounds will simply disable itself; you may prefer to throw an error. Additionally, you’ll notice that an AudioSource component is necessary, but not required in code via [RequireComponent(typeof(AudioSource))]. (Instead, PlaySounds logs the issue for you.) This is deliberate, to keep Component coupling loose while trying things out, but may not be what you want in production.

I encourage you to use these, without limitations, in your own work. (But if you do something cool, please do let me know!)

LitK: Here Goes Nothing

This is it! “Lillie is the Keeper,” the innovative new AR adventure game for iPhone & iPad, is live…

And best of all, it’s FREE, through January 6!

Explore your own virtual lighthouse, and live Lillie’s story. I’m proud to bring this playable short story to you, and hope you enjoy your time at Switch Rock Light Station.

Download on the App Store

LitK How-to Video

New kind of game. Better explain.

A link to this video will sit in the Game Menu of “Lillie is the Keeper.” AR Kit can be finicky at the best of times, and tracking losses mean glitching. I hope this helps new players.

Bonus: A repeating carpet pattern can confuse it terribly, but drop something on the floor to break it up, and the app gets quite a bit happier. #SockHack

Rounded Realism

Having cut my 3D teeth on Hash Animation:Master, I like working with subdivision surfaces, until it’s time for a high-to-low poly sculpt for normal map baking. It’s always interesting how clothing only looks “right” when it’s modeled after a plausible sewing pattern.

Minus a few things out of my control, it looks like Lillie is the Keeper is only a week or two from release.

Without a AAA-scale production pipeline, an appropriate art style needed to be developed to maximize impact while easing development–especially since I’d be modelling everything myself. Low-polygon games like Black Book and Röki have had great artistic success, while voxel-style titles like Minecraft and Roblox have enjoyed great commercial success, both styles riding the “high-tech low-tech” aesthetic of my old professor. Having observed that modern iPhones (even in web browsers, via WebGL) can easily draw a very large number of polygons, I decided to lean instead into something I call “rounded realism.” This style builds on the work of artists like Aron Weisenfeld, Zinaida Serebriakova and Chris Van Allsburg, in which figures and objects are realistically textured and atmospherically lit, but conform subtly toward primitive solids.

In practice, rounded realism means that textures are realistic (photographic, when possible, utilizing Adobe Capture) and lighting is clean and realistic, but unimportant details are missing. Corners are bevelled, with sizable flat surfaces between. Visual outlines are clean and geometric, with a minimum of visual clutter. Faked volumetric lighting and other transparent elements are used extensively to create depth, running against the orthodoxy that their layered overdraw will kill iOS performance.

Clothing was some of the most demanding work. Mayme’s Edwardian sailor bodice outfit closely follows a custom build by Katja Kuitunen, based on a vintage piece from the era. It’s constructed from Kuitunen’s sewing references–with help from my girlfriend, who is brilliant with these things. The skirt (a separate piece, despite the shirt’s matching fabric) is a simple fabric tube, gathered about the waist, with realtime cloth simulation. Everything is designed to be plausible, but clean, geometric, and simplified.

It’s been a big job, and there’s more I’d like to do for a 1.1 release. The only models from the game that aren’t my own are human bodies built with MakeHuman, though even they’ve been resculpted and touched-up. Clothing and hair are all hand modeled.

It Was His Time to Go

A fragment of a dream. This was the new normal. Everyone seemed so resigned to it. Maybe it was indeed the time appointed to the man, somehow, as someone said afterward, but he was panicking as they lifted him out the window. Arms came out of the ocean–long, brightly colored arms, with sticky, webbed hands–amphibian hands–pulling the terrified man right off the subway car. His friends tried desperately to hold him, but there was no resisting. He was already suffocating, head wrapped in those rubbery fins, as he disappeared beneath the leaden waves.

I wonder what the arms were connected to. Why did we stay near the ocean? Was it futile to leave? How long had we been living like this? How many of us were left?

A Little About Role-Playing Games

Lillie is the Keeper is a role-playing game, but it’s not an RPG. Like many games, you play as the title character, and see the world through her eyes (and hear yourself speak in her voice, and hear the voice in her head). Minus the AR gimmick, it’s a very conventional style of play. What I find odd, on reflection, is that this type of game is not called a “Role Playing Game”–and what is involves very little role-playing.

It’s a product of evolution, like all inexplicable things. Pen-and-paper RPGs were supposed to model all aspects of playing a character, though in practice most players focused on stats as a means to an end: that of increasing said stats. People “gamed” role-playing games, rather than role-playing them.

Sure, some people didn’t (and don’t) play them that way, and there are a number of role-playing systems that focus very sharply on driving character interaction rather than combat (somewhat including my own) but when the nascent digital game developers needed a template for long, multicharacter games, they borrowed liberally from the established pen-and-paper RPGs.

The real game loop is: boost numbers so you can unlock more content and boost more numbers. Even incredibly good story-driven RPGs like Lunar: Silver Star Story are fundamentally stat boosters with unspooling scenery. Very little of your time is spent inhabiting the mind and game world of the title character. Most often, the title character’s mindset is as bland as possible, to serve as a passthrough for the gamer. (Successfully un-personifying “you” as the main character was one of the many unsung triumphs of Myst.)

I call Lillie is the Keeper a “Myst-like.” It’s an out-and-out brag posing as a point of reference, even if it’s not 100% true. Myst has been misunderstood for 30 years, because its imitators, from Obsidian to The Witness, have failed to understand the importance of aligned atmosphere, the value of stillness, and the fact that walking around an empty place solving puzzles isn’t any more compelling than doing either activity solo—hence puzzle games and “walking simulators.” In Myst, the “puzzles” are just broken machines of a perfectly recognizable vintage. Within the calm loneliness of the game’s sound, pacing and art, there’s not even a sense that they need to be fixed (at least until the puzzling discovery of the imprisoned brothers). The opening act of the game makes clear that this is a game for a certain type of player: Not a twitch gamer, nor even a problem-solver, but a wanderer. A dreamer.

LitK tries to be this. It tries to be a positive depiction of an individual with a mental health issue. It tries to be an innovative new use for AR. It tries to be an interesting short story. It also tries to be a role-playing game.

Do we need a new term? How about “character-playing game?”

A lot of what I enjoy about games is the escapism: losing myself in another place, another time, another me. I can’t be the only one, can I?

Herre Solsort

Printable PDF

An illustrated true story about our local blackbird. This was something I started over the summer as a 2D/digital painting exercise, but only picked up again a few weeks ago (as something to do that’s not job hunting and Lillie is the Keeper).

I love the self-serious, slightly derpey way blackbirds go about everything. Lots of fun to scribble something together like this. Have fun!