Scaling Wearable Content for an MMORPG

The Problem

Lets be honest here. I don't have much (if any) experience with 3D modeling. Most of my experience up until now has been writing services, building UI and integrations around those services, etc. Only with this project had I stepped into the realm of game development.

That being said, one of the biggest challenges in building an MMORPG has been the rendering of clothing/armor dynamically based on what a character has equipped.

To be a bit more specific, the difficulty is not with actually making the armor render, but rather making sure the armor can fit and "look good" on every single race and gender.

For those who are less familiar, armor/equipment/etc are themselves 3D models which simply sit on top of other 3D models (i.e. the character). But armor/equipment models don't attach to the character model magically. It is a careful process of rigging/fitting that armor to the 3D model which is "wearing it".

To demonstrate, below is a picture of a piece of armor I had bought years back, alongside the humanoid model I am using.

If I overlap the armor over the humanoid model, things don't clearly line up.

It's not just the front, everything needs to be adjusted. The shoulder area, his back side, etc.

In addition to this, you will need to ensure the armor is rigged to your model's bone structure. If the model isn't attached to the bone correctly, a particular animation may cause parts of the model to clip into areas where it shouldn't be. For example, the bare arm clipping through a leather shoulder pad only when the character goes to swing their sword.

So how would an indie developer who doesn't have much experience with 3D modeling go about creating a game with many different humanoid characters, all by his or herself?

The Simple & Less Dynamic Route

The easiest way to avoid this issue is to simply buy many different humanoid models which already come with armor that is pre-rigged for the bone structure, model, and animation being used.

This would allow you a lot of variety in terms of having many different humanoids that look unique, however, it would be pain to make it so that the same Boots of Escaping can render on every single humanoid. You would need to rig that boot model onto your Wood Elf, Orc, Ogre, Human, Myconid, etc. models. Simply put, if you want it to render consistently between models you need to make sure it is rigged.

Now for my game, this aspect is fine for non-playable humanoids. I want my playable humanoids (Wood Elf, Ogre, Human) to render the same exact boots when equipped, however, it's not a big deal to me if my skeletons, for example, have their own set of armor.

This armor will not be tied to what they actually have equipped. In my case, I have introduced a texture field for each non playable race which variation of the humanoid is loaded.

For example, the above skeleton would be a part of the skeleton race, however, it is rendering the skeleton_fighter texture. Similarly, the below skeleton would be a part of the same skeleton race, but it would be assigned to the skeleton_sorcerer texture.

So this route might be fine when you're building a dungeon that has a particular theme to it. But what if you want your playable races to all share the same equipment models?

The Flexibility of Sharing Models

Outside of rigging every armor model to every single playable race, the easiest way to make this work is to share a single model.

In fact, compare the above two skeletons. Notice that they share the same skeleton model -- the difference is really what armor is rendered. This would allow me to create a skeleton race where the armor being rendered is based on the equipment in the skeleton's inventory. However, building such a feature isn't worth it to me as the skeleton model is so specific that I only have a handful of armor models which are rigged to fit this skeleton.

Providing this feature for playable races only is really where you get the most value. You could have everyone look mostly the same, but in an MMORPG you want your players to have ways to make their characters feel unique. And there are multiple ways to achieve this:

  • Having different pieces of armor equipped
  • Dying your armor to be a different color
  • Have different faces/hair options to choose from
  • Allow players to adjust their body proportions
  • Choose other accessories, such as tattoos etc.

The nice thing is that by having fewer models, it is much easier to achieve the above.

  • As discussed, armor models would only need to be rigged to a single character model.
  • Faces, hair, tattoos, and other accessories only need to be rigged to a single character model as well. Maybe you don't want to share all of the same faces between every race, but you can abstract which race is allowed to use which face/hair/etc via code.
  • If the same bone structure is shared, you can more easily allow players to tweak those bones to increase their character height, arm length, head size, etc. Of course, you can make this work with multiple bone structures, but more code would be needed to abstract the differences to players.

Don't get me wrong. Supporting the above is not an easy task, esp. for someone like myself who did not have a game development background. Luckily, I found the Unity Multipurpose Avatar (UMA) plugin years ago, which is what actually convinced me to start this project. I had been playing around with the original version of the plugin when I realized that it is actually possible to create an RPG by yourself with enough content (albeit, it may still take many years).

