STL To TaleSpire
STL To TaleSpire
Programs
Blender
Substance Painter (Optional)
Unity 2019.4.25f1
1. STL to high and low poly models
1.1 Open a new General scene in Blender.
1.2 Select and delete unnecessary scene objects
1.3 Import .stl
1.4 Delete base
1.5 (Optional) Mesh cleanup
1.6 Making a lower polygon count mesh
1.7 Exporting files
2. UV Unwrap
2.1 Substance Painter Auto-unwrap
2.2 (Optional) Blender unwrapping
3. Baking and Painting
3.1.a Baking maps in Substance Painter
3.1.b Baking maps in Blender
3.2 Painting Template setup
3.3 Painting Masks
3.4 Materials
3.5 Texture export template
3.6 Export
3.7 (Bonus) Saving groups as smart materials
4. Making an assetbundle
4.1 Creating a unity project
4.2 Folder structure
4.3 Asset import
4.4 Portrait and Info.txt
4.5 Creating the assetbundle script
4.6 Making and testing an assetbundle
5. Common problems and how to fix them
5.1 Assets not scaled correctly
5.2 Mini appears offset from base
5.3 Painting appears deformed or is very low resolution in places
5.4 Empty base when placing the mini in TaleSpire
6. Making and uploading a mini pack to thunderstore.io
Copyright and licensing
Requirements
Create an icon.png file
Create a README.md file
Create a manifest.json
Assetbundle files
Zipping
Uploading to Thunderstore.io
Updating a mini pack
7. Blender tools and concepts
Object Mode
Edit Mode
Viewpoint controls
Preset viewpoints
Select Box
Box select
Circle select
Expand and shrink selection
Select Linked
Selection Mode
X-ray mode
Scale
Apply Transforms
8. Appendix
8.1 Reference models
8.2 Reference textures
Programs
Blender
Free
This guide is using Blender 3.1.2. Feel free to use newer versions. Later versions might miss
some of the features used.
Open .stl, or any other model type files and convert to .fbx or .obj.
(Optional, advanced) Unwrap model uvs.
(Optional) Paint models and generate texture files.
Substance Painter (Optional)
Subscription/One month trial or one time purchase
Auto unwrap model uvs.
Bake normal, height and ambient occlusion maps.
Paint models and generate texture files.
Unity 2019.4.25f1
Free.
Other Unity 2019 to 2020 versions work for regular custom mini models, but might have trouble
exporting effects
Import models and textures and export them to TaleSpire
Go to File->Import->Stl (.stl)
You should have something similar to this. Should your model not be visible, press the Numpad
Dot key to focus on it.
Set your model to Shade Smooth. (In Object mode, Right click and select Shader Smooth)
1.4 Delete base
Make a copy of the original mesh. We will need it later to get the details back.
Turn on statistics in Blender to know your mesh’s polygon count.
Turning on statistics, we can see that after base removal and clean-up, the Mastiff has 419,892
polygons (faces).
There are several methods you can use to lower the polygon count. In Blender, what has
worked best for me so far is a combination of Voxel Remesh and Decimate Geometry.
2. UV Unwrap
2.1 Substance Painter Auto-unwrap
Open a new Substance Painter project.
To check the uv map, add a uv checker generator to the default [Layer 1].
Switch to the UV Editing tab. If there is none, press the + button next to the viewport tabs to add
it.
Press the Open button in the uv map view and add a uv checker image to help with uv mapping.
This is the one I usually use. There are many other publicly available ones a simple web search
away.
Set the viewport shading to Material Preview ( ) and add a material to the mesh
object.
In Edit Mode, select all vertices (A key), press the U key and select Unwrap.
(Still in Edit Mode) Click the Options dropdown and activate Live Unwrap so you don’t need to
unwrap every time Seams are added.
Add seams until you are satisfied with the uv unwrap. Seams tend to stand out, so pick edges
that can hide them, like natural creases in the model.
Select edges you to mark seams in, press the Edge button (or the E key) and select Mark Seam
to mark Edges, or Clear Seam to clear selected seams.
In the Properties window deselect height and nrm (short for normal).
Click the gray bar or the color picker icon to select a base color.
Adjust roughness and Metallic to reflect the material/paint type you have in mind.
High roughness will get you a matte type of material. High metalness will give you a highly
reflective material. Try playing with both sliders until you find a combination you like.
Expand Curvature in the Properties window and change the curvature sliders until you get a
result you like.
Duplicate BaseColor again (Ctrl+C, Ctrl+V) and name the copy WearAndTear. Move it above
Highlights.
Again, add a black mask and a generator. This time, select Metal Edge Wear as the generator.
Change the color to the same as the Highlights or an even lighter tone. Select the mask and
then the generator to change the properties.
Again, play with the sliders until you find a combination you like. I highlighted the parameters I
usually adjust.
Given that this simulates wear and tear on the mini, I like to set a high value of Roughness and
a low Metallic value for the material settings for a rough plastic feel. Turning on and setting
height to a small negative value can also help further give it a worn off paint layer feel.
using the most are the Paint tool ( ), the Eraser tool ( ) and the Polygon fill tool (
). Switch tools by left+clicking on their icons or by using the keyboard number keys 1, 2 or
4.
The Paint tool lets you paint the mask directly onto the model.
This cursor should show up instead of your regular mouse cursor, letting you know where you
will paint and how large the paint brush is. Press Ctrl and scroll the mouse wheel to adjust the
brush size. Left+click on the mesh to paint.
The Eraser tool lets you erase the mask, much the same as the Paint tool lets you paint it.
The Polygon fill tool lets you paint specific polygons. The model will show up with a red
wireframe showing the polygons. If you drag the left mouse button, it will fill all polygons in a
box, including the back facing ones. Very useful for painting limbs and animal nails.
3.4 Materials
Substance Painter has a built-in materials and smart materials library that help to easily and
quickly paint models and add detail. The Assets window contains these materials, and also
mask generators, filters, brushes, textures and more. Use any material and smart material that
fits your model. I’m partial to the fabric, wood and metal materials. To apply them to only a
specific part of the mode, drag and drop the material or smart material to the Layers window
and add a black mask to it. Paint the mask onto the parts of the mesh you wish to use it on.
Materials and Smart materials usually have parameters you may wish to change. All have
different parameters, so you’ll have to test them out yourself. Some common parameters to look
out for:
Fill Projection.
UV projection is usually the default. This type of projection means the material is applied onto
the 2D uv map. With automatically generated uv maps, this option is usually not the best when
applied on a seam.
I usually use Tri-planar projection for anything that I apply to the whole model, as I used with the
Mastiff.
Setting Projection to Tri-planar and adjusting Rotation and Tiling resulted in the above picture.
After disabling color parameters. Gives the paint a plasticky fur type of pattern.
Same approach with the Concrete Dusty material, using only height. Adds imperfections to the
mesh, making it seem more detailed. You can, again, apply masks to these materials and only
apply them where you see fit.
3.6 Export
Go to File->Export Mesh to export the mesh. (Export to the mini’s meshes folder in the Unity
project, should you have them already prepared.) Click Export and select a folder to export it to.
Go to File->Export Textures, select the Output Directory (preferably in the textures folder in the
mini’s Unity folder, if already prepared) and set the Output template to one created in 3.4 named
TaleSpire. Click Export.
Select the 3D template, name your project, select an appropriate folder and click Create.
4.2 Folder structure
Make a folder under Assets to organize the custom minis in. I use
Assets/boardassets/characters to store character minis in.
Create a sub-folder there for your custom mini. Inside, create sub-folders for:
Materials
Meshes
Textures
Create a text file named info.txt and copy-paste the following into it:
{
"name": "",
"kind": "Creature",
"category": "Creature",
"groupName": "",
"description": "",
"tags": "",
"author": "",
"version": "1.0",
"comment": "",
"size": 1.0,
"assetBase": "DEFAULT"
}
Fill in [name] with your mini’s name. This is what shows up as the Asset tooltip and is the mini’s
default name when placed on the board.
Fill in [groupName] with your mini’s group name you want it to show in. You can use an existing
TaleSpire group name or create a new one.
FIll in [tags] with relevant tags or your mini. These are used when searching for minis in
TaleSpire.
If making a non-standard sized mini, set [size] to the relevant size. Size examples: 0.5, 1.0, 2.0,
3.0, 4.0.
Place the portrait and info file in the mini’s root folder.
string GetCustomPluginFolder()
{
return PlayerPrefs.GetString(CustomPluginFolderKey, "localminis");
}
string GetCustomDataFolder()
{
return PlayerPrefs.GetString(PluginsFolderPathKey, "") + @"/" +
GetCustomPluginFolder();
}
void OnGUI()
{
string pluginsPath = PlayerPrefs.GetString(PluginsFolderPathKey, "");
bool isCustomDataPathValid = pluginsPath != "";
GUILayout.BeginHorizontal();
GUILayout.FlexibleSpace();
GUILayout.BeginHorizontal(GUILayout.Width(200));
if (GUILayout.Button("Build", EditorStyles.miniButtonLeft,
GUILayout.Width(85)))
{
Build();
}
GUILayout.FlexibleSpace();
if (GUILayout.Button("Close", EditorStyles.miniButtonRight,
GUILayout.Width(85)))
{
Close();
}
GUILayout.EndHorizontal();
GUILayout.EndHorizontal();
}
void OnInspectorUpdate()
{
Repaint();
}
void Build()
{
EditorUtility.DisplayProgressBar("BuildAssetBundles", "Building asset
bundles...", 0.0f);
try
{
string assetBundleDirectory = "Assets/StreamingAssets";
if(!Directory.Exists(assetBundleDirectory))
{
Directory.CreateDirectory(assetBundleDirectory);
}
BuildPipeline.BuildAssetBundles(assetBundleDirectory,
BuildAssetBundleOptions.None, EditorUserBuildSettings.activeBuildTarget);
if(PlayerPrefs.GetInt(useAutoUnregisterKey, 1) != 0)
{
string pluginfolderpath = GetCustomDataFolder() + @"/";
EditorUtility.ClearProgressBar();
}
}
When right clicking in the Project window in Unity, a new option called “Build AssetBundles”
should now appear.
In the bottom of the Inspector window, there’s an AssetBundle dropdown. Click it, select [New..]
and then type in your prefab name.
Then right click anywhere on the Project window and select Build Asset Bundles.
Press “Select Plugins folder” and navigate to your plugins folder. The script defaults to moving
the assetbundle files to a “localminis” folder but you can change it in this window. Press Build
when setup is finished.
When the Build operation is finished, you should have a new assetbundle file in the custom
plugin folder path defined in the window above. You can boot TaleSpire and test if your mini now
appears. When booting up TaleSpire with CALP, it will move the folder the assetbundle was
created with into a new Assets folder, and you cannot at the moment make new minis or update
them without reverting these changes. When updating minis or adding new ones, open the your
localminis folder
(C:\Users\<username>\AppData\Roaming\r2modmanPlus-local\TaleSpire\profiles\<profilename>
\BepInEx\plugins\localminis) and check that it does not have an Assets folder. If it does, run the
Unregister.bat batch file to revert CALP’s changes before booting TaleSpire.
In-game mini.
Requirements
Thunderstore documentation
A valid package is a zip file that contains the following files:
icon.png PNG icon for the mod pack, must be 256x256 resolution.
# This Package
This package uses free models by ____ painted by ____.
### Contents:
- 1x xx mini (Category)
### Screenshots

## License:
The models are licensed under https://creativecommons.org/licenses/by-sa/4.0/legalcode
Due to this, the package itself will inherit the same license.
## Changelog
- 1.0.0: First release.
Disclaimer this package has and will always comply to CC 4.0 license and is not for sale.
The  format allows you to show screenshots
in the pack page. It also supports gifs.
Create a manifest.json
The manifest.json file tells thunderstore what your pack name is, its versions and any
dependencies your pack has. The description field shows up in the browse page and its
contents are what is searched with the thunderstore search functionality. This field has a 250
character limit.
Use the thunderstore validator to make sure the manifest.json file is valid.
Template:
{
"name": "XX_Mini_Pack",
"version_number": "1.0.0",
"website_url": "",
"description": "Mini pack containing __. Re-distributed under Creative Commons 4.0
license.",
"dependencies": [
]
}
Assetbundle files
Assetbundle files need to be placed in the following folder structure: plugins\CustomData\Minis
I find it best to limit packs to around 10 minis. It’s easier to download several small packs than
one large one. Less error-prone when downloading.
Zipping
Your mini pack folder should now look something like this.
Compress all the files into one zip file and rename it using the following convention:
uploader-packname-version.zip
Example: simsete-simsetes_Monster_Manual_Minis_Pack_Part3-1.0.0.zip
Uploading to Thunderstore.io
Make an account and login with Discord, Github or Overwolf. The Upload option only appears
when logged in.
https://talespire.thunderstore.io/package/create/
Create and select a team to upload. If you are creating packs solo, consider using your discord
username as your team name so modding discord users might contact you.
Select the Minis category.
Press the Choose button or Drag and drop the zip file you’ve created into the web page.
Click Submit.
Wait until the progress bar finishes and check for any errors. You might need to fix them and
re-upload.
Object Mode
In object mode, you can perform operations on the mesh as a whole. Duplicate the mesh, add
new mesh objects etc. This is the default mode Blender starts in.
Edit Mode
In Edit Mode you can edit mesh data such as vertices, edges and faces.
To switch to Edit Mode, use the dropdown menu on Blender’s top-left or use the Tab key to
toggle between Object Mode and Edit Mode.
Viewpoint controls
Rotate the viewpoint by using Middle Mouse + Drag Mouse.
Move the viewpoint by using the Shift Key + Middle Mouse + Drag Mouse to Move the
viewpoint. Zoom in and out with the mouse wheel.
Preset viewpoints
Clicking on any of the axis on the top right shifts perspective to that viewpoint.
Select Box
Click to select vertices in Blender by default. Should it not select when clicking, the Select Box
tool may be turned off.
Box select
Press the B key to activate box select. While in box select mode, press and drag the Left Mouse
Button to form a rectangle and select vertices in that rectangle. Dragging the Middle Mouse
Button de-selects any vertex in the rectangle.
Circle select
Press the C key to go into circle select mode. A circle should appear around your cursor. Use
the mouse wheel to enlarge or shrink as needed. Left Mouse Button selects vertices in the
circle. Middle Mouse Button deselects vertices in the circle. Right Mouse Button or the Enter key
close circle mode.
Select Linked
Hold the mouse cursor over a vertex, face or edge and press the L key on the keyboard. It will
select all linked vertices. Selected vertices appear in orange.
You can adjust the delimit type on the bottom left. (You might have to expand that bottom-left
menu)
Selection Mode
Click the select mode widgets to switch between vertex, edge and face select modes.
Alternatively, use the non-numpad number keys 1, 2 and 3 to switch between vertex, edge and
face select modes respectively.
X-ray mode
This will make the mesh transparent and allow you to select occluded vertices, edges and
faces.
Scale
Press the S key to scale either in Object mode or in Edit mode. Move the mouse cursor to scale
objects or vertices. Press the Enter key or Left Mouse Button to apply and Right Mouse Button
to cancel. When scaling in Object mode, remember to Apply Transforms before exporting.
Apply Transforms
In Object mode, select the object you want to apply transformations to and navigate to
Object->Apply->All Transforms
8. Appendix
8.1 Reference models
Human sized box
Vampire
8.2 Reference textures
UV Checker Grid