Diary Part III: Difficulties and Challenges

In this part, I would like to tell about some of the challenges and difficulties we faced during creating this asset pack. This diary won’t be complete without telling a bit about it. I hope you see them as milestones of a learning curve as I did.

Iterations

Thanks to Hack N Plan I tracked quite well how much time I spent on each task. It turned out, I spent way more time on the first phase than I planned. This was because I wanted to make sure everything will be set before I move on to finalizing the modular parts. The cycle was to model, export, build, and if there was a problem, move back to Blender and remodel that part. Making the stairs had more than 3 iteration cycles before I even get to highpoly modelling and normal baking. The elegantly curved form was not really good for vertex snapping. The railings had gaps, but I didn’t want to give up on separate railing parts, for the sake of reusablility. The rectangular based columns were too small, so I made another set of bigger columns.

Columns in various shapes and sizes help create variation in the environment

Seamless Parts

Creating the walls and floors and make them tile seamless was less of a challenge than I thought. However the small stairs (steps) needed better planning, because the individual bricks had to be seamless in every direction, and the floor pieces need to be seamless with the basic floor too. I had to reshape these meshes a few times until I was satisfied with the result.

An early view in Unity editor of the tileable steps with placeholder textures

Shader shenanigans

Making the leaded glass windows – and making it look like it is leaded glass was one of the most memorable challenges. After creating the model and textures (together with alpha masks for the lead parts) I dropped it into Unity. I got a friendly feedback on how the glass should refract light and create a distortion effect. First I used a built-in glass shader, but it only had base color and normal inputs, and I needed the metal parts to be non-transparent and metallic. We didn’t quite laid our hands on custom shader creation before, so we moved to Amplify Shaders to solve this. I am still new to this whole shader thing, but the result was much better than the first time. After this I had to move on with the rest of the package, and this whole glass shader issue was laid apart for more than a month. While assembling the Demo Scene, we got to it eventually again, and Adam offered his help with Amplify to solve the issue. Seems like a new eye can make all the difference when working on such a big project.

Cleaning up & Bloopers

When having a big pack with more than 400 prefabs, it can quickly grow out of hand with all the variations, parts, bits and pieces to stay organized. We went through multiple times on all of the folders, meshes and prefabs, so future users of the pack won’t have any trouble while building a level. This was the phase in which we found other issues too, such as inconsistent prefab naming unnecessary large textures, unused materials and duplicate meshes.

One of our favourite happy accident happened during the scripting of the doors. We made all drawers, doors, and cabinets interactive with these scripts, which use the pivot and axis of the object to rotate them accordingly. In this case, something got messed up and this door opened in a way we both were laughing in tears for a while:

So many prefabs to build from!

Coming Soon to Asset Store - Dark Fantasy Kit!

The last, but not least task with any Asset Store pack is to create nice presentation of the contents. With this pack, we built a few demo environments and highlighted the pack’s strong sides, showing its best within Unity. We refined the renders with the latest post process stack, and besides the screenshots, we will release videos and downloadable, playable demos too. Depending on the Asset Store’s review process, the pack will be available in the store within about 3 weeks.

Thank you for reading this blog post, and feel free to share your insights in the Unity Forum.

Diary Part II: Dark Fantasy Environment and Props pack

In this blogpost, I would like to share my personal experience, and give insight on my modelling and texturing workflow.

Phase I - Concepting and sketching

After all the planning was done, I started to work on the prototypes. I quickly sketched a few of every type of items in Blender, using only material colors and rough shapes, combined with lots of Mirroring and Array modifiers; I also used beveled Curves where it was needed to achieve complex curvy forms. I figured out scale, main forms of the models, and tried out modularity in Unity. I also created a few basic materials, such as stone, brick wall, wrought iron, and used some pre-made materials too.

Phase II: Base Assets Modeling and Texturing

This phase was, in my opinion, the most time-consuming task, and along the way I learned a lot about productivity, flexibility, and importance of feedback. I made some detours and backtracking and had to reconsider some conceptual flaws. As it is with most production workflows, gradual iteration led me to refine my skills and I have to admit it is still visible – at least, for me – in the assets quality. Here are some early images of the first „pre-alpha” passes in Unity, where I tested modularity:

Testing walls, and stair tiles modularity in Unity

The modelling workflow

