Skip to content(if available)orjump to list(if available)

Making video games (without an engine) in 2025

samiv

After having worked on my own (2D) game engine [1] for about 5 years now and having worked on related stuff for paid work I'd like to explain one thing that many people might not find so obvious.

Engines are the easy part.

The real meat & potatoes is all the tooling and content and asset pipelines around the engine. If you think about it, you need to implement:

  -  importing data from various sources and formats, textures, audio, model files such as gltf, fbx, animations etc etc.
  - editor app with all the expected standard editing features, cut, copy, paste, undo, redo, save, delete etc. 
  - all the visualizations and operations that let the game developer use the editor to actually create and manipulate data, entities, animations, scenes, audio graphs, scripting support etc. etc.
  - all the data packaging and baking such as baking static geometries, compiling shaders, resampling and packing textures, audio, creating game content asset packs etc
  - etc etc.
And this is just a small sample of all the features and things that need to be done in order to be able to leverage the engine part.

When all this is done you learn that the actual game engine (i.e. the runtime part that implements the game's main loop and the subsystems that go brrr) is actually a rather small part of the whole system.

This is why game studios typically have rather small teams (relatively speaking) working on the engine and hordes of "tools" programmers that can handle all the adjacent work that is super critical for the success of the whole thing.

[1] https://github.com/ensisoft/detonator

flohofwoe

I keep saying that the engine is just that little runtime attachment dangling off the end of the asset pipeline ;)

(and the same is becoming more and more true for shader compilers vs 3D APIs - all the interesting stuff is happening in the shader compiler, while the 3D API is just there to kick off shaders and feed them with input data)

agentultra

Keep in mind that when writing your own "engine," you don't need it to be as general as possible to handle every possible kind of game. You just need it to handle your game.

And there are plenty of libraries and frameworks that can be pulled in to handle things like UI, compression, etc. The OP uses imGUI which is an excellent, small UI library for making in-game editors.

When choosing to go down that path you're not making, "an engine for all games." So there is a ton of work you're not doing.

lukan

It is still a lot of work.

And every external libary you do pull in, to ease some of the workload, is just waiting to go abandonend next year. So instead of focusing on release by that time, you will now focus on reinplementing that needed functionality that just stopped working.

Narishma

> So instead of focusing on release by that time, you will now focus on reinplementing that needed functionality that just stopped working.

That makes no sense. A library being abandoned doesn't mean it suddenly stops working.

agentultra

Definitely, it’s a trade off. Pulling in dubious dependencies can be a risk. Might be worth writing your own library or forking the dependency and vendoring it in your source.

There’s a spectrum of options here.

cobalt

This is really the case for all engines. Unity is a bit of of an outlier, though took a long time to get where it is.

Unreal Engine is really the Unreal Tournament/Gears of War engine at its core.

Good engines are those that are focused on what the game needs. YAGNI/KISS apply here too

insraq

I have recently done an engine rewrite for my sequel game and I very much agree with this. In my postmortem[1], I wrote:

> Most people think of a “game engine” as code that is shipped with the game executable. However, that’s only half of it. The other half, which I’d argue is more significant, is the code that is not shipped with the game - level editors, content pipelines, debugging/profiling tools, development workflows, etc.

Writing tools is arguably more boring and tedious compared to writing an engine, and that's where lots of "making a game with custom engine" type of project grinds to a halt

[1] https://ruoyusun.com/2025/04/18/game-sequel-lessons.html

philistine

So that’s where Chris Robert’s billion dollar went.

raincole

> Engines are the easy part.

> The real meat & potatoes is all the tooling and content and asset pipelines around the engine.

When people talk about engines they often include the asset pipelines and editors by default. Engines today are not just a main loop + 3D API calls. Very few devs will say we're going to use Unity but only for its rendering code.

(Of course I'm not implying as long as you use Unity/Unreal you'll never need to write your own asset tools.)

pwitvoet

Writing an editor from scratch is a lot of work. That's one reason why I would use an existing editor whenever possible. For example, TrenchBroom (Quake editor) + func_godot seems to be getting more popular among Godot users, and Tiled looks pretty good for 2D games. For game data management I've seen CastleDB (never used it though), which now seems to be integrated into Hide, a full-blown 3D editor.

Either way, once you get the tooling up and running, the next big step is actually designing a game and creating all the content. :)

leonard-somero

It really is a miracle that any video games get shipped at all.

corysama

At the indie studio I used to work at, we had some folks with engine experience. So, we rolled our own 3D engine and asset pipeline from scratch. But, we didn't have the budget for an editor. Instead we set up the asset pipeline to hot-reload everything. Meshes, scenes, materials and animations from Maya. Textures from Photoshop. Audio as a pile of WAVs. Scripting in Lua. UI layout in XML. Changing the asset files would change the game live.

Then we added "State machines as Lua exported from Excel". Rows are states, columns are events, cells are code to execute given a state+event combo. I've done this a few times. It makes huge state machines manageable.