The UMA plugin provides a lot of the above functionality out of the box, such as being able to adjust bones. I have not spent all that much time crafting my races and have instead spent a lot more time on core game functionality (as you can probably see from the changelog/roadmap), but below is a picture demonstrating how I've wired up the internal UMA bone structure into my character creation screen.

On the left is my character creation screen. On the right is the internal UMA bone configuration.

Note that my code restricts the minimum, maximum, and default bone values for a particular race. To be clear, the bone configurations along with the skin color and (eventually) options for hair, face, accessories, etc. would technically all be supported on every race.

To demonstrate this, notice how the face on my Troll race looks identical to all of the other races? Also notice that the Dark Elf vs Human is so far just a difference in color -- they're both bald. Please keep in mind that I've maybe spent a day, if that, making these races look unique over the past 5 years. It will be a focus very soon though 🙂

Below is the same robe being rendered onto each of those races. Notice that in every case the robe model adjusts to the bones because the armor has been pre-rigged to this single/shared bone structure.

What About Females

Up until now I've been only showing male examples. Truth be told.. I don't have the female gender implemented yet. It's there in the code, configurations, etc. but is not something I've spent much time on.

One of the primary reasons I've avoided this is because UMA females are built on an entirely different model from males. I could potentially use a unisex model, but ultimately I need to make a decision on how to move forward:

  1. Choose a single model to serve as my unisex model.
    • If I use the male model as the base unisex model, I need to rig all of the female armor, faces, accessories, etc to the unisex model. (Same would apply if I use the female model as the base unisex model)
    • If I use the male base model, I'd need to either find a bone adjustment which comes close to resembling breasts (less likely) or create a configurable add-on which would render breasts on top of the normal model (more likely). At that point, it may make sense to use the female model as the unisex model and somehow flatten the chest for males (have not explored).
  2. Keep the models separate, which is how all of the item->armor model configuration has been implemented throughout my game/content management website.
    • Unless I rig all of the female only or male only assets to both the female and male models, items will likely render differently between males and females.
    • More code to maintain. More configuration required for content.

Although I've been designing a lot of my frameworks around the 2nd option, I am now holding back after seeing that someone is working on a unisex model for UMA. Sadly they have been MIA for a few months now, but in the meantime I am one or two core features away from having most everything complete for the initial milestone outlined in my roadmap.

Once those features are complete I will be focusing on world building for quite a while so that I can actually have something that is playable. In the meantime, I'm hoping more work will be done on the unisex model 🙂

Similar Issues With 2D

Something I've been asked before.. why didn't I start with a 2D MMORPG? The problem isn't necessarily the number of dimensions, but rather the scale and scope of the game. If I want there to be multiple races that the player can choose from, where each of them can "use" the same exact armor.. I would have faced the same issue.

In fact, early on I actually switched to making a 2D MMORPG thinking that it might easier and ran into the same issue. I did end up finding a set of sprites which would simplify this process in 2D, probably a bit more than UMA: the Liberated Pixel Cup (LPC). All of the sprites submitted follow the same styles as outlined by the LPC. This allows for armor to be overlayed in such a way that it can be rendered for all common animations (walk left, walk right, swing, cast spell, death, etc.)

However I quickly notice with the LPC sprites that most everyone seemed to use a LPC spritesheet generator where you would pick out a combination of armor/features for exporting into a single spritesheet. That would then represent a single character, meaning you would need to create each character individually and store each of the generated spritesheets.

To get around this, I wrote a plugin in Unity which allows for you to keep those layers separate and dynamically render them based on what is currently equipped by the player.

I didn't stick with that project long after realizing the same issue exists for 3D and that I had the UMA framework to build on top of. Even supporting male vs female armor sprites was an issue as the shape of a female LPC sprite is different from a male. Though I will say there seemed to be more consistency in regard to having both the male and female variations when using LPC sprites.

Anywho.. I think that's enough on this topic for now 🙂 Until next time...

What did you think about this post?

Click on a star to rate it!

Average rating 5 / 5. Vote count: 3

No votes so far! Be the first to rate this post.