I usually use Box modelling, which means I create a model from basic shapes (boxes, cylinders, spheres etc.) and refine and detail them until I get the form I want. I also like to use beveled Curves to build elegantly curved, or organic models. I often use Cloth simulation in case of draping fabrics. One of my favorites was creating the pillows, which I took from a tutorial, basically inflated the highpoly mesh with a force field. The female sculpture modelling started with a Makehuman basemesh, decimated, her hair was formed of beveled custom Curves, and her dress with Cloth simulation.

Modeling stylized hair with a custom beveled Bezier Curve

Texturing

When I have both the high poly and low poly meshes, I create the UV layouts. If the model has smaller parts, like drawers, I move those away from the main mesh so they won’t interfere with each other when baking maps. I do the normal map, curvature, ambient occlusion (etc) bakes in Blender or in Substance. I also make a color coded version of the mesh, and create a color ID to be used in Substance.

I check face normals, and correct them with Autosmooth or Weight Normals tool if needed. I export the mesh (or meshes, if they share an atlas). If the mesh is complex, such as the ornamented fences, I also prepare a simple form to be used as a LOD later. Then I move on to an image editing software to create masks and ornament alphas if needed.

Below you can see that I created details for this wardrobe from individual Arrayed mesh shapes. After normal map baking, the result was nearly the same as if I used hand-painted alphas to generate the detail normals in Substance. Making the highpoly details can be more time consuming than painting the alphas, and normal map baking settings can be different for each separate part I do,  and the resulting normal maps sometimes need manual correction, which I think is a bad practice. To be honest, I encountered this same problem multiple times while baking very small details, until I gave up and decided to paint alphas and generate normals procedurally at the later models.   Of course, these furniture models are not for architectural visualization projects, which would need a higher level of detail.

Creating Materials

Creating textures from scratch digitally is a very rewarding task, even if you do not excel in traditional art. Luckily Substance Designer is the perfect tool for this. I constantly try out new node setups, watch highly skilled material artist’s tutorials and techniques. In some cases I take the easier path and simply use a modded version of the built-in materials, or turn to an online material library. While using a material as a reference, you can get a lot of information out of the previews, and there are also options to generate a seamless texture from a single colored picture.

I followed a well-traveled path of PBR material authoring, creating Base color (=Albedo), Normal, Roughness, and Metallic maps in Substance. I also experimented with Height maps, both within Substance and Unity, but I found that Unity’s built-in Tessellation shader is not very good when it comes to buildings, and it is more optimized to be used with Terrain. So I ditched the idea and worked more on the base material. If I can move forward with my (currently limited) Shader knowledge, I will try to find a better solution for wall surface variations. Until then, normal maps and cornerstones will do the trick hopefully.

Creating Variation

With Substance it is very easy to create more variations to a material in a non-destructive way. With the covered crates, I made three graphs for this material – one for the wooden parts, one for the fabric, and one where I merged those two and had the variation options exposed. Now I can adjust the base color, detail color, and any other setting I exposed in my main graph. This keeps the work organized: instead of a huge tangled graph I have compact, customizable sub-graphs.

I also created a custom node which helped me merge the Roughness (inverted Smoothness), Metallic and Ambient Occlusion maps into one RGB image, as Unity’s Standard shader uses it. I really like the idea to use the channels of an RGB image instead having 2-3 grayscale images.

In the next post, I would like to tell you about what challenges and difficulties I faced, and how I solved them while creating this pack.

About the Author

Dotti Hegedüs

Dotti is co-founder and 3D Artist in Runemark Studio since 2015. She specializes in environment and props modelling in various styles.

Diary Part I: Dark Fantasy Environment and Props pack

The Idea & motivation behind

In the end of 2017 I already had 3 model packs in the Asset Store, the School Gym, the Swimming Pools and the Climbing Hall packs. Not to mention my earliest try, Alchemy Pack, which was my first attempt to post my work online. I looked upon my packs and thought, I definitely can do better, I just need more time… and inspiration. What to do for the community and the Store? If you search for Fantasy packs, you can have quite a lot, in various visual styles (lowpoly, cartoon, realistic, etc.) and quality. All have a nice, generic fantasy / medieval feeling to them. You can build villages, castles, entire cities… that will look just like all kind of peaceful creatures and law-abidding citizens dwell in it. Maybe a few dungeons and sewers for the lower-class villains…

Real Estate for Real Villains

So, what about the baddies? Sure, you can shove the evil guys to an underground, damp dungeon, or a cemetery (who lives in a cemetery, anyway?), or to a crumbling castle.  But as I was surfing the Asset Store, I found that there are no environments for villains with style. Evil overlords who gain their riches off the poor peasant’s sweat and blood, who display their authority and oppression in forms of not just military power or deadly magic, but with their environment. With this pack, I will try to add a unique atmospheric elements to a generic fantasy world, where the viewer can instantly feel when he enters the villain’s lair – where the neutral land ends, and the villain’s true domain begins.

