Building in the Metaverse
This doc will be an introduction to creating a space for Mona.
Whether you are completely new to building, or coming in from an alternate design ecosystem such as Architecture or traditional art, this doc is the one that lets you in to what Mona requires to make the best spaces that run smoothly on desired devices.
A lot of these elements fall under the category of 'Game Development'. Unity is a Game Engine after all. There are tons of resources out there to learn the applications you choose to make your assets. That said, many of the elements are covered in more detail on the sidebar on the left under the Create your Space, and Improve your Space categories.
You can always find more resources on Youtube to help you. There are a lot of builder recommended tutorials on the Tutorialspage as well.
Of course you can always jump into the Discord and ask for help there! There are always people helping each other create the best worlds they can.
One of the biggest differences with game development from other industries is the need to create assets with more limited resources. As Mona runs on a browser using WebGL, those requirements are even more limited in comparison to a game like Fortnite or Cyberpunk 2077. Keeping this in your mind at all times will help you create a space that looks great and runs smoothly.
You will always be balancing Quality VS Performance VS Filesize VS Time.
There are many ways to make digital assets depending on your resources. But generally it will come down to using the following tools in some way.
One of the cheapest and easiest pipelines, or process of creation, would be :
- Blender for asset creation
- Substance Painter / Armor Paint, Photoshop for texturing
- Blender or Unity for animation
- Unity for putting it all together
This is not a requirement of course, but just a recommendation for getting started
That said, there are many tools available to you if you have experience with that, or have access to them.
- Blender (Free)
- 3D Studio Max
- 3D Coat
- Gravity Sketch
- Rhino (See Polycount section below)
- Revit (See polycount section below)
- and others...
- Substance Painter (Steam or Adobe subscription)
- Armor Paint (Free)
- and others...
- Blender (Free)
- 3D Studio Max
- Unity 2020.3.18f1
- Unity 2022.2.3f1 (as this is the target engine for use with Mona)
There are of course a lot of other steps in there such as Unwrapping UVs, rigging (if you are doing character work or complex animations), etc. but Asset Creation, Texturing, Animation would be the main processes before putting your space together in Unity.
The first one that most builders come across is the polycount. This is how many polygons (or squares/triangles on a model) are used in a 3D asset. Any architect that uses Rhino or Revit will have not needed to worry about this (as both applications don't really have the tools to customise the result), but this is actually one of the most important elements for assets in the Metaverse.
Notice how when these assets are smoothed that it is mostly the edge that tells how low polygon it is. Use this as a guide for designing your assets.
The most important thing is to make sure that your assets do not look like the example on the left of the example above. This polycount is very high and will affect performance the more assets you have of this number (which should be zero), and it will also affect the filesize.
When it comes down to it you want to get the polycount as low as possible while keeping it as close to the quality that you would like (within reason). Depending on the asset you are creating there may, or may not, be compromises needed. Many straight or boxlike assets require less polygons than curved assets for example. So curved assets will usually need to use some game dev tricks to get similar results.
This is even more tricky when you have an asset that has a lot of detail such as a detailed sculpture, pillar, character etc. there are tricks to deal with these too.
Every asset requires different process to get the best result. Things to consider for which method is best include the following :
- How big is the asset in the scene (how big will it get on the screen)
- How important is the asset (is it a 'Hero' object like a main sculpture, or a vase in the corner no-one will look at)
- How many of the asset will be in the space (is it placed once, or many times)
Once we have a good idea of the target asset, we can consider the materials and textures that it will use.
Materials are what gives an asset color and texture. More detail will be added below under the Textures section, but a material includes all types of information such as the color, metallic, smoothness, normal (or bump), emissiveness, to name but a few.
Another important element of a Mona Space is to keep your drawcalls as low as possible. In very simple terms, a drawcall is when the CPU needs to give the GPU different information. And there are a number of things that count as a drawcall, such as rendering a mesh and a material.
Some simple examples to consider, when using the tools the game engine has, would be :
- If you have one mesh with one material, that is one drawcall.
- If you have one mesh with 5 different materials, that is five drawcalls.
- If you have 5 meshes using the *same* material, that is one drawcall.
- If you have 5 meshes, each with five materials (the same five materials), that is 5 draw calls.
- If you have 5 meshes, each with five different materials (so 25 materials total), that is 25 draw calls.
Game engines have a bunch of tricks to reduce drawcalls however. So the examples above would actually have drawcalls for each mesh and material, but you can use batching to kind of draw all the objects with the same material together, reducing the number of drawcalls in total. No need to go into this just yet, but it's super useful to use on more complex spaces.
It is also possible to create a single mesh asset in your 3D asset creation tool such as blender, but this would limit other game engine tools such as occlusion culling, or auto hiding what the camera can't see. Once again, there are many ways to create, it's just learning the best ways to create the asset you want.
Another approach is to use smart texturing using Trim Sheets. Basically this uses less materials, and uses a method to tell where to put the texture on the 3D asset in smart ways. A whole building could be created using this technique with one material for example.
One of the main things to note about textures is that they take up file size. Textures also are best created in factors of 2, such as 16x16, 32x32 right up to 2048x2048.
Due to the filesize limitations of a Mona space of 180Mb, texture size is another element of balancing quality VS size. This is one of the main reasons space filesizes are very large.
For example, a 4096x4096 size texture is not recommended unless it is for something as big/important as the skybox, or the texture that covers the entire outside of the space. It is very easy to change the size of a texture and see the results within Unity however.
As noted, a material is made up of different elements to add color and texture to an asset. These are all optional, as a Material could just be basic sliders of color and values, but if you want marble, or damaged metal, right up to a character skin, you will look into the following :
This is the color and texture of the material. This texture, sometimes called a map, can also include transparency, also known as Alpha.
Materials can have qualities that make it look like metal, or shiny like plastic (high Smoothness value), or not shiny at all (low smoothness value). In Unity, these two parameters are on the same texture. Metallic is the Red channel of a texture, and Smoothness is on the Alpha channel.
Once again, you do not need to have a texture for this, as you can set the level of metallic and smoothness manually.
The Normal map/texture is a type of map that allows the builder to create what appears to be bump or physical depth (to a certain degree) on the material.
A common method to create a normal map is to 'bake' high polygon asset details onto a low polygon asset. This is perfect for detailed assets that you want in your space.
Emissive is a color/texture that can allow a material to glow. The bloom effect in Mona will react to this feature of the material.
There are of course many parameters in the Standard Shader (or the information that tells the material how to do its job), such as tiling, Offset and more, but these are the most common.
As with any industry there is a specialized vocabulary with game development. This section will go over some of the most common terms used within games and Mona development.
WebGL - WebGL is what Mona uses to get your 3D Space working in a web browser. Everything that you create in Unity needs to be WebGL compatible.
Polygon - A polygon is a four sided shape that makes up 3D assets.
Triangle / Tri - A polygon is made up of two triangles, commonly called Tris.
Edge - An edge is the line between two triangles/tris.
Edge Loop - An edge loop is a line of edges within a 3D Asset. Good Edge loops allow for easier, and faster editing of an asset.
Vertex / Vertices - A vertex is the point at the corner of a polygon. Assets are made of vertices that are connected by edges and polygons.
Material - A material as a game asset that allows you to combine a lot of visual parameters to add different aspects to your 3D model such as color, metallic, smoothness, normal (bump), and emissive (light).
Texture - A texture is basically an image (.png is best for Unity) that has information you can apply to a material. Some are based on color (Diffuse or Albedo), and some are based on numbers between 0-1 such as 0/black for non-smooth, and 1/white for smooth. And some are quite complex such as normal maps (complex bump maps).
Extrude - Extrude is similar to a Sweep in that your a extending a 2D shape along a path. There are slight differences in the two depending on the tool you use to create them, but the basic idea is the same.
Realtime - Realtime refers to the fact that whatever the game/application is doing, it is doing so right now. There is no pre-processing the information. This is usually more expensive on the CPU and graphics card. Realtime lighting is a prime example of something that is very expensive to process, and there are a number of ways to improve this.
Baking - There are two main uses of the word baking.
One use is with 'projecting' high polygon information (eg. sculpted detail or photogrammetry) onto a low polygon asset (eg. a game ready asset) which allows you to have high quality assets work in real time. This baked information is created in different textures, or maps, that you can use in your materials.
Another is baking lighting information into textures rather using real time lighting.
Lightmapping - Lightmapping is the process of baking much of the light information (light color, shadows, ambient light, bounced light etc.) into a texture. This approach to lighting is significantly faster than realtime lighting.
Retopology / Retopologizing - This is one technique of creating/improving a low polygon asset to better suit being used in a game environment. It can produce excellent result that takes longer than other methods.
Decimation / Remeshing - These are different techniques for reducing the polygon count of high polygon assets to game ready assets. They are much faster than retopology, but are not as optimised.
So now that we have gone over some of the basics of things you need to keep in mind when creating assets for your space, lets get into actually creating your space!