This is a 3D model of the citizen, which will be visible when the camera is close to it.
It's created using 3D modeling software such as Blender, 3ds Max, Maya or SketchUp.
The actual mesh file contains vertices (their coordinates, UV mapping, normals and colors) and triangles. For citizens this also contains the skeleton bones to which the mesh is bound to using bone weights.
- FBX (most commonly used)
One of the skeleton templates.
C:\Program Files (x86)\Steam\steamapps\common\Cities_Skylines\Files\Templates
You need to bind your mesh to the bones of the skeleton, in 3ds Max this is done using the skin modifier and adding all the bones
Pivot / Origin
The pivot point or origin represents the center point on the ground. It's usually represented using a red/green/blue axis gizmo.
Make sure you are exporting a single mesh, and the associated skeleton, which has the correct rotation and scale, as you won't be able to rotate or scale your citizen on import.
Example UV mapping using visible horizontal tiling on the bottom.
Main model and LOD of a vanilla citizen.
The absolute limit for a mesh is 65536 vertices.
LOD stands for level of detail. This is the mesh visible from a distance. It must be as simple as possible. Citizens are small and the LOD is only visible very far away so a model under 100 triangles could be enough.
The LOD is not animated, so you don't need to import a skeleton for it.
UV mapping for LOD mesh using automatic mapping in 3ds Max. No overlap and contained within the main tile - good for baking.
The UV mapping must be within the 0-1 area (main tile) of the UV map, no tiling is allowed. This is because ingame all the LOD textures are combined into a single texture called an atlas, so having incorrect uv mapping will end up putting the texture of some other random citizen on your LOD.
These determine the color and material properties of your citizen.
Example diffuse textures for some vanilla citizens.
It will look very bright, contrasty, and saturated in the game, so make sure to reduce the saturation and limit the brightest parts to a medium/light gray below 150 RGB.
If you don't import a diffuse map, it will default to white.
Example alpha texture for some railings and metal beams.
Using lighter values for the invisible parts will decrease the chance of small details like railings disappearing completely.
If you don't import an alpha map, it will default to fully opaque or fully visible.
Determines which parts will be affected by color variations. White means fully affected and black means not at all.
The diffuse will get multiplied by the color variation, that means the resulting color will look darker than the original diffuse.
If you don't import a color map, it will default to full color.
Example specular map for a roof water tank.
Transitions between different specular values produce artifacts on the normal map and vice versa, even if a normal map is not imported.
The specular highlight from the sun is very big and bright, so you might want to use very low (0-10%) specularity for surfaces facing upwards.
If you don't import a specular map, it will default to no specularity.
Example normal map for rocks.
Problem: default normal map value is 0.5, which isn't possible by using 127(left) or 128(right). Image shows the same flat normal map on faces with different UV rotation/flip.
This can be made from the diffuse or a height map (brighter colors will look extruded out more) using a normal map generator online, a photoshop plugin like xNormal, or standalone software such as CrazyBump.
The normal map generator should be set to +X +Y, which means no color channel inversions are required.
High specularity and normal map don't work well together because of the compression, so you might want to paint over shiny parts parts with a solid color before generating a normal map, or paint over these parts 128,128,255 on the final normal map.
Read more in the normal map article.
If you don't import a normal map, it will default to a flat normal map - no bump.
Use a lossless format like .PNG.
The game supports other formats as well, but there is no reason to use another one, it doesn't matter how much your texture is compressed or even if it's completely solid or complicated, the game will convert it to a DXT format, so the final size won't be affected by anything other than resolution.
Make sure the texture is 8 bit, because a 16 bit image can't be imported.
All imported main textures must be the same resolution.
Powers of 2 is a standard practice in 3D graphics, which means sizes such as 512x512, 512x256, 256x256, 128x256 etc. It is recommended to stick to this standard, but the most important thing is that your width and height must be divisible by 32, otherwise your texture will be corrupted by compression. You can also use a very small size like 32x16 or 16x16 if necessary.
If you don't provide LOD textures, the game will try to bake them using the UV mapping your LOD mesh has, and that may cause visual issues, so it's recommended that you create your own LOD textures using baking.
Powers of 2 is a standard practice in 3D graphics, which means sizes such as 256x256, 256x128, 128x64, 64x64 etc. It is recommended to stick to this standard, but the most important thing is that your width and height must be divisible by 32, otherwise your texture will be corrupted by compression. You can also use a very small size like 32x16 or 16x16 if necessary.
The mesh can have any name, but it's not recommended to use spaces or underscores, as the name for the lod mesh name will be meshname_lod.
The textures must have the same name as the mesh, but with the texture type identifier after it, so the result will be names like meshname_d.png and meshname_lod_d.png
Files ready for import.
You should place the mesh and texture files in the import folder located here:
The AppData folder is hidden by default, you can access it by pressing Windows + R and typing in appdata.
The template you choose will determine some things about your citizen:
- age phase
- walk speed
- shader, material properties (color variations)
Importing a mesh in asset importer.
- age phase
You can change the 4 color variations.
ModTools scene explorer and console.
The LOD shader is incorrect by default, so you need to run this script to make sure the LOD is correctly displayed.
Save asset window.
The asset name visible ingame.
Snapshot, Thumbnail, Tooltip
There are 2 different folders you can open by clicking the folder icons:
- On the snapshot image, bottom right corner.
Use this one to replace the snapshot, you can replace it with a 1x1 px image to save on the asset file size. This image will only be visible in the content manager. It will also default as the Steam preview image, but you can change that seperately when publishing.
- Below thumbnail, on the right side.
Use this one to change the thumbnail (109x100) and tooltip (492x147) of your asset.
Once you change the main thumbnail, the hover/active states will update automatically.
Local Assets Folder
CRP files in the local assets folder.
The AppData folder is hidden by default, you can access it by pressing Windows+R and typing in appdata.
Share button in content manager.
Go to the content manager > assets and find your asset, then click share.
Title and Description
You can change these on the Steam Workshop later.
Steam Preview Image and Content Folder
Publish window and content folder.
There is also the content folder, which is where the actual asset file is. You can paste multiple .crp files here if you would like to upload a pack of assets.
On the Steam Workshop page for your asset, you can:
- add it to a collection
- add images and videos
- add contributors and links
- add required items and DLC
- change visibility to friends only or private
To update your own item, you must subscribe to it first, then it will show up in the content manager. It won't be the same as a local asset, as it will show an "update" button.
When you click update, click the folder icon, and now you can change the Steam preview image and put your new asset in the content folder. If updating a pack, remember to put all the assets inside the content folder.
You can also add more assets to make it a bigger pack.
Comparison between local (top) and workshop published (bottom) prefab names shown in ModTools.
It's the hidden internal name used to refer to your asset in savefiles.
It's the reason why a local asset is not the same as a workshop published asset.
For local assets: filename.Asset Name_Data
For published workshop assets: SteamID.Asset Name_Data