I started this devblog 11 years ago (wow!) to showcase the game development tech I had been working on in my free time.
Almost three years ago I (finally) got a job in an actual AAA game dev studio. In those three years I've been busy working on several games but I've also been very active on a private, internal devblog shared by the studio.
Unfortunately, that leaves little desire to write different devblogs in my freetime. On a positive note, I'm scratching the devblog itch with something officially supported by my employer, which is great.
So the lack of posts here shouldn't been seen as me no longer working on any game dev projects. In fact, quite the opposite is true.
I'm not going to commit to posting here more, because that frankly seems untenable. I hope to keep up the minimum of one per year, which I barely hit this year.
Onward to 2020!
Following my adventures in various graphics projects. These mainly consist of procedural development, image processing, and physics.
Tuesday, December 31, 2019
Thursday, February 15, 2018
NuGet For Unity Released!
In my free-time for the past several years, I've been working on building a NuGet client from scratch that runs entirely within the Unity Editor.
I have finally launched NuGet For Unity onto the Unity Asset Store. It is completely free and open-source, so have at it!
Asset Store: https://assetstore.unity.com/packages/tools/utilities/nuget-for-unity-104640
Source Code: https://github.com/GlitchEnzo/NuGetForUnity
I have finally launched NuGet For Unity onto the Unity Asset Store. It is completely free and open-source, so have at it!
Asset Store: https://assetstore.unity.com/packages/tools/utilities/nuget-for-unity-104640
Source Code: https://github.com/GlitchEnzo/NuGetForUnity
Saturday, July 22, 2017
Making Blender Like Unity
I'm not an artist let alone a 3D modeler. Whenever I open a 3D modelling app, I quickly become frustrated due to cumbersome user interfaces that are different than everything else I'm used to. Game editors and videos games don't have user interfaces even remotely similar to 3D modelling apps.
Several years ago, I was able to tweak Blender to behave somewhat like Unity. However I soon after lost that computer as well as the configuration. I kept meaning to configure it again, but I never remembered what I had done.
Today, I finally installed the latest Blender (2.78c) and decided to get it configured correctly again. Here is what I did.
1) Open the User Preferences
In the Info window (the default menu bar on the top), select File → User Preferences
In the User Preferences window click the Input tab
2) Make the Left Mouse Button the selection button
Blender is very strange in that it defaults to use the right mouse button for selection. Let's change that to the standard left mouse button. In the left column, set the left mouse button.
3) Ensure View Navigation is set to Walk
Blender allows for two navigation modes: Walk and Fly. Fly might sound like what we want, but it behaves more like a spaceship where the rotational speed is based on the position of the mouse onscreen and you use the mouse wheel to control "throttle". Walk is actually what we want, since it behaves like standard FPS controls. This is the default setting in Blender, but we should ensure it is set.
You should also ensure that the Gravity checkbox is unchecked (the default) to prevent falling due to gravity.
4) Create a new input configuration called Unity
We don't want to muck with any of the existing input binding configurations, so let's create our own. Click the + button next to the Blender/Max/Maya settings.
Give it the name "Unity" (or whatever you want) and click OK.
Ensure that is now your selected input configuration.
5) Disable the setting of the 3D cursor
Normally the left mouse button sets a "3D cursor" in Blender. I'm sure it's useful to many people but I find it confusing and gets in the way. Since we switched left mouse to be selection, Blender switches the right mouse button to set the 3D cursor. We don't want this, so we disable it in the input bindings.
3D View → 3D View (Global) → Set 3D Cursor
6) Create new input binding for Right Mouse Button to enter View Navigation mode
This took a bit of sleuthing, and is one of the most important parts. Blender lets you enter View Navigation mode by hitting Shift+F. Searching through the input bindings I found the Python command Blender binds to that key combo.
We now want to replicate that functionality for the right mouse button. In the 3D View → 3D View (Global) section, add a new input binding by clicking the + Add New button
Now, change the input to be when the right mouse button is pressed. Enter the view3d.navigate Python command to the binding. Like so:
7) Disable the Right Mouse Button from cancelling View Navigation mode
By default the View Navigation mode is cancelled by any right mouse button action. We want Blender to leave View Navigation mode when we release the right mouse button, but we want it to retain our final position and orientation. In Blender the is Confirm action, versus the Cancel action, which resets to view to whatever it was before View Navigation mode was entered.
In the 3D View → View3D Walk Modal section, disable the right mouse cancelling binding.
8) Add new Right Mouse Button confirmation
Now to make Blender save the position when releasing the mouse butotn, we have to bind it to the Confirm action. In the 3D View → View3D Walk Modal section, add a new input binding by clicking the + Add New button
Then, set the right mouse release to be confirm, like so:
Several years ago, I was able to tweak Blender to behave somewhat like Unity. However I soon after lost that computer as well as the configuration. I kept meaning to configure it again, but I never remembered what I had done.
Today, I finally installed the latest Blender (2.78c) and decided to get it configured correctly again. Here is what I did.
1) Open the User Preferences
In the Info window (the default menu bar on the top), select File → User Preferences
In the User Preferences window click the Input tab
2) Make the Left Mouse Button the selection button
Blender is very strange in that it defaults to use the right mouse button for selection. Let's change that to the standard left mouse button. In the left column, set the left mouse button.
3) Ensure View Navigation is set to Walk
Blender allows for two navigation modes: Walk and Fly. Fly might sound like what we want, but it behaves more like a spaceship where the rotational speed is based on the position of the mouse onscreen and you use the mouse wheel to control "throttle". Walk is actually what we want, since it behaves like standard FPS controls. This is the default setting in Blender, but we should ensure it is set.
You should also ensure that the Gravity checkbox is unchecked (the default) to prevent falling due to gravity.
4) Create a new input configuration called Unity
We don't want to muck with any of the existing input binding configurations, so let's create our own. Click the + button next to the Blender/Max/Maya settings.
Give it the name "Unity" (or whatever you want) and click OK.
Ensure that is now your selected input configuration.
5) Disable the setting of the 3D cursor
Normally the left mouse button sets a "3D cursor" in Blender. I'm sure it's useful to many people but I find it confusing and gets in the way. Since we switched left mouse to be selection, Blender switches the right mouse button to set the 3D cursor. We don't want this, so we disable it in the input bindings.
3D View → 3D View (Global) → Set 3D Cursor
6) Create new input binding for Right Mouse Button to enter View Navigation mode
This took a bit of sleuthing, and is one of the most important parts. Blender lets you enter View Navigation mode by hitting Shift+F. Searching through the input bindings I found the Python command Blender binds to that key combo.
We now want to replicate that functionality for the right mouse button. In the 3D View → 3D View (Global) section, add a new input binding by clicking the + Add New button
Now, change the input to be when the right mouse button is pressed. Enter the view3d.navigate Python command to the binding. Like so:
7) Disable the Right Mouse Button from cancelling View Navigation mode
By default the View Navigation mode is cancelled by any right mouse button action. We want Blender to leave View Navigation mode when we release the right mouse button, but we want it to retain our final position and orientation. In Blender the is Confirm action, versus the Cancel action, which resets to view to whatever it was before View Navigation mode was entered.
In the 3D View → View3D Walk Modal section, disable the right mouse cancelling binding.
8) Add new Right Mouse Button confirmation
Now to make Blender save the position when releasing the mouse butotn, we have to bind it to the Confirm action. In the 3D View → View3D Walk Modal section, add a new input binding by clicking the + Add New button
Then, set the right mouse release to be confirm, like so:
That's it! You should now be able to use the right mouse button to fly around a Blender scene just like in the Unity editor!
Friday, May 27, 2016
Unity Issues
I've been using Unity for over 6 years. While it has many aspects that I love, no engine is without issues. Over the years, I've encountered many of these issues, some of which I've found workarounds for. Several times now, someone will ask me, "Didn't you encounter this issue? How did you solve it?" And I'll usually answer, "Yeah, I've encountered that, but I don't remember the details". What follows is my list of Unity issues. I'll try to keep it up to date as best I can for issues I encounter, as well as provide any workarounds I come up with.
Issue #1: No adjacency information in geometry shaders
You cannot construct a mesh filled with adjacency information, which is incredibly useful for many things.
Workaround: None
Issue #2: Frustum culling cannot be disabled
Let's say you have an object that has it's vertices displaced in a shader. If the object is outside the view frustum and the displacement places the vertices inside the frustum, Unity won't render it.
Another example: If you have created a mesh consisting of screenspace/viewspace vertices, Unity won't render that mesh unless the containing object is inside the view frustum.
It would be great to be able to disabled frustum culling on specific objects, or even disable it entirely, but there is no such ability.
Workaround: Change camera view angle. Change object bounds. Change object position temporarily.
Issue #3: Generic ReflectionTypeLoadException error
This error is incredibly frustrating, especially when you are dealing with a lot of DLLs. This error can occur for many reasons, and Unity never gives you any details inside the Editor.
- It could mean that you're missing a DLL. Dig through the editor log file to try to figure out what.
- It could mean a DLL targets the wrong .NET version (> 3.5). Which DLL? Who knows.
Workaround: Scour through the editor log to find any info to help. Good luck trying to support a giant team of developers. You basically have to have them email you the log file.
Issue #1: No adjacency information in geometry shaders
You cannot construct a mesh filled with adjacency information, which is incredibly useful for many things.
Workaround: None
Issue #2: Frustum culling cannot be disabled
Let's say you have an object that has it's vertices displaced in a shader. If the object is outside the view frustum and the displacement places the vertices inside the frustum, Unity won't render it.
Another example: If you have created a mesh consisting of screenspace/viewspace vertices, Unity won't render that mesh unless the containing object is inside the view frustum.
It would be great to be able to disabled frustum culling on specific objects, or even disable it entirely, but there is no such ability.
Workaround: Change camera view angle. Change object bounds. Change object position temporarily.
Issue #3: Generic ReflectionTypeLoadException error
This error is incredibly frustrating, especially when you are dealing with a lot of DLLs. This error can occur for many reasons, and Unity never gives you any details inside the Editor.
- It could mean that you're missing a DLL. Dig through the editor log file to try to figure out what.
- It could mean a DLL targets the wrong .NET version (> 3.5). Which DLL? Who knows.
Workaround: Scour through the editor log to find any info to help. Good luck trying to support a giant team of developers. You basically have to have them email you the log file.
Friday, August 7, 2015
Isometric Platformer
Now that video games have been around for several decades, we've seen many different genres as well as countless hybrids between multiple genres.
Normally, I would say that a good game could be made regardless of the genre, but I am now of the opinion that there is no such thing as a good isometric platformer, nor will there ever be I suppose.
Let me recount a tale for you. I was searching the Interwebs for a top-down Metroid type game. I saw some folks mention a game called Scurve: Hive. It was a game that strangely launched on both the GBA and Nintendo DS. The game sounded oddly familiar to me, so I opened my box of NDS games and found that I already had a copy that I had apparently found in a bargain bin for $10.
I popped it into my Majora's Mask New 3DS (gotta flash my nerd-cred!) and gave it a go. While I generally like the coloring, enemy design, weapons, and environment, there was one thing that really bothered me that made the game near-unplayable for me.
Platforming. In an isometric game.
What does a platforming game consist of? Jumping from platform to platform using precise timing and coordination.
Using precise timing and coordination!
What does the isometric view entail? A camera projection that makes everything the same size regardless of distance or height.
Regardless of distance or height!
What happens when you mix precision jumping with a camera projection that prevents you from judging platform position? You get a terrible game, that's what!
Flash forward a couple months to the current day and I recently got Rare Replay on my Xbox One. Included in the collection are several old isometric platformers from Rare. While I will admit that the use of lighting and shadows in Snake Rattle 'n Roll made it not as frustratingly difficult, others, such as Knight Lore are abysmal.
Knight Lore used a monochromatic artstyle that made the isometric plaforming incredibly difficult. It took great effort for me to be able to figure out which platforms were where.
While I can't seem to find any screenshots from Scurge: Hive of the specific spot that was annoying enough to make me want to throw my 3DS on the floor, here are a couple that kinda give you an idea:
Normally, I would say that a good game could be made regardless of the genre, but I am now of the opinion that there is no such thing as a good isometric platformer, nor will there ever be I suppose.
Let me recount a tale for you. I was searching the Interwebs for a top-down Metroid type game. I saw some folks mention a game called Scurve: Hive. It was a game that strangely launched on both the GBA and Nintendo DS. The game sounded oddly familiar to me, so I opened my box of NDS games and found that I already had a copy that I had apparently found in a bargain bin for $10.
| Scurge: Hive |
I popped it into my Majora's Mask New 3DS (gotta flash my nerd-cred!) and gave it a go. While I generally like the coloring, enemy design, weapons, and environment, there was one thing that really bothered me that made the game near-unplayable for me.
![]() |
| Nerd-Cred! |
What does a platforming game consist of? Jumping from platform to platform using precise timing and coordination.
Using precise timing and coordination!
What does the isometric view entail? A camera projection that makes everything the same size regardless of distance or height.
Regardless of distance or height!
What happens when you mix precision jumping with a camera projection that prevents you from judging platform position? You get a terrible game, that's what!
Flash forward a couple months to the current day and I recently got Rare Replay on my Xbox One. Included in the collection are several old isometric platformers from Rare. While I will admit that the use of lighting and shadows in Snake Rattle 'n Roll made it not as frustratingly difficult, others, such as Knight Lore are abysmal.
![]() |
| Rare Replay |
![]() |
| Snake Rattle 'n Roll |
![]() |
| Knight Lore |
In summary: Never make an isometric platformer!
Friday, May 16, 2014
Dart vs TypeScript
Coming primarily from a C# background (as well as C, C++, & Java), working with JavaScript was quite a paradigm shift. As a result, I was very slow developing in JavaScript because I had to learn all of the ins and outs of the language while I was trying to implement functionality.
As you may know from reading previous posts, this led me to switch to Dart. Having a syntax very similar to C#/Java, I was more than happy to dive in. I quickly developed a simplistic game engine/framework and even developed four games in one month (one game a week).
Having changed jobs (again!), I took time off of my hobby development to focus on getting up to speed at my new job. I'm now at the point of where I'm investigating the feasibility of a new idea. I want to turn my framework into a library that can be used by any web developer to make games. I was envisioning compiling the Dart code into JavaScript, allowing other developers to interface with it and even create new scripts on the fly.
My entire Dart world shattered apart when I discovered that this would be incredibly difficult, if not impossible to do. You see, even though Dart compiles to JavaScript, it was not meant to be consumed by any one else in that form. The focus is squarely on the Dart VM which isn't even implemented in any real browser. In order to interface with JavaScript, you have to use the interop layer. Yikes!
I sat for several days trying to plan out the best way of exposing practically everything from my Dart code to JavaScript as well as allow random JavaScript code to be serialized along with Dart so that everything was saved together as one game. I eventually decided to look elsewhere for other options.
The major alternatives to Dart are:
JavaScript - I've obviously already tried that and need to get away from it until JavaScript 2.0.
CoffeeScript - This has one of the worst syntaxes I've ever seen. In my opinion, it makes JavaScript worse.
TypeScript - Everything I've seen thus far for this is amazing, but I'm hesitant after Dart.
Dart and TypeScript both have:
As you may know from reading previous posts, this led me to switch to Dart. Having a syntax very similar to C#/Java, I was more than happy to dive in. I quickly developed a simplistic game engine/framework and even developed four games in one month (one game a week).
Having changed jobs (again!), I took time off of my hobby development to focus on getting up to speed at my new job. I'm now at the point of where I'm investigating the feasibility of a new idea. I want to turn my framework into a library that can be used by any web developer to make games. I was envisioning compiling the Dart code into JavaScript, allowing other developers to interface with it and even create new scripts on the fly.
My entire Dart world shattered apart when I discovered that this would be incredibly difficult, if not impossible to do. You see, even though Dart compiles to JavaScript, it was not meant to be consumed by any one else in that form. The focus is squarely on the Dart VM which isn't even implemented in any real browser. In order to interface with JavaScript, you have to use the interop layer. Yikes!
I sat for several days trying to plan out the best way of exposing practically everything from my Dart code to JavaScript as well as allow random JavaScript code to be serialized along with Dart so that everything was saved together as one game. I eventually decided to look elsewhere for other options.
The major alternatives to Dart are:
JavaScript - I've obviously already tried that and need to get away from it until JavaScript 2.0.
CoffeeScript - This has one of the worst syntaxes I've ever seen. In my opinion, it makes JavaScript worse.
TypeScript - Everything I've seen thus far for this is amazing, but I'm hesitant after Dart.
Dart and TypeScript both have:
- Types
- Generics
- Classes
- Properties (getters and setters)
- Static Fields & Methods
- Aliasing
- Optional & Default Parameters
- Lambda Expressions (Anonymous Methods)
- Enumerations
- Interfaces (explicit)
- Dart only has implicit interfaces via classes
- Modules
- Dart uses libraries instead
- public/private keywords
- Dart uses underscores to mark fields/methods as private. BLEH!!!
- Rest Parameters
- Overloaded Methods
- I can't believe Dart doesn't support this. This is huge to me.
- Generic Constraints
- Superset of JavaScript
- All existing JavaScript is valid TypeScript
- This allows direct interfacing with JavaScript code
- This also means that its implementations of classes, modules, etc are JavaScript 2.0 compatible!
- Pub
- A great way to get other people's packages automatically
- Basic Framework Classes
- Lists, WebAudio, WebGL, TypedData, etc
- TypeScript has lib.d.ts, but it doesn't provide as much
- Abstract Classes
- Operator Overloading
- Very handy feature that I hope TypeScript gets at some point
- Indexers (overloading [])
- Very useful for creating custom collections or math types (Vector, Matrix, etc)
Cloud 9 supports TypeScript
I haven't written a single line of TypeScript (yet!), so I can't truly comment how if it is better than Dart, but on paper it looks fantastic. I'll try it out soon!Sunday, March 30, 2014
Game A Week - #4 - Long Jump
Play the game here!
Monday
I wanted to have an even more physics heavy game, one that used joints and compound shapes, so I decided to make a vehicle building long jump game. I created the base project along with a very long ground object and a wall to prevent travel to the left. I added in a simple box that would move based upon forces given to it via keypresses. I created a FollowObject component that lets the Camera follow the box around. I built a simple ramp, added in distance indicators (current and max) and had the input disable after the box went off the ramp. I was surprised by how fun it already was to play; just flinging a box off of a ramp.
Tuesday
I started working on adding joints, but it immediately became clear that I needed to separate out my RigidBody components from their Collider components, which I did. I then realized that I needed to implement some sort of parent/child hierarchy in order to get compound shapes working correctly. This was quite a bit of refactoring work.
I added in a quick and simple set of marker bars that indicate every 10 meters in order to help give a sense of motion and distance.
Wednesday
I got really sick and didn't work on anything.
Thursday
I was still recovering from my sickness.
Friday
I did no work on the game.
Saturday
I did no work on the game.
Sunday
I added in a RevoluteJoint component and hooked up two CircleColliders as simple wheels. I pushed the left wall out more to give the player more room to gain speed before hitting the ramp.
Play the game here!
Final Thoughts
Due to my sickness and other things in life, I lost several days to be able to work on the game. I had planned for a lot more features since I had the entire week off of work, but alas it was not to be.
My major planned feature was to allow the player to construct their own vehicle with various parts available such as wheels, rockets, etc.
I was impressed by how fun the game was even in the early stages. I believe this is a really fun concept that needs to be expanded upon in the future.
Considering I'm starting a new job this next week, I may skip on doing a Game A Week challenge.
Monday
I wanted to have an even more physics heavy game, one that used joints and compound shapes, so I decided to make a vehicle building long jump game. I created the base project along with a very long ground object and a wall to prevent travel to the left. I added in a simple box that would move based upon forces given to it via keypresses. I created a FollowObject component that lets the Camera follow the box around. I built a simple ramp, added in distance indicators (current and max) and had the input disable after the box went off the ramp. I was surprised by how fun it already was to play; just flinging a box off of a ramp.
Tuesday
I started working on adding joints, but it immediately became clear that I needed to separate out my RigidBody components from their Collider components, which I did. I then realized that I needed to implement some sort of parent/child hierarchy in order to get compound shapes working correctly. This was quite a bit of refactoring work.
I added in a quick and simple set of marker bars that indicate every 10 meters in order to help give a sense of motion and distance.
Wednesday
I got really sick and didn't work on anything.
Thursday
I was still recovering from my sickness.
Friday
I did no work on the game.
Saturday
I did no work on the game.
Sunday
I added in a RevoluteJoint component and hooked up two CircleColliders as simple wheels. I pushed the left wall out more to give the player more room to gain speed before hitting the ramp.
Play the game here!
Final Thoughts
Due to my sickness and other things in life, I lost several days to be able to work on the game. I had planned for a lot more features since I had the entire week off of work, but alas it was not to be.
My major planned feature was to allow the player to construct their own vehicle with various parts available such as wheels, rockets, etc.
I was impressed by how fun the game was even in the early stages. I believe this is a really fun concept that needs to be expanded upon in the future.
Considering I'm starting a new job this next week, I may skip on doing a Game A Week challenge.
Subscribe to:
Posts (Atom)
