Our games were very stats-heavy and our designers liked Excel. So, a new thing we added as "Dynamic data sources as grids of Lua exported from Excel". So, fill out Excel sheets like normal. But, instead of Excel script, every cell is evaluable Lua code. Strings, numbers, bools, functions are all values in Lua. So, a cell might contain a number. Or, it might contain a function checking the contents of two other cells and optionally triggering an event on some other object.

We shipped multiple games on a single executable using this system. Artists could lay out 3D scenes and 2D UIs with hooks for the Lua to control it. And, the designers could populate scenes and UIs from Excel dynamically according to the state of the game. The programmers mostly worked on game-agnostic features in C++, and the heavier side of scripting in Lua for game-specific features.

Aside: Lua is being so dynamically typed makes it not great for large-scale software engineering. But, https://teal-language.org/ might be a good TypeScript-For-Lua. I haven't tried it. Also, are there any Lua debuggers newer than the ancient https://github.com/unknownworlds/decoda that require zero integration? Decoda just need a pdb of your executable and it can automatically debug any scripts passing through the Lua library.

Eventually, we switched to Unity for corporate reasons. As a primary implementer of our custom engine, I think the switch was overall a good thing. Our games had started to outgrow what our little engine team could deliver. The artists reported they felt slightly less productive working in Unity's editor. I switched roles to finding and working around the undocumented bugs in Unity that we ran into. Then later finding which bugs had been fixed without being mentioned in the release notes so I could delete my work-arounds. It was a very boring couple of years until the company burned to the ground because of the same corporate reasons that lead us to switch to Unity :P

munificent

> But, we didn't have the budget for an editor. Instead we set up the asset pipeline to hot-reload everything. Meshes, scenes, materials and animations from Maya.

I was the tools lead for "Superman Returns: The Videogame" (the PS2/X630 Superman game, no the N64 one). We did the same thing. All of Metropolis was essentially "modeled" in Maya with plug-ins handling importing and exporting between that and the in-game format.

It was an open world streaming game and it would have killed an artist's machine to try to load the entire city into Maya, so the plug-in would let an artist pick which chunks of the city to load, load them in, let them make changes, and save the results back out.

It worked out fairly well.

slippy

Have you tried Luau - Roblox's open source compiled Lua with Types? Someone made a debugger for it that plugs into Visual Studio Code.

https://github.com/luau-lang/luau/ https://github.com/sssooonnnggg/luau-debugger

I'm working on an engine based in C++, Luau, and OpenGL - started almost 2 months ago. I aim for it to me MIT license open source, but it's too early for sharing. When it is, I do plan to post a show HN with the Github link.

corysama

I have not, but it looks great!

jayd16

The usage of Excel is so hilariously cursed I can't stop thinking about it. Its just raw memory address look ups with extra steps. How did you merge the Excel file? Did you actually have source control on this?

Ok maybe a sheet is fine for a state machine if you don't care about visualizing transitions... Why reference cells when you could have named functions in a source file that could actually parse the syntax? That file would be trivially merged. You want to be loose on types so I guess its fine but you could actually have type safety and linting all the other language features and tooling if you just used a file full of named globals.

The mind boggles

corysama

> visualizing transitions

In systems where we used this it was common to have 100+ states x 100+ events. Visualizing that would have been fun, but not useful.

One implementation had layerable sheets. So, you could define a base state sheet and multiple overlay sheet that the game could enable dynamically on major changes.

Within each event column there would be long, broken up runs of "do the same thing" for runs of states. So, you could define a chunk of code in a cell below the main table and reference it in the runs and it would show in the main table.

Almost all functions were trivial. 1 or 2 statements. "Modify a value. TransitionToState X". There would be hundreds of these little snippets in a sheet. Naming each one would double the complexity for no gain. Let alone having function signatures. They'd all be `void randomName(event)`. And, Lua's a dynamic language. You aren't going to get much error checking in an IDE. Better to just keep everything local to the sheet rather than flipping between Excel and VSCode.

And, in the implementation discussed above, most of the cells were full of numeric/string values or references to assets.

lukan

I guess the main disadvantage with a custom engine vs Unity, is that you must train new people in it all, vs hiring experts in the tools.

Your custom engine sounds interesting, though. I can recognize some thoughts ..

whstl

This is so cool and clever!

Scott Bilas also documents doing something similar for Gabriel Knight 3, one of the “grandfathers” of data-driven engines and bit of an influence on ECS.

Instead of excel however it was comma-separated text files that shipped with the game. During development could edit the files locally and reload the data without recompiling.

Since we’re in a web heavy forum: An sql database and a web editor would also allow for a distributed workflow.

wsc981

There's the Local Lua Debugger [0]. I don't know how it compares to decoda, but I experimented a bit with this debugger last weekend and it seems nice enough - well integrated into VS Code.

---

[0]: https://github.com/tomblind/local-lua-debugger-vscode

corysama

The magic of Decoda is that you can download the debugger and immediately start debugging your existing program with no modifications. No libraries. No sockets. No changes at all.

Decoda uses your PDB to locate the Lua C library within your .exe and the Win32 API CreateRemoteThread to inject the code into your process to hook the Lua API.

aleph_minus_one

> The real meat & potatoes is all the tooling and content and asset pipelines around the engine

This depends a lot on the type of game that you create. For example, if a lot of content is procedurally generated, for example the map editor can be simpler, and you need less kinds of data formats to import. Also, some genres require a lot more "external content" than other genres. Even if you keep the genre constant, you will find games where the "value proposition" lies more in the game engine vs those where the "value proposition" lies in the assets.

In particular for indie games, you can be much more flexible on how you structure your game compared to AAA titles.

JKCalhoun

This is basically what I did a couple years ago [1]. SDL2 and a bit of C++ to create a "sprite" class. Some collision code in the sprite class...

If you want to call what I added an "engine" it was more like a pedal-assist bike.

Too often I find "engines" end up driving the project/game. That is, you end up writing the game to the engine. It's why I've avoided Unity, etc. — high-level engines like that seem to guide you to writing the same game everyone else is writing — just with different assets.

Never mind you spend too much time, in my opinion, learning the engine and not getting the game written. To be sure there was a learning curve just pulling in SDL, but the curve was slight and it seemed more universally useful to know SDL as it can be employed in other cross-platform projects I might undertake — not just games.

[1] https://store.steampowered.com/app/2318420/Glypha_Vintage/

symfoniq

Just wanted to say that I remember playing your game as a kid on the family Mac IIci. Thanks for the fun memories, and best wishes.

oliverdzedou

Many people often say that making an engine from scratch takes too long. But how long does it take to properly learn Unreal or Unity such that you can have an idea and turn it into a game without friction? Presumably, once your engine is finished, you are at that level of expertise instantly, which is a huge time saver. In my opinion, the more experienced of an engineer you are, the more the scales tip in the favor of rolling your own, from a time-spent perspective.

The more unique and niche your game is, the more true this is. Stumbling around Unreal's horrid UI for 3 months just to realize that the thing you want to do is barely even possible due to how general and off-the-shelf the engine is, is not a good experience. On the other hand, if you want to make a hyper-realistic, open-world RPG, then rolling your own is probably not a good idea.

I also believe that even if it's not always the most efficient thing to do, placing limitations on yourself by using a custom-made specialized engine makes the creativity really flow, and your game, even if not the most advanced, will be a lot more unique as a result of that.

kgeist

>Many people often say that making an engine from scratch takes too long. But how long does it take to properly learn Unreal or Unity such that you can have an idea and turn it into a game without friction? Presumably, once your engine is finished, you are at that level of expertise instantly, which is a huge time saver. In my opinion, the more experienced of an engineer you are, the more the scales tip in the favor of rolling your own, from a time-spent perspective

I once experimented with creating my own game engine. It took me about a year of building and learning along the way (through trial and error, with many dead ends initially). It featured lots of things you'd typically find in a game (3D rendering with all the bells and whistles, an adaptive UI framework inspired by flexbox, skeletal animation, a save file format, a smart object system, path finding, a scripting language, audio, physics, et cetera, et cetera)

Specifically, I tried to recreate Braid's system (without knowing it existed), where you can rewind your game to any point in time. It required support from all the engine's subsystems - to rewind scripts, physics, etc.

Knowing every little detail about your game engine was certainly a plus. After the engine was more-less complete, adding a feature, however ambitious it was, took about a couple of hours at most. When something didn't work, I knew exactly what was going on.

However, after a year of building, I was somewhat exhausted, and all my motivation to continue disappeared :)

Jyaif

> Specifically, I tried to recreate Braid's system (without knowing it existed), where you can rewind your game to any point in time. It required support from all the engine's subsystems - to rewind scripts, physics, etc.

Not necessarily. You can write your own "snapshotable allocator" that allows you to rewind back in time anything, even the state of unmodified 3rd party libraries and interpreters (as long as you can configure them to use your allocator).

I wrote about it in https://www.jfgeyelin.com/2021/02/a-general-state-rollback-t...

kgeist

Feels like fiddling with snapshotting raw C++ memory is a can of worms (you listed some of the pitfalls yourself). Most of my snapshotting happened at the scripting runtime level, where everything is well-defined and well-understood: I manually snapshotted the VM's heap memory, the green threads' stack memory, the current instruction pointer of every green thread etc. I could safely validate those snapshots without segfaulting on a corrupted savefile, because it was a well-defined file format. The same code worked both as a time-travel snapshotter and as a general savefile format.

I think this is dangerous and can lead to remote execution attacks:

>The snapshot could even be exchanged over the network, assuming the receiving side has the same endianness, the same pointer size, is running the same binary, and can mmap the same memory location.

For physics, I needed to restore all those remembered motion vectors; for audio - current playback time, etc. Same as yours:

>The rest of the memory (the textures, the 3D models, the audio, the UI, etc...) should be allocated by your usual non-snapshotting allocator"

