Simple Offline AI Assets for Unity!

I was working on my new indie game, and realised I needed some simple and local AI features: speech recognition, some kind of LLM, and text-to-speech. They are all very solved problems, but I couldn’t find a solution for all of them that was:

  • Compatible with Unity
  • Ran in the editor and in a build (the same way!)
  • Relatively simple to setup and use
  • Completely local
  • Didn’t require exotic libraries that may or may not exist for all platforms
  • Free (or cheap)

So – I made them! And hence my range of “Simple Offline” assets was born. I put them all together, and hosted a small demo on Hugging Face. Since it uses WebGPU, it’s still GPU-accelerated. It’s embedded below!

Run the Local Voice AI Demo

This demo downloads ~350MB and runs entirely in your browser.

Speech Recognition + LLM + TTS — all local.

“Local Voice LLM” – a voice-controlled AI agent, running completely locally.

And you can see all my Unity Assets here. Hopefully they’ll be useful to you! If you have any feedback about them, I’d love to hear it. Please use the Contact section on this site.

Who’s been Going Loco?

Hello! I’ve been hard at work on a new VR game called Going Loco. It’s a fun and accessible puzzle game for the Meta Quest where you have to complete the missing parts of a map to guide the cars, trains and planes to safety.

You have a set of Tiles in your ‘Palette’, which can be opened by flipping either hand palm-up, allowing the other hand to grab a Tile and place it. My friend Gaz had some great suggestions for improvements, like using the face buttons on the controllers to spin the Tiles (like you might in Tetris) before placing them, avoiding some unnecessary re-manipulation of the Tiles to get them in the correct rotation.

You have some control over time. By opening the Palette or placing a Tile, you can slow down time to build enough roads or track for the oncoming vehicles. And once everything is in place, you can press a button to speed up as well, to see the events unfold faster if you’ve been replaying a level for a while!

You’re graded on your performance in real time, so abusing the slowdown system may cost you a Star in your 3-star level score, and likewise by using the speed-up feature, you can improve your speed. But you have to pay attention to the route vehicles will take to avoid some explosive consequences of not clearing the path.

The game uses several “Low Poly” asset packs from Synty Studios, which I feel really set the colourful, detailed and clean aesthetic of the game. I also used over 20 tracks from BenSound for the music, which I play with heavily – adding low-pass filters to make the dialogue more clear, and slowing down or speeding up to match the game speed.

I had the original idea for this game in 2012, and made a very basic prototype for iPhone, which is sadly lost to time now. But I think the mechanic actually works better in VR, where you can physically grab the Tiles naturally using another great Unity asset, Autohand, which handles all the hand-poses and physics associated with grappling the objects. Having these tools available is great, because it means a solo developer like me can concentrate on the gameplay without getting bogged down in the details. I stand on the shoulders of giants, and try to see as far as one person can.

Going Loco is out now on the Meta Quest Store and is priced at $9.99 (there may be variations for local currencies). You can download the press kit here. Please get in contact if you’d like any further information.

Become a Home Detective!

Get the game here:

https://www.oculus.com/experiences/quest/6123516891014614/

Today I released my new game, Home Detective on the Meta App Lab. It’s a VR game that uses passthrough (making it a bit more like an AR game), and lets you become a kind of work-from-home detective, solving crimes from your own living room.

I started off making a passthrough and hand-tracking game only, with the idea that players would interact with their environment in a very natural way, but soon realised that adding controller support would be best, as the accuracy and precision of controller tracking (along with it having real buttons) makes it a lot more reliable. And then recently I added a ‘Pure VR’ mode which you can play standing or even sitting down, so anyone – even those with small play areas – can still enjoy the game.

There are some cool interactions – you can search a body for clues, finding debris under the fingernails, open cupboards and drawers and search them (while they feel like real furniture in your own home), and dust objects for fingerprints.

One feature I am particularly proud of is the ‘Residual Heat Scanner’ which shows leftover footprints, and items that the criminal(s) may have touched. It is basically a Unity light that activates certain objects, but I had to optimise the shader very hard to allow the use of more than 1 per-pixel light on the Meta Quest 2.

Another feature you can’t see in screenshots is the Dynamic Music System. The tracks for each level are divided into instruments (thanks to the awesome guys at https://www.fesliyanstudios.com/), and I layer on more tracks as the scene gets more intense. By the end of the level, when you are picking the suspect, everything is going full blast, but it ramps up so gradually you don’t notice the changes.

The game can be downloaded for free from App Lab, and extra levels are available as IAPs. Please take a look!

Google Docs Chapter Fixer

Hey! Do you use Google Docs? Are you writing in chapters? Do you sometimes insert or remove chapters? Then this script is for you!

To add it to your Doc, open it up, then go to Tools -> Script Editor. Copy and paste the following code (you might also need to save the script project, as something like “MyScripts”).

function FixChapterNumbers()
{
  var pars = DocumentApp.getActiveDocument().getBody().getParagraphs();
  var chapterCounter = 1;
  for(var i=0; i<pars.length; i++)
  {
    var par = pars[i];
    var parText = par.getText();
    if ((parText.length < 12) && (parText.slice(0, 7) == "Chapter"))
    {
      var fixedChapterString = "Chapter " + chapterCounter;
      par.replaceText(parText, fixedChapterString);
      chapterCounter++;
    }
  }
}

As long as your Chapters use just the text “Chapter 3”, “Chapter 4”, and so on, they will now be put in order, starting at 1. This only affects the “Chapter X” text in the title, not the body of any of the chapters.

If you’re writing your novel for NaNoWriMo, you know time is of the essence! Perhaps this can be useful for you.

Ceroc Beginners Class

Please note: These are the old moves that ran until the end of 2023. For the new beginners moves, please go to the new Ceroc Beginners Class page.

My game is out!

Last night the Xbox build of Miasma 2 made it onto the marketplace.

It’s the culmination of about a year and a half’s work with Pete Lewis, to whom I am very grateful for his hard work.

Some other awesome guys chipped in, like Julian Cole for writing an entirely custom music score, Paolo Parrucci for creating some last-minute UI graphics, Jenny Peers for an eye-catching game cover, and many others.  Thank you all.

You can queue it up here:

http://marketplace.xbox.com/en-GB/Product/Miasma-2/66acd000-77fe-1000-9115-d80258550b1d

And read a bit more about it at the ESP Games website, if you like.

David

Please buy my game so I can eat food!

Hello,

You may have seen, heard, or otherwise divined me bleating on about my indie game, Miasma, which I laboured over intensively for about 8 months.

Well, if you wanted to give it a try the PC demo is now available and you can grab it from my indie developer website, here:

http://www.esp-games.com/

And if you wanted to buy it, it’s an embarassingly low $2.95 (about £1.85).  Please buy 10 copies and tell all your friends to do the same!  Otherwise, how else am I going to afford my solid gold hum-vee?

The game is also available for Xbox 360 on Xbox Live Indie Games, although I get a bit more money if you purchase the PC version.

Thanks!
Dave

Play my Xbox Indie Game, Miasma!

Hello,

I’m incredibly proud and somewhat relieved to say that my XNA Indie Game, “Miasma” is now available on the Xbox Live Marketplace, and you can go and play it!

It’s the product of 7 months of obsessive work in my spare time, and gave me the opportunity to make a small but deep strategy game I’d been thinking about for a while.

The gameplay is similar to Advance Wars, Front Mission, and even X-Com, and pits your small team of rebels against a seemingly all-powerful world dominating company.

Here’s a trailer, if you’d like to see it:

You can try the demo version for free if you have an Xbox Live account. Hope you get a chance to try it out, and that you like it!

An ‘official’ announcement of the game is here, at my indie development website ESP Games.

XNA Allocation-free string class

Hello,

I’m developing an XNA game for Xbox and PC, and about half-way through my development cycle I realised I had a problem with memory allocation – or more precisely, with garbage collection.

Garbage Collection (GC) occurs when the XNA framework determines that you have allocated and freed a certain amount of memory (currently 1MB), and attempts to return the freed memory to the system so it can be re-used. It’s a useful and elegant system that makes creating software easy and fun. However, when it comes to performance, especially on the Xbox, it might bite you in the ass. A single garbage collection can cause a stutter in your application, and if this is happening multiple times per second, it’s going to make your app unusable.

So I went through my game and removed all the unnecessary allocation and freeing, and replaced it with static allocation and pools of objects to re-use.

I also created this string class, which uses a static 256 char buffer. It has lots of functions for formatting text and numbers, and a function for getting a plain C# string out of it. I found it very useful… Perhaps you will too? Feel free to use it in your projects.

Remember to make it a member or a static variable, don’t re-create it every frame! And don’t create a silly number of them… Every 4 will cost you (just over) 1KB of memory. 🙂

ESPString.cs

ESP Games is the name of my indie development studio (which is…  me).