Collecting Reference

Reference image from Elder Scrolls Online

First I looked on some references. What makes an environment feel „evil” ? After studying lots of images from various fantasy worlds with stylish villains, I found that a few elements are almost, always there: spikey stuff, and black,heavy, wrought iron. Gothic architecture is very often portrayed with vampires’ castles. I also found that giving the style an exotic touch, such as Moroccan architecture, can be very interesting and feel elegant, like the way I imagine Dark Elves. So I took those gothic arches, added a little exotic feel from Moroccan architecture, and topped them with menacing, dark, wrought iron spikes and grates. I also had to choose a heraldic animal. I’m still a bit ambivalent about the chosen animal, the scorpion. I could choose wolves, ravens, spiders, or snakes as they are all connected to dark and „evil” metaphors. Maybe later i’ll add these as ornament and decoration variance to the pack.

Moroccan Window

My main inspiration on style were Lord of the Rings ringwraiths, Elder Scrolls’ Daedric and Ebonheart architecture, and dark elves environment from Styx – Master of Shadows. I found that ESO Furniture catalogs made by fans are a nearly endless source of inspiration;  it helped me to achieve a certain level of complexity with the furniture models.

Planning the workflow

I also had to plan what exactly I want to build – building and furnishing an entire unique environment is no small task, and I have limited resources and time until I have to look for a regular job again; I want to use this timeframe as efficiently as possible, while maintaining a healthy daily schedule. 3D work can be very visually intense and one should avoid burnout or health damaging habits while working on large projects, because both can lead to a decline in motivation, work quality, and in the end, the whole project can go south if you don’t manage yourself correctly.

For this I looked upon other publisher’s packs, and made a nice big spreadsheet about all the pieces I will need. Floors, walls, doorways, columns, windows etc…. and then, filling those empty stone halls with containers, decoration, textiles, furniture, and other clutter.

At this point I started to realize how big this project will be. I had to divide the work into smaller batches to be manageable: first, I will create the modular, architectural bases such as the walls and floors. Then come the detail elements, like doors, windows, columns, stairs and fences. After this part come the individual prop pieces, such as containers, furniture, ornamental items (sculptures, reliefs, etc.) and textiles (rugs, flags, curtains..) In some cases I made two or more variants for the same item, especially those which are reused very often. There are still lots of models which have no variants, but might be combined with clutter later on. I hope that in the future, after I released the pack, I will receive feedback on what needs to be added or altered.

Before the planning phase I registered to a project management app (Hack’N’Plan) to track my progress and share the project details with Adam. He and I are co-founders of Runemark Studio, our little entrepreneur business. He helped me a lot creating the milestones, and tackling the massive amount of ToDo’s I had in my spreadsheet. When everything was set and ready, I started to create the prototype models for the pack.

In the next blogpost, I would like to share my personal experience and my creation workflow. I will write about my modelling and texturing practices and techniques. See you soon!

About the Author

Dotti Hegedüs

Dotti is co-founder and 3D Artist in Runemark Studio since 2015. She specializes in environment and props modelling in various styles.

Hero Fantasy Pack Vol 1 (Asset Review)

  • Publisher: Kristian Grundström
  • Genre: Fantasy Music
  • Asset Store Rating: - star, 2 review (Personal Rating: 5 stars)
  • Asset Store Link

This is an epic medieval / fantasy music. The package contains 4 themes, all haver a loopable version, and package contains multiple variation of each theme.

Content Quality

The asset contains four themes each of the themes has parts with different dynamics and intensity, and each parts has multiple variation.

The music was designed to work well with third party audio solutions like FMOD or Wwise. These middlewares are great tools if you want to achive Adaptive music (also known as Dynamic Music) in your game.

The four themes are:

  • Embracing Fate: a highly dynamic orchestral. 
  • Disillusional: more emotional and cinematic feel.
  • In the Mids of Ruins: or as I called it the Dwarf theme. This theme has the most parts from a calm ambient to a very high intensity one.
  • What to Come: more of a menu or a cutscene music. However one of the stinger resembles of the music in Witcher III. Not sure if it’s intentional or not, but I really like it.
  • Third party audio solution support.
  • Multiple variety to prevent monotonity

Adaptive Music with Unity

FMOD and Wwise are awesome tools, but if you don’t want to learn a third party software, you can still achive Adaptive Music with Unity itself.