Narishma

> It featured lots of things you'd typically find in a game (3D rendering with all the bells and whistles, an adaptive UI framework inspired by flexbox, skeletal animation, a save file format, a smart object system, path finding, a scripting language, audio, physics, et cetera, et cetera)

But did you actually need all of those things?

npinsker

I am not familiar with Unreal, but Unity is much faster than programming from scratch, easily 10x or more.

One obvious example is physics behavior, which you can add to your game in under a minute, but with your own engine you'd need a day or two to properly integrate an external library. All the internal state visualization that Noel's showing off here is already built in by default in Unity. It has nice tools to draw and modify bounding boxes, and in the rare cases where the engine's behavior isn't enough, it's highly extensible (using ImGui or Unity's Yoga-based CSS engine, which I prefer). Unity has countless features like this: a sophisticated particle editor, a high-level "write once, run anywhere" shader language with enormous amounts of complexity abstracted away, systems for streaming and keeping track of modular data, and much, much more.

In an ideal world, I'd want to write these things myself, but time ticks away and unfortunately I'd prefer to prioritize finishing games more quickly.

Sander_Marechal

At this point using any engine instead of unity is better. Unity has demonstrated time and again that they cannot be trusted and that you cannot build a game (or business) around them.

npinsker

Sometimes you have to do business with counterparties you don't trust. It's not mature or practical to take an "all-or-nothing" approach while the engine has virtually no competition for many classes of games.

some-guy

Do you have any developer retrospectives around this? Plenty of my favorite games ever made were made with Unity, I wouldn't call those games failures by any means (Cities: Skylines, Overcooked are immediate examples)

archagon

At least as far as platformers go, physics feel is a crucial part of the whole experience, and outsourcing to an engine has a good chance of making your game feel cookie-cutter.

maccard

> I am not familiar with Unreal, but Unity is much faster than programming from scratch, easily 10x or more.

With the caveat that the editor for Unreal is massive and getting it running requires more resources than Unity, Unreal's Blueprint is a great way of writing gameplay logic. It's accessible to people who don't know C++ or C#, and is a really nice abstraction for async/event driven code. It's a really good place to start with IMO.

Arwill

>On the other hand, if you want to make a hyper-realistic, open-world RPG, then rolling your own is probably not a good idea.

I would say its the exact opposite to that. For that genre, its best to roll your own engine, or pick something open-source. The list of problems that i firsthand experienced:

There are lots of features and options in the engines, but they are not all usable at the same time. One feature disables the other. You look at the list of all the nice things the engine can do, but then at some point you figure it can't do (or can't efficiently do) what you absolutely need. All those awesome looking graphics are not practically usable, simply not performant or not compatible to be usable.

There are features that only work in "baked" mode. You "bake" it in the engine editor, and there is no way of changing that at game run time. Unreal is the most limited in this, but Unity is not much better. Some game developers reverse-engineer Unity internal asset formats with a hex-editor, so that they can change feature behavior at runtime. At that point, rolling your own engine makes more sense. One example i saw was a developer reverse engineering the light probe group asset file, so that he could add a new light probe group at runtime.

Engine API's change drastically from version to version. All the code and scripts need refactoring, all the time. You run into a breaking bug, and the only solution is upgrading, but upgrading means breaking your whole codebase.

You need to go trough the engine's abstractions, and bad luck if that can't be done efficiently. An example of this: Unity HDRP applies screen-space ambient occlusion (among other effects). It applies the effect over the whole screen. If there is a third-person view of the character from close or first-person hands/weapons rendered, then even over that. That results in a white halo around the first-person hands/weapon, looks bad. In a custom engine, the solution is simple, apply the full-screen effect before the first-person hands are rendered, then render the hands without the effect. Its a matter of switching the order of a couple of lines of code.

The solution is github and the BSD/MIT/Apache licensed game engines and libraries.

jayd16

I think you'd probably want a different render layer with different post effect settings so your weapons can have post-processing as well. I think you can do this in the editor with gui configs instead of changing code.

I'm pretty sure all of SRP is in C# and is "open source" as in source available and editable.

https://github.com/Unity-Technologies/Graphics/tree/master/P...

Arwill

The problem with GUI settings is that the result is not apparent, and there might be side effects. I do not find spending half day on trying out setting combinations as productive work.

I have looked into SRP and i do still consider that as an option, and also replacing the shaders. But i have doubts regarding the SRP, for example i have looked at the code that sorts lights in Forward+. The individual light calculations are not much, but its still done trough the job system. I imagine if there are hundreds of lights, then that would make sense, but for 2-5 lights, it seems like a waste. So it might be optimised to scale, but not for my case.

Is the effort of replacing the SRP worth it, and is the performance comparable to putting together/reusing an engine in C++? It is also a bigger commitment, as it needs to be coded on a different level and in a way very specific to the engine. Better than having to reverse asset file formats, but still very specific to the engine.

maccard

> Many people often say that making an engine from scratch takes too long. But how long does it take to properly learn Unreal or Unity such that you can have an idea and turn it into a game without friction?

You've asked two different questions - how long does it take to properly learn Unreal or Unity, and how long does it take so you can have an idea and turn it into a game without friction? If you gave me a half baked idea we could be playing it in a few hours with both tools. Unity requires programming up front, but Unreal you can get well into "I can almost ship a game" (particularly if it's a single player game) with just blueprint.

Here [0] is a 10 minute video where someone prototypes a super hexagon style game in 10 minutes. Obviously, this isn't feasible without knowing exactly what you're building, but I think this shows just how powerful these tools are for building out these game ideas. There's very little unity specific stuff in there, other than components. Everything else is stuff that I would classify as "gamedev agnostic" - input handling, update vs fixedUpdate, vector math, sprites, etc. The prefab for the spawner is about the only unity-specific thing in that video and it takes up about 15 seconds of the 10 minute video. I'm a game developer (Unreal) and I'd wager I could put together a similar prototype in about an hour in Unity, give or take

[0] https://www.youtube.com/watch?app=desktop&v=p8MzsDBI5EI

xandrius

> Once your engine is finished

Most likely never?

Obviously understanding what `GameObject.Instantiate(myPrefab, Vector3.zero)` takes several orders of magnitude less than implementing all that is required to properly perform that, even for such a basic operation.

Imagine when it comes to 2D/3D physics, shaders, platform support, etc.

If your goal is to build an engine, build an engine. If your goal is to actually deliver a game, build a game.

jayd16

> But how long does it take to properly learn Unreal or Unity such that you can have an idea and turn it into a game without friction?

If you have enough game dev knowledge to make an engine...then it's seriously like a day to learn these things to begin to bang out a prototype.

They take a long time to master but if your goal is to work on the game its not in the same universe of turn around time.

interludead

If your vision is weird or niche, building a toolset around that from day one can be way more efficient in the long run

maccard

Games like Antichamber do non-euclidean space and rendering in Unreal (3). Enera (an upcoming action game) manages time rewinding (a la braid), in Unreal. Superhot is Unity, etc.

The best tool is the one you know, even if your vision is weird or niche. At the end of the day, you can always ignore all the bits and pieces unity gives to you and just write custom logic in your MonoBehaviour scripts and use it as a platform toolkit, input handler, content pipeline, scriptable editor, and renderer. There's a lot to be said for the features you get from that especially in the long term as you said.

interludead

I think my point was more that if your vision diverges heavily from the "normal" flow of those engines, sometimes it's just less friction to build your own

jbverschoor

I think there’s a misconception due to the large overlap between games, graphics, and physics engines.

Graphics are anything from rendering 2d, 3d, shaders, scene graph, animation.

Physics and related interact with the scene graph.

The game part allows for dynamic behavior and of course the game logic/triggers.

Add some ui, and resource management, abs lastly of course ai.

Creating your own engine with different architectures is indeed the best way to learn how/why an engine works. But alll the details that come with it. That’s really a lot and probably way too much for one person. You’d be surprised how much is in there (in unreal engine)

danielbarla

> I genuinely believe making games without a big "do everything" engine can be easier, more fun, and often less overhead. I am not making a "do everything" game and I do not need 90% of the features these engines provide.

At that point, of course, you don't need the engine. Having said that, every time I've really deep-dived into some particular feature of an engine - such as inverse kinematics and animation blending in Unreal - I've come away thinking "boy, am I glad I didn't spend several weeks trying to code that up from scratch".

There's definitely an argument to be made for minimalism and anti-bloat, but the reason engines are popular is that they really do some heavy lifting for you.

canpan

I was like this in the past. Making my first 3D game: After weeks of implementing all input, object management, culling, model loading, math lib, gfx, normal mapping, SSAA,... I had 0% progress on my game.

However, for my fun hobby 2D projects, I still self roll without dependency in the web canvas. You could call the browser an engine though.

gyomu

> “boy, am I glad I didn't spend several weeks trying to code that up from scratch".

If your goal is several decades of a career as an independent developer (like OP), what is an investment of a few weeks for a) understanding a topic deeply and b) having source code that you deeply understand, 100% own, and can reuse across future projects?

yakcyll

It's worth remembering when deciding on rolling out your own engine that this is a multi-layer trade-off as well, I have an anecdote on this.

I have decided a couple years back that my setup will have a hand-rolled physics engine, specifically for the reasons you outlined - having complete understanding over what the code does, how it's structured and how it manages data - but after starting actually-not-so-arduous process of getting it together, it quickly became rather clear that whatever I could implement would pale in comparison to solutions that are robust, field-tested and generally created by professionals.

Physics development in particular is known for wonky nonsense, but there are better and worse heuristics and ways to deal with their shortcomings; a handful of books and Youtube presentations still couldn't prepare me for the actual depth of the problems ahead. What I have now works, is relatively stable in initial demos and I am proud of it, I'm going to tweak and use it in the game I'm working on. It is however pretty obvious already that a lot of time is yet to be spent on massaging jank out of the equations.

I wholeheartedly recommend spending more than several weeks on implementing various subsystems if one either is generally interested in how these things work or silently wishes for that badge of honour (it shines brightly). However, as they say, if you want to make games, do NOT make an engine. Not just because of the time it takes - it doesn't have to take that much (even though it usually does) - but also because along with total control over the medium for expressing your creative vision, it gives you total responsibility for it as well. Sometimes it's better to work in the confines of rules set out by actual engine developers.

meheleventyone

There's levels to that though. For example it took me all of a week to write the 2D rigidbody physics system that runs this game:

https://www.youtube.com/watch?v=zVmd2vmZrVA

But it's tightly scoped, there is only really one thing that needs to be dynamic, although it worked admirably with more. We wanted big impulses so could get away from questionable cases easily and could deal with crushing cases simply by exploding the ship.

Likewise the players on the ship running around and the players when they're jetpacking about are all different sub-sets of code implementing that specific behavior.

A lot of "make a game, not an engine" is working out what the minimal thing you need to build is rather than making everything extremely generalized.

ido

I'm in the same demographic (less successful than Noel, but I have made my living from game dev for the last 15 years, a lot if from my own indie games). I've used multiple engines throughout that time as they seem to have a lifespan before either tech or business reasons obsolete them (e.g. my first commercial release was made with Flash).

My only regret were the times I tried to roll my own, I would have saved a lot of time and effort focusing on picking the best tool for the job that saved me as much work as possible.

At the end I want to make games and not engines, and only do as much programming as I have to. All those person-millennia spent at epic/unity/etc actually spent doing a lot of stuff (even if you don't need 90% of it, 10% 1000s of people working for decades is still a lot).

chickenzzzzu

Face it, you just don't know how to do it and are trying to convince yourself that you don't need to learn how to

danielbarla

I get the argument, and sure, it's viable in certain circumstances. But it's a few weeks _per area / topic_. In my opinion there are enough areas in a typical engine that you could study them for a year and not get through the material. There's graphics, audio, networking, physics, etc. I think the sweetspot is to understand each well enough that you have some insight into what the engine is doing for you, not necessarily to be able to (re-)implement it.

pjmlp

My graduation thesis was porting a particles visualization engine from NeXTSTEP/Objective-C into Windows 95/Visual C++, based on OpenGL, with samples like marching cubes.

This is a single bullet point on modern engines feature list.

null

[deleted]

gyomu

And now that you’ve done it, you could probably reimplement it better in a fraction of the time.

pjmlp

Except that I wouldn't, because most of that stuff would be a shader nowdays, and depending on the API version, not the same kind of shader.

This kind of stuff is fun, if the end goal is to become a game engine or tools engineer, if the goal is to make a game, it is mostly yak shaving.

mlvljr

[dead]

billfruit

Also using an engine allows us to make progress on the project itself, rather than sinking major time into building infrastructure.

Reinventing the wheel isn't that fun for most people.

pjc50

On the contrary, lots of people enjoy the reinventing the wheel part as a means of avoiding all the tricky creative choices and risk of actually shipping a completed game.

StefanBatory

It does feel like for many people, it's a form of procrastination and escapism. I'm still working on the game, I just need to do this and this and this first.

Of course - sometimes you just need to learn how it works below, but if your goal is to ship, and you don't have a lot of time, then what I said strikes true to me.

ben_w

Me, too many times.

I think this is also true beyond games, e.g. for all the different UI libraries.

bob1029

This happens absolutely everywhere. Many B2B SaaS products could have been a single T-SQL script in MSSQL or some other paid/non-OSS/evil capitalist equivalent.

I think a lot of developers lean on ideological angles to deflect rational criticism of their lack of progress and direction.

Unity and Unreal are absolute powerhouses if you have an actual idea and a burning desire to express it as quickly as possible to as many customers as possible.

monkeyelite

> inverse kinematics and animation blending

Either this is a central feature of your game, and writing it is worth it. Or it’s a technical boondoggle, and you don’t need it.

iFire

Heh, I contribute to a FOSS social vr project called https://github.com/v-sekai and the majority of the multi year effort was asset pipeline, ik and animation blending. Yes we donated the code to Godot Engine but we choose working on the tooling problem rather than the game… The V-Sekai game is in limbo / not a game. We made godot-vrm which does 3d avatars, with basic animations, look at, jiggle and copy constraints. Since we’re unable to use the unity ecosystem’s finalik or unreal engine’s control rig we have to code to the same level of professional quality with no budget. Features like stable multi-joint y-branching rotation and position constraints are hard. Feel free to chat in V-Sekai discord. I’m iFire.

arminiusreturns

Using Godot for my big project, thank you for donating the IK stuff to godot!

jayd16

This is table stakes for any 3D animation, these days. Anim pop is embarrassing and almost certainly you'll want look IK let alone any of the more complex usage.

monkeyelite

> This is table stakes for any 3D animation

You’re doing 3d skeletal animation for your indie game? How many skeletons and animations are you going to make?

And you don’t consider it a central feature?

raincole

It's just so wrong. These things are very standardized, and you often just want the common implementation that everyone is using. Writing these in most cases is like writing your own SHA256.

monkeyelite

Is your indie game more complex than quake 3?

andrewflnr

Blatantly false dichotomy.

monkeyelite

Or You simply aren’t ruthless enough about how much time you have on an indie project.

rishflab

animation blending isn't that bad. If you have a two poses represented as lists of quaternions and positions, all you have to do slerp between the quaternions and lerp between the positions.

FABRIK IK algo is a ~100 loc function.

danielbarla

Agreed, though getting to that point of understanding is what takes time. Also, there are literally dozens of similar topics where a solo dev should be happy to take any help they can get, IMHO. I'm sure audio is similarly easy, as is input, pathfinding, AI decision trees, physics, etc, etc.

rishflab

physics is not easy. its pretty challenging and has unending scope.

audio can also have unending scope if you want to do physically simulated Spatial Audio.

Im not sure if AI/pathfinding are worth developing as part of an engine. I feel like their implementation is heavily dependant on the game type, engine implementations often get in the way, rather than helping.

rendering is a beast, especially if you need a long draw distance and have a world that doesnt fit into gpu memory.

The whole task of putting all the pieces together into a cohesive package is a huge undertaking as well.

thorn

I am always super curious to read such posts. They make me happy for no reason. I do not make games these days, but I love to read about excited and happy people explaining the process they love to do. At the same time I learn new perspectives to understand what is going on in the world of indie games. I keep this (not so) secret wish in the back of my head because I have to work for some money to support my family and my country (Ukraine). Maybe some time later I will do more of games...

Thank you for writing this post, Noel!

davedx

It’s also refreshing to see what IMO is a very smart selection of technology, when you see so many other people following hype (I’m reminded of the rust gamedev post the other week). C#, SDL3, and some other nice libraries. The thing is, it’s not trivial to get to the point of having enough experience and judgement to know what to choose!

When I start a new game I’m often paralised by the sheer volume of engines out there. When I first started making games all I had was GWBASIC…

gyesxnuibh

My take away with the final statement of rolling it yourself if it sounds fun is to pick whatever technology that gets your pen on the paper so to speak.

If unity gets you making the thing or making the engine gets you making the thing, most important thing is motion.

You gotta avoid the paralysis and just pick the thing that seems feasible and start typing ;).

msephton

I use Lua & Love2D to make games with a similar ethos. Being able to set my own constraints is fun, and that's what game dev is about for me. As soon as something stops being fun, I know I'm doing it wrong and there must be a better way.

My game YOYOZO is a tiny 39KB but made it to Ars Technica's "Best Games of 2023" list alongside heavyweights like Super Mario Wonder and Tears of the Kingdom! https://news.ycombinator.com/item?id=38372936

hbn

Hey I recognize that game, great work!

I've had my Playdate for a couple years but it was only this past weekend I finally got inspired to start playing around with the SDK like I've been telling myself I would since I bought the thing.

I had never used Lua prior to now so that's also part of the learning experience. I'd really like some strong typing and some other language safety features, but it's good for what it needs to do. So far all I've made is a little tech demo of text that rotates around in fake 3D space in relation to the crank, like the iOS options picker. Clip here:

https://bsky.app/profile/haydenblai.se/post/3lpgnya4cqk2a

The other thing I learned from this project is I forgot more trigonometry skills than I thought in my years of CRUD/webapp development.

One of the best things about developing for Playdate is how freeing it is to have a fixed canvas that you're drawing to. I'm so used to having to make all my UIs responsive, I love being able to just position something at a pixel value and know it'll work on everyone's device.

hernandipietro

Congratulations man, great work.

msephton

Thanks so much, it's appreciated.

throwawayffffas

For anything I have ever tried to make, I always find myself fighting the engine. Whether it is Godot, Unity or Unreal.

They all feel like a ready made game that you add assets and mod. The problem for me is that I mostly don't want to make that game.

An analogy that comes to mind from the web dev world, it feels like the engines are like wordpress. Prebaked and ready to show content, but the moment your objective does not completely align with their preconfiguration you have to do a huge amount of hacking and workarounds.

ivanjermakov

What adds oil to the flame is a bunch of "game templates" that you can buy and make your own game just by replacing the title screen and some models. E.g. https://assetstore.unity.com/packages/templates/systems/stor...

And if you open Steam games and go to the newest, you see that nearly half of the releases is some version of a generic Unity/Unreal template game in a slightly altered "skin":

https://store.steampowered.com/app/2488370/Cash_Cleaner_Simu...

https://store.steampowered.com/app/2073910/A_Webbing_Journey...

https://store.steampowered.com/app/3498270/Better_Mart/

https://store.steampowered.com/app/2625420/Drive_Beyond_Hori...

https://store.steampowered.com/app/3163790/Toy_Shop_Simulato...

https://store.steampowered.com/app/3023600/Horse_Farm_Simula...

https://store.steampowered.com/app/3124550/Liquor_Store_Simu...

iFire

Ha, if I remember correctly the squad military sim was a reskinned first person demo from epic games.

moron4hire

Exactly. If you want your game to look exactly like every other game on Google Play, complete with all the same, long, janky splash screens and rendering hitches and slightly screwy text rendering and random audio glitches, use Unity.

All that might be acceptable for an adware befouled "idle RPG" style game on mobile (and they're all that kind of game these days). But it really galled me that people were using Unity so heavily for VR. It's extremely difficult to get a Unity game to work well on the standalone VR headsets. To hit the performance targets required by the Meta Quest Store, you really have to rewrite large portions of the engine to get around the fact that Unity is a disorganized, single-threaded, allocation-happy mess.

If you want your game to be a quality piece of software, you can't start with a garbage as your foundation.

MattRix

There are games in many different genres, many different aesthetics, many different amounts of polish, and many diffrent levels of performance… all made with Unity. It’s true that they provide a bunch of baseline stuff so that low effort games look and feel similar, but it’s not that hard to end up with game made in Unity that feel unique.

trollied

Just to note that the author wrote this game, >3 million copies sold: https://en.wikipedia.org/wiki/Celeste_(video_game)

Lichtso

Made me realize that most of the games I really enjoyed have their own custom engines (made for a single game or franchise): Starbound, Stardew Valley, Minecraft, Factorio, RollerCoaster Tycoon, Empire Earth, The Sims, Project Zomboid ...

Only exception might be Portal, but even that is using an in-house solution mostly for developed for one franchise.

Like with most things: If you are new and have to learn everything or if you actually need to pump titles out you should prefer quantity over quality and the major game engines are the way to go. But, if you really want to polish something it will require a long long time and then investing in engine development can pay off. The trap is starting with the later if you haven't made a few dozen games yet and never shipped anything. Then it will stay that way.

jebarker

Just to clarify, are you saying that if you've never shipped any games then you should start with an established engine and only go artisanal once you have that experience?

Lichtso

Yes, pretty much. I don't say the custom engine first path can't work, heck I did ship my own games on custom engines first myself, but it is probably not the path of least resistance.

dismalaf

This... I don't think I've ever truly enjoyed a Unity game. Maybe KSP, but it runs like shit and isn't a good advertisement for that engine. Even Unreal Engine: I've only enjoyed Unreal itself.

bscphil

There are definitely some Unity games I've really liked - the Ori games, Hollow Knight - but the engine has never been a positive of my experience with the game. They're full of jank and physics bugs, and in a weird hard to describe way kind of feel "alike". You know you're playing a Unity game, which is bizarre for a part of the game experience that's so low level.

kkukshtel

I agree with a lot of this, and am similarily working on my own code-only C# game framework meant as a spiritual successfor to XNA/Monogame (using Sokol instead of SDL):

https://zinc.graphics/

In OP's post as well he brings up some of the main factors that make modern C# incredible:

- Cross platform development (and runtime).

- NativeAOT Compiling (great for consoles, provided you have backend headers).

- Native Hot-reloading.

- Reflection

I'd also add:

- Source Generators

Modern C# is incredible. I think people still discount it due to its admittedly bad legacy, but the past five years of C# and CoreCLR development make me feel like it's truly a language that has everything necessary but isn't baroque or overburdened. My only major request, Union types, is also in proposal and will (hopefully) come in the next year or so:

https://github.com/dotnet/csharplang/blob/main/proposals/Typ...

w4rh4wk5

Out of curiosity, do you have some pointers for getting into C# for these kinds of projects? I've only used C# for standalone win32 applications and inside of Unity.

I am familiar with low-level game engine stuff in C/C++, but always discarded C# as not being viable for cross-platform projects (as in game consoles). Guess I was wrong. :)

z3t4

I like to start all my software projects from scratch. Everyone who are used to working on large software projects know that it's very slow. But starting from scratch is fast! You just implement the bare minimum. But also on later stages of the development when you have abstractions going, then it becomes even faster to implement new features. Working on an enterprise software project and your own engine that you've written from scratch is nothing alike, you can work 1000x faster when you have written the thing yourself and can just cut out and refactor everything you want. This is why I advocate micro service architecture and small teams. Things are much smoother when you do it yourself and from scratch. There are however landmines you have to hit and it will take years of trail and error until you get a feeling for what architecture and abstractions work and which doesn't as well as learning the in and outs of the language and platform you are working on.

leonard-somero

I'm an indie game developer with over 10 years of experience. I'm not using Unity or Unreal, but I do have some frameworks that handle things like rendering graphics or playing audio. However, I write all the game logic, data manipulation, and entity management from scratch for each game I make. It seems to be the smoothest option for me, since I have full control over how my games actually operate, but I don't have to reinvent the wheel as far as the low-level architecture goes.