Unity created a great tutorial for this: Adding Music to Your Game

And depending on my experiences this asset works very will with the tutorial! The publisher also noted the BPM value of each theme that is super helpful!

Support & Updates

The asset was published in Feb 2, 2018. There was another update in June. This is quite a fresh asset. And according to the publisher comment more music will come!

Personal Experience

I never before worked with music yet. So I had to learn  a little about it, before I made this review. The tutorial I linked above helped me a lot, and after a few hours of experimenting I came up something really cool incombat-outcombat effect.

Final Conclusion

This asset is one of my WELL SPENT MONEY recomendation.

This asset is very well made. If you need a fantasy music for your game  you should consider to buy this one.

About the Author

Adam Galla

Adam is the founder and developer of the Runemark Studio. He graduated with BSC  degree in Software Engineering in 2013.

He is working as a freelancer game developer and asset store publisher since 2014.

Animator Parameter Name Field

Sometimes we want to refer to an Animator Parameter from the inspector by name. In this case there is a chance we don’t remember the names of the animator parameters. This doesn’t look like a big deal, but it’s proven that only a few clicks can increase the work time by a lot if these few clicks are frequent. The following code improves the single text field with a dropdown button. This will show you all the parameters of the Animator on this object. You can also filter the list by animator parameter type. Let’s get started!

Animator Parameter Attribute

First we need create a new Attribute. We need two variables for this class. A Type value that will be an AnimatorControlleParameterType, and the other variable will be the FilterByType boolean. This will tell us whether or not we want to filter our parameter names based on their types.

public class AnimatorParameterAttribute : PropertyAttribute
{
   // Determines whether or not we are using Type to filter the list.
   public bool FilterByType;

   // We will only show parameters of this type.
   public AnimatorControllerParameterType Type;

   public AnimatorParameterAttribute() { }
   public AnimatorParameterAttribute(AnimatorControllerParameterType type)
   {
      FilterByType = true;
      Type = type;
   }
}

Animator Parameter Drawer

The next step is to create our Property Drawer class. This will be more complex, but the basic idea is this: 

We will grab the property (or variable if you wish) that is marked with the previously created Animator Parameter Attribute. This will give us a SerializedProperty type of variable.

From this SerializedProperty object we can reach our actual script (.targetObject) and from there the GameObject it’s attached to, finally the Animator that is on this GameObject.

If we have the Animator as reference, we can go through its parameters and collect all the names we want (filtered or not by types).

Lastly we draw a PropertyField for our string variable (this will be a simple TextField) and a little button for the dropdown list.

[CustomPropertyDrawer(typeof(AnimatorParameterAttribute))]
public class AnimatorParameterDrawer : PropertyDrawer
{
   GUIStyle _popupStyle;

   int _index;
   List<string> _names = new List<string>();
 
   public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
   {
      // Reset Names
      _names.Clear();
      _index = -1;

      // Get the Attribute
      AnimatorParameterAttribute attr = attribute as AnimatorParameterAttribute;

      // Grab the animator from the property
      var go = (property.serializedObject.targetObject as MonoBehaviour).gameObject;
      Animator a = go.GetComponent<Animator>();
      if (a != null)
      { 
         a.Rebind();

         // Iterate through the parameters
         int cnt = -1;
         foreach (var p in a.parameters)
         {
            // If the attribute is not filtered, or it has the same type
            if (!attr.FilterByType || attr.Type == p.type)
            {
               _names.Add(p.name);
               cnt++;
               if (p.name == property.stringValue)
                  _index = cnt;
            }
         } 
      }
 
      // Init popupstyle
      if (_popupStyle == null)
      {
         _popupStyle = new GUIStyle(GUI.skin.GetStyle("PaneOptions"));
         _popupStyle.imagePosition = ImagePosition.ImageOnly;
      }
      
      // Draw the property
      label = EditorGUI.BeginProperty(position, label, property);
      position = EditorGUI.PrefixLabel(position, label);

      EditorGUI.BeginChangeCheck();
      int indent = EditorGUI.indentLevel;
      EditorGUI.indentLevel = 0;

      if (_names.Count == 0)
      {
         GUI.Label(position, "No Animator is attached or it has no parameters");
      }
      else
      { 
         // Calculate rect for configuration button
         Rect buttonRect = new Rect(position);
         buttonRect.yMin += _popupStyle.margin.top;
         buttonRect.width = _popupStyle.fixedWidth + _popupStyle.margin.right;
         position.xMin = buttonRect.xMax;

         // Show a simple text field
         EditorGUI.PropertyField(position, property, GUIContent.none);
 
         // Draw a dropdown button for selecting the parameter name.
         int result = EditorGUI.Popup(buttonRect, _index, _names.ToArray(), _popupStyle);
         if (_index != result && result >= 0 && result < _names.Count)
         {
            Debug.Log(_index);
            _index = result;
            property.stringValue = _names[_index];
         } 
      }

      if (EditorGUI.EndChangeCheck())
         property.serializedObject.ApplyModifiedProperties();

      EditorGUI.indentLevel = indent;
      EditorGUI.EndProperty(); 
   }
}

Using this Attribute

Once you created these two classes, you can start to use your new Attribute. Important to note the Attribute only works with string variables. 

This is how you use it:

[AnimatorParameter] 
public string ParameterName;

This is a basic useage, the dropdown will contain every parameter name you have in the Animator that is on this GameObject. However you can define a type to show only those parameters that has the given type. 

You can do it this way:

[AnimatorParameter(AnimatorControllerParameterType.Float)] 
public string ParameterName;

You can use the following types:

  • AnimatorControllerParameterType.Float
  • AnimatorControllerParameterType.Int
  • AnimatorControllerParameterType.Bool
  • AnimatorControllerParameterType.Trigger

About the Author

Adam Galla

Adam is the founder and developer of the Runemark Studio. He graduated with BSC  degree in Software Engineering in 2013.

He is working as a freelancer game developer and asset store publisher since 2014.

Village Interiors Kit (Asset Review)

  • Publisher: 3D Forge
  • Genre: 3D Fantasy Environment
  • Asset Store Rating: 5/5 star, 116 review
  • Asset Store Link

Quite hard to write an objective review about an asset like this. I bought this package in 2014, and I’m in love since then. 

The asset is an environment pack for medieval-fantasy Tavern, Castle, Cathedral, Catacomb and Crypt interiors. It contains an incredible amount of prefabs  (2800+), and it’s totaly modular.

Content Quality

The asset is well optimized and suitable for both Desktop and Mobile games.

The meshes are low poly models, and nicely UV-mapped: the thousands of meshes are using only a dozen of materials. 

Textures: the package contains two set of textures. There is an 1k resolution diffuse-only texture map, and a 2k resolution HD map set that includes diffuse, normal and ambient occlusion maps. 

The asset does not support PBR (Physical Based Rendering). However the texture quality is very nice, and without any advanced lightning setup, you can create very good looking scenes.

Worth noting, that the icluded scenes doesn’t use any post processing effects.

  • Low-poly meshes
  • Mobile Friendly
  • Multiple texture quality
  • Looks cool with simple lightning setup and without post-processing effects.
  • No PBR support

Asset Useage & Modularity

The package main feature is modularity. And it’s designed very nicely. You can build very wide variety of interiors from floors and walls. The idea is based on the 2.5m x 2.5m floor tiles that can be snapped together by vertexes (you can use the Unity built-in vertex snaping). You can also snap the walls to the floor tiles with vertex snapping.

The package contains 12 different texture for floor tiles, and 15 for walls. You can find 20 different wall shapes (corners, walls with doorway…etc). But this is just the top of the iceberg. You can find endless number of detail elements, pillars, beams, stairs, furnitures in the package.

What type of project can you use? 

Since the package already has demo scenes for Cathedrals, Catacombs, Crypts, Taverns and Castles. You obviously can use to create this type of environment.

But, becouse it uses a very basic pieces as building blocks, with some creativity you can create much more. I actually created a ship cabin with this package (you can check it below, but keep in mind this was a fast prototype, that I made within an hour)

Folders are well organized

This might or might not a preference when you want to buy a model package. But when you are working with a huge model library like this, not a bad thing if it’s organized well. 

Support & Updates

As I mentioned at the start, I bought this product in 2014. In these three years the package increased a lot. Every few months a new and free update comes out.

Cobus – the man behind this package – is a kind person, and pays attention on feedbacks and requests. Very good example of the good support term.

Personal Experience

Since I bought this asset I used it for several projects. I really like to work with this package and have lots of fun doing so. You can check some of my works above.

 

Final Conclusion

This asset is one of my MUST HAVE recomendation. If you are thinking about buying this, you definitly should do. Trust me, you won’t regret it!

About the Author

Adam Galla

Adam is the founder and developer of the Runemark Studio. He graduated with BSC  degree in Software Engineering in 2013.

He is working as a freelancer game developer and asset store publisher since 2014.