Foliage Painting and Management
Foliage is the collection of detail meshes that populate the terrain surface with organic visual variety: grass blades, flowers, pebbles, small rocks, bushes, and trees. Unlike objects that are placed individually from the object browser, foliage is painted onto the terrain using a density-based brush system that distributes instances procedurally across the painted area. A terrain with no foliage looks like a bare diorama. A terrain with thoughtfully painted foliage at appropriate density and scale variation looks like a living environment that invites exploration.
This article is a procedural tutorial covering every foliage painting and management operation available in the Unturned™ Level Editor. It describes the foliage panel interface, the brush parameters that control density and scale, the per-foliage-type placement constraints defined in the foliage asset configuration, the erase and re-paint workflow for editing placed foliage, the color variation system, and the failure modes that cause foliage to appear incorrect or absent in the game viewport. The article assumes the reader is familiar with the Level Editor interface, camera controls, and toolbar layout documented in Level Editor UI and Navigation.

Prerequisites
- A map with completed terrain heightmap and material splatmap, created following Custom Map Creation: Project Setup. The editor must be open and the terrain must have at least one material layer painted.
- Familiarity with the editor toolbar, viewport navigation, and the terrain material painting workflow from Terrain Heightmap Editing.
- A set of foliage assets available in the map's master bundle or in the vanilla asset library. The vanilla game ships over 240
InstancedMeshInfoAssetconfigurations and 69 tree types. - A mouse with a scroll wheel for brush size adjustment.
What you will learn
- How to open the foliage panel and navigate the foliage asset list.
- How to select and configure a foliage brush for grass, bushes, and trees.
- How brush parameters (Density, Scale Range, Size) control the placement behavior.
- How per-type density maps work and how multiple foliage types layer on the same area.
- How to paint grass, bush, and tree foliage onto the terrain surface.
- How to configure color variation for natural-looking foliage tint variation.
- How to erase specific foliage types or clear an area entirely.
- How to re-paint and edit placed foliage using the additive brush system.
- How to diagnose and resolve foliage LOD pop-in and foliage not appearing in-game.
Background: how the foliage painting system works
The foliage painting system is a procedural density-map system, not a discrete object placement system. When the paint brush is dragged across the terrain, the editor samples the brush area at regular intervals and evaluates a set of placement conditions at each sample point. If the conditions are satisfied, a foliage instance is added at that position. The conditions are defined in the foliage asset's .dat configuration file and include the terrain material weight threshold, the surface angle range, and the obstruction radius that prevents overlap with existing objects.
As shown in the flowchart above, the foliage brush evaluates three constraint gates at each sample point before placing an instance. The material weight gate, the angle gate, and the obstruction gate are all defined in the foliage asset's .dat file and are not configurable from the brush panel during painting. The brush panel controls only the density target, the scale range, and the brush radius.
Foliage data storage
Foliage data is stored in the Level/Foliage/ directory, separate from the heightmap and splatmap data. Replacing the heightmap or repainting terrain materials does not affect the existing foliage data. The foliage is only modified when the brush tool is used in Paint or Erase mode. The foliage storage format was upgraded from V1 (fragmented per-region files) to V2 (single consolidated file) following the 3.22.8.0 update. Maps using V1 format are automatically upgraded to V2 on the next save after version 3.22.20.0.
Foliage asset subtypes
The foliage system defines two asset subtypes. Each subtype uses a different .dat format and serves a different purpose in the painting workflow.
| Subtype | Type string | Purpose | Painted as |
|---|---|---|---|
InstancedMeshInfoAsset | SDG.Framework.Foliage.InstancedMeshInfoAsset | Small dense foliage rendered through GPU instancing | Grass, flowers, pebbles, small bushes |
FoliageResourceInfoAsset | SDG.Framework.Foliage.FoliageResourceInfoAsset | Trees and large resource foliage with collision | Trees, large bushes, harvestable resources |
The distinction matters for the painting workflow because tree assets (the FoliageResourceInfoAsset subtype) have an Obstruction_Radius that prevents overlap with other large foliage and objects, while instanced mesh assets (grass, pebbles) have a smaller obstruction radius that produces denser coverage. The brush panel treats both subtypes identically for painting purposes: select the asset, configure the brush, and paint.
For the complete foliage asset field reference, see Foliage Asset Reference.
Foliage panel overview
The foliage panel is the primary interface for foliage painting and management. Open it by clicking the Foliage icon on the Level Editor toolbar.
Panel layout
The foliage panel displays a vertical list of all foliage assets available for painting on the current map. Each entry in the list shows:
- Asset name: The internal name of the foliage asset.
- Thumbnail preview: A small icon showing the foliage mesh or a placeholder icon.
- Type indicator: An icon distinguishing
InstancedMeshInfoAsset(grass icon) fromFoliageResourceInfoAsset(tree icon). - Density slider: A per-asset density control that overrides the asset's
Densityfield. The slider range is 0 to 1 and maps to a density multiplier applied at paint time.
Panel controls
| Control | Location | Description |
|---|---|---|
| Mode toggle | Top of panel | Switches between Paint mode and Erase mode |
| Brush Size | Below asset list | The radius of the brush cursor in terrain units, range 1-200 |
| Min Scale | Below Size control | The minimum random scale applied to each placed instance |
| Max Scale | Below Min Scale | The maximum random scale applied to each placed instance |
| Density | Per-asset slider in list | Density multiplier for the selected asset, range 0-1 |
On-screen appearance of the foliage panel
The foliage panel occupies the right side of the editor interface when visible. The asset list scrolls vertically. Each asset row has a small preview thumbnail on the left, the asset name in the center, and a density slider on the right. The current mode (Paint or Erase) is indicated by the highlighted mode button at the top of the panel. The brush cursor appears in the viewport as a circle centered on the mouse position; the circle radius matches the Brush Size value.
Step-by-step: painting grass foliage
Grass is the most frequently painted foliage type. It covers the majority of the terrain surface and provides the visual foundation for all other foliage layers.
Step 1: Open the foliage panel by clicking the Foliage icon on the toolbar.
Step 2: Confirm the mode is set to Paint (the default mode). The Paint button is highlighted.
Step 3: Select a grass foliage asset from the list. Grass assets are InstancedMeshInfoAsset type and are typically named Grass_00, Grass_Dense_01, Grass_Tall_00, or similar conventions. The preview thumbnail shows a green grass blade or patch.
Step 4: Set the brush parameters. For ground-cover grass on a standard survival map, the cohort starting point is:
| Parameter | Recommended value | Rationale |
|---|---|---|
| Brush Size | 100-150 | Covers a broad area per stroke for efficient grass painting |
| Density slider | 0.4-0.6 | Produces moderate coverage visible from standing height |
| Min Scale | 0.6 | Prevents grass instances from appearing too small or too uniform |
| Max Scale | 1.2 | Allows some instances to reach full height for visual variety |
Step 5: Position the brush cursor over the terrain area where grass should appear. Left-click and hold, then drag the mouse across the terrain surface. Grass instances appear under the brush cursor as the stroke is applied.
Step 6: Continue painting until the target area is covered. Release the mouse button to end the stroke.
On-screen appearance: As the brush is dragged, grass mesh instances appear in real time on the terrain surface. Each stroke adds instances at the configured density within the brush radius. The instances are placed with random rotation and scale within the configured range, producing a natural-looking distribution. The grass instances are shaded by the current environmental lighting and cast shadows if the foliage material supports shadow casting.
Step 7: After painting the base grass layer, switch to a second grass asset with a different scale range (e.g., a tall grass variant with Min Scale 0.8, Max Scale 1.8) and paint over the same area at a lower density (0.2-0.3). This creates a layered grass effect with both low ground cover and taller stalks.
Step-by-step: painting bushes
Bushes are medium-height foliage that provides visual variety between the ground-level grass layer and the overhead tree layer.
Step 1: Select a bush foliage asset from the foliage list. Bush assets are typically named Bush_00, Shrub_01, or use the foliage type's internal name. Bush assets can be either InstancedMeshInfoAsset or FoliageResourceInfoAsset subtype depending on whether they have collision behavior.
Step 2: Set the brush parameters. For bushes, use smaller brush settings than grass:
| Parameter | Recommended value |
|---|---|
| Brush Size | 40-80 |
| Density slider | 0.15-0.3 |
| Min Scale | 0.5-0.7 |
| Max Scale | 1.3-1.6 |
Step 3: Paint the terrain surface in areas where bushes should appear: along forest edges, in clearings, scattered across open terrain. Each stroke places bush instances within the brush radius at the configured density.
Step 4: For bush clusters around tree bases (simulating natural undergrowth), reduce the brush size to 20-30 and paint small patches around each tree position.
On-screen appearance: Bush instances appear as larger, more substantial meshes than grass. The obstruction radius defined in the bush asset prevents bushes from overlapping with trees and buildings. Bush instances may have visible shadow casting depending on the asset configuration.
Step-by-step: painting trees
Trees are FoliageResourceInfoAsset subtype. They have collision behavior, can be harvested for resources, and have an Obstruction_Radius that prevents them from spawning inside buildings or overlapping with other trees.
Step 1: Select a tree foliage asset from the foliage list. Tree assets are listed under the Resources section and are named by tree type: Pine_00, Oak_00, Palm_00, etc.
Step 2: Set the brush parameters. Trees require significantly wider spacing than grass or bushes:
| Parameter | Recommended value |
|---|---|
| Brush Size | 30-60 |
| Density slider | 0.05-0.15 |
| Min Scale | 0.7-0.85 |
| Max Scale | 1.0-1.3 |
Step 3: Paint the terrain surface. Each click places one or more tree instances within the brush area, subject to the tree asset's Obstruction_Radius and density configuration.
On-screen appearance: Trees appear as full-size resource models with collision. The tree instances are placed with random rotation and scale. The tree's Obstruction_Radius is visualized in the editor as a light sphere around each potential placement position, visible during the stroke when the cursor is held over an area where a tree would be placed. Trees that cannot be placed due to obstruction are silently skipped; the brush only places instances where the obstruction check passes.
Step 4: For forest areas, paint multiple strokes across the same area to build up tree density. The density slider controls the per-stroke density; multiple passes over the same area add trees cumulatively until the obstruction radius prevents further placement.
Tree placement constraints
Tree placement is constrained by the asset's .dat fields, which are not adjustable from the brush panel. The following fields control where trees can be placed:
| Field | Description | Default behavior |
|---|---|---|
Min_Weight / Max_Weight | Terrain material weight range | Trees only placed on material layers whose blend weight falls within this range |
Min_Angle / Max_Angle | Surface slope angle range | Trees not placed on slopes steeper than the max angle |
Obstruction_Radius | Overlap check sphere radius | Trees not placed within this distance of any existing obstruction |
A tree asset configured with Max_Angle 30 will not be placed on slopes steeper than 30 degrees, regardless of the brush position. If the brush stroke covers a slope area, trees are only placed on the portions of the brush area where the slope angle is within the allowed range.
Density controls in the brush workflow
The density system determines how many instances of a foliage type appear per unit area. Understanding the density-to-coverage relationship is essential for achieving the intended visual result.
Density slider interpretation
The per-asset density slider in the foliage panel is a multiplier applied to the foliage asset's Density field at paint time. A density slider value of 1.0 applies the asset's full density. A value of 0.5 applies half the asset's density. A value of 0.0 places no instances (effectively disabling the asset during painting).
| Density slider | Effective density multiplier | Coverage character |
|---|---|---|
| 0.0 | 0x | No instances placed |
| 0.25 | 0.25x | Very sparse; individual instances clearly separated |
| 0.5 | 0.5x | Sparse but coverage is visible as a group |
| 0.75 | 0.75x | Moderate density; instances begin to overlap visually |
| 1.0 | 1.0x | Full asset density; dense coverage |
Layering multiple foliage types
Multiple foliage types with overlapping material weight ranges all place instances in the same area, producing a layered effect. The typical layering strategy is:
- Base layer: A short grass type at density 0.5-0.7 covering all vegetated terrain.
- Mid layer: A tall grass or flower type at density 0.2-0.4 layered over the base grass.
- Scatter layer: Pebbles or small rocks at density 0.1-0.2 in open areas.
- Bush layer: Bushes at density 0.1-0.2 along forest edges and terrain transitions.
- Tree layer: Trees at density 0.05-0.15 in forest zones.
Each layer uses a different foliage asset. The layers combine visually to produce a terrain surface that looks organic rather than uniform.
Density and performance trade-off
Higher density values produce more instances per unit area, which increases GPU workload. The cohort-recommended maximum density for a Medium map is:
| Foliage type | Maximum density | Reason |
|---|---|---|
| Short grass | 0.6 | Dense grass is the highest-instance-count foliage type |
| Tall grass | 0.4 | Each tall grass instance has more triangles than short grass |
| Flowers | 0.3 | Flowers use non-uniform scale, reducing instancing efficiency |
| Pebbles | 0.2 | Low-density scatter is visually sufficient |
| Bushes | 0.2 | Bushes are large; low density is visually adequate |
| Trees | 0.15 | Each tree is a high-poly resource asset |
Exceeding these values on a Medium map with three or more grass types can produce millions of instances, causing measurable frame rate degradation on average hardware.
Scale range and visual variety
The Min Scale and Max Scale brush parameters control the random size variation applied to every foliage instance placed during the stroke. Each instance receives a random scale value uniformly distributed within the configured range.
Scale range configuration
| Scale behavior | Min Scale | Max Scale | Visual effect |
|---|---|---|---|
| Uniform size | 1.0 | 1.0 | All instances identical size; looks artificial |
| Subtle variation | 0.85 | 1.15 | Instances vary by 15% in each direction; natural but subtle |
| Moderate variation | 0.6 | 1.4 | Instances vary by 40%; good for most foliage types |
| Wide variation | 0.4 | 1.8 | Instances vary by 140%; suitable for wild, untended vegetation |
The cohort recommendation for most foliage types is a scale range of 0.6-1.4 (moderate variation). Narrower ranges (0.85-1.15) are appropriate for manicured or uniform vegetation such as hedge rows or planted crops. Wider ranges (0.4-1.8) are appropriate for wild, overgrown vegetation in abandoned or post-apocalyptic biomes.
Uniform Scale optimization
The foliage asset's Uniform_Scale field determines whether the scale is applied uniformly on all axes (a single float value) or per-axis (a Vector3 value). When Uniform_Scale is true in the asset's .dat, the Min Scale and Max Scale brush parameters produce uniform scaling on all axes, enabling a GPU instancing optimization that packs more instances per draw call.
Grass and pebble assets should have Uniform_Scale true for maximum performance. Flowers and plants that benefit from non-uniform aspect ratios (wider horizontally than vertically) may set Uniform_Scale false.
Color variation for foliage
Foliage instances support per-type color variation controlled by two fields in the foliage asset's .dat configuration: Color and Color_Range. These fields are not adjustable from the brush panel; they are set at asset authoring time.
How color variation works
The Color field defines the base color of the foliage mesh as an RGB triplet in 0-1 float range. The Color_Range field defines a uniform offset that is applied randomly to each instance's color. A higher Color_Range value produces more chromatic variation between instances.
Color base | Color_Range | Visual effect |
|---|---|---|
0.3 0.6 0.2 (green) | 0.0 | All instances identical green; no variation |
0.3 0.6 0.2 (green) | 0.05 | Subtle variation; instances range from slightly lighter to slightly darker green |
0.3 0.6 0.2 (green) | 0.15 | Natural variation; instances include yellowish-green and blueish-green tints |
0.3 0.6 0.2 (green) | 0.3 | Wide variation; some instances appear yellow, brown, or almost gray |
For a grass asset with Color 0.3 0.6 0.2 and Color_Range 0.15, individual grass blade instances receive random tints between 0.15 0.45 0.05 and 0.45 0.75 0.35, creating a natural-looking mix of lighter and darker blades.
Color variation by biome
The cohort-recommended color ranges for common biomes are:
| Biome | Base color (R G B) | Color_Range |
|---|---|---|
| Temperate forest | 0.25 0.55 0.15 | 0.12 |
| Desert | 0.5 0.5 0.2 | 0.08 |
| Tundra | 0.4 0.5 0.3 | 0.06 |
| Tropical | 0.15 0.5 0.1 | 0.15 |
| Grassland | 0.3 0.6 0.2 | 0.1 |
| Swamp | 0.2 0.4 0.15 | 0.08 |
The base color and range are asset properties that affect every instance of that foliage type across the entire map. To create biome-specific color zones, author separate foliage assets for each biome with matching color ranges, then restrict each asset to the appropriate terrain material layer weight range.
Erasing and removing foliage
Foliage erasing removes instances from the terrain surface. The erase operation is type-aware: it can remove all foliage types or only a specific type.
Erasing all foliage in an area
Step 1: In the foliage panel, toggle the mode to Erase. The mode button switches from Paint (highlighted) to Erase (highlighted).
Step 2: Set the Brush Size to match the area from which foliage should be removed. A size of 60-100 is appropriate for broad clearing operations.
Step 3: Paint the terrain surface. All foliage instances within the brush radius, regardless of type, are removed.
Step 4: Release the mouse button. The foliage instances in the painted area are gone.
On-screen appearance: As the erase brush is dragged, all foliage instances within the brush radius disappear immediately. The terrain surface returns to its bare state, showing only the terrain material texture. The removal is immediate and permanent; there is no undo for erase operations.
Erasing a specific foliage type
Step 1: In the foliage panel, select the specific foliage type to erase from the asset list.
Step 2: Toggle the mode to Erase.
Step 3: Paint the terrain surface. Only instances of the selected foliage type are removed. All other foliage types in the brush area remain intact.
This is useful for removing a single over-dense grass type while leaving other types untouched. For example, if the base grass layer is too dense but the bush and flower layers are correct, select the grass asset in the list and erase only the grass instances.
Editing placed foliage through erase and re-paint
Individual foliage instances cannot be selected and moved like objects. Foliage is a procedural density map, not a collection of discrete objects. The erase and re-paint workflow is the only method for modifying placed foliage:
- Erase the area using Erase mode with the specific foliage type selected.
- Re-paint the area using Paint mode with adjusted brush parameters (density, scale range).
- Add additional foliage types by painting other assets over the same area.
For a complete foliage replacement in a specific region (e.g., changing a grass type from short grass to tall grass), erase the area for the short grass type, then paint the tall grass type over the same region.
Failure mode: foliage LOD pop-in
Foliage instances that suddenly appear as the camera approaches create a distracting pop-in effect that breaks visual immersion.
What it looks like: While the camera moves across the terrain, grass or bush instances blink into existence at a visible distance threshold. The instances are absent beyond this threshold and appear abruptly when the threshold is crossed.
Root cause: The LOD (level of detail) transition distance for the foliage mesh is too short. The foliage system uses a fade-in distance calculated from the asset's Tile_Dither setting and the detail mesh LOD group distances configured in the Unity source asset.
Resolution: The LOD transition distance is configured through two mechanisms:
Tile_Dither setting: In the foliage asset's
.datfile, setTile_Dither trueto enable progressive dithering that fades instances in gradually near the tile border rather than cutting them off abruptly. This reduces the visual pop at tile boundaries but does not change the absolute render distance.Detail mesh LOD group: In the Unity source asset for the foliage mesh, increase the LOD group distances for the detail mesh. The detail mesh LOD group controls the distance at which the mesh switches from full detail to a lower-detail representation. Extending the LOD group range reduces pop-in by keeping the higher-detail mesh visible at longer distances.
For the full foliage LOD configuration workflow, see The Optimal Angle for Grass Blades in Foliage.
Failure mode: foliage not appearing in game
Foliage that is visible in the editor viewport but absent when the map is loaded in-game is a bundle accessibility issue.
What it looks like: The editor viewport shows grass, bushes, and trees correctly placed on the terrain. The in-game viewport shows bare terrain with no foliage at the same location.
Root cause: The foliage asset's master bundle is not accessible to the game client at runtime. The editor loads foliage data from the local foliage storage directory and renders the instances using the locally available bundle assets. The game client loads foliage data from the same storage but must find the bundle assets through the map's asset bundle resolution system.
Resolution steps:
Step 1: Verify that the foliage asset's master bundle .unity3d file is present in the map's Bundles/ folder. The bundle must be in the same directory as all other map bundles.
Step 2: If the foliage uses a custom prefab mesh (not a vanilla asset), confirm that the mesh is included in the master bundle and that the bundle has the correct file name as specified in the foliage .dat file's Mesh pointer.
Step 3: Verify the foliage .dat file's Master_Bundle_Override field, if present, points to the correct master bundle name. If the field is absent, the engine looks for the mesh in the core master bundle.
Step 4: Test by loading the map in single-player. If foliage appears in single-player but not on a dedicated server, the server's bundle copy is missing or the server's workshop manifest does not include the map's required bundles.
Failure mode: foliage density too high or too low
Foliage that appears either impenetrably dense or implausibly sparse after painting is a density mismatch between the brush slider and the asset's base density.
What it looks like: An area painted at density slider 0.5 produces either a solid wall of grass (if the asset's base density is very high) or a few scattered blades (if the base density is very low).
Root cause: The density slider is a multiplier applied to the asset's base Density field. An asset with Density 0.5 (very dense) painted at slider 0.5 still produces dense coverage because the effective density is the multiplication of the two values.
Resolution: Inspect the foliage asset's Density field in its .dat file. For InstancedMeshInfoAsset, the Density value represents the area in square meters per instance (lower = denser). For an asset with Density 1.0, each instance occupies approximately 1 square meter. At density slider 0.5, the effective density is 2 square meters per instance.
The cohort recommendation is to inspect the asset's base density before painting and to adjust the brush slider accordingly:
| Asset base density | Slider value for moderate coverage | Slider value for sparse coverage |
|---|---|---|
| 0.5 (very dense) | 0.2-0.3 | 0.05-0.1 |
| 1.0 (dense) | 0.3-0.5 | 0.1-0.2 |
| 2.0 (moderate) | 0.5-0.7 | 0.2-0.3 |
| 4.0 (sparse) | 0.7-1.0 | 0.3-0.5 |
| 8.0 (very sparse) | 1.0 | 0.5-0.7 |
Failure mode: trees not placing on sloped terrain
Trees that refuse to appear on hilly terrain despite the brush passing over the area are being excluded by the asset's angle constraint.
What it looks like: The brush paints tree instances on flat terrain but produces no instances on hillsides or slopes. The flat areas of the brush stroke are populated; the sloped portions are empty.
Root cause: The tree asset's Max_Angle field is set too low for the terrain slope. Trees configured with Max_Angle 30 will not be placed on any terrain surface steeper than 30 degrees from horizontal.
Resolution: Inspect the tree asset's .dat file and increase the Max_Angle value if trees should be allowed on steeper slopes. A value of Max_Angle 45 allows trees on all but the steepest terrain. For trees that should appear on any terrain regardless of slope, set Max_Angle 90.
Alternatively, use the terrain Smooth brush to reduce the slope angle of the hillside below the tree's Max_Angle threshold, then re-paint the tree foliage.
Failure mode: foliage appears in wrong biome or terrain area
Foliage that appears on terrain material types where it should not be present is being placed outside its intended material weight range.
What it looks like: Grass configured for the grass material layer (weight range 0.3-0.8) appears abundantly on the rock material layer (weight 0.0-0.2) where it should be absent.
Root cause: The foliage asset's Min_Weight and Max_Weight fields are set too broadly, allowing placement on terrain materials outside the intended biome. An asset with Min_Weight 0.0 and Max_Weight 1.0 places on any terrain material without restriction.
Resolution: Edit the foliage asset's .dat file to narrow the Min_Weight and Max_Weight values to match the intended terrain material. For a foliage type that should only appear on the grass layer (material layer index 0 with weight 0.5-1.0), set Min_Weight 0.5 and Max_Weight 1.0. After editing the asset fields, re-paint the foliage on the terrain to apply the new constraints.
FAQs
Can I undo a foliage erase operation?
Foliage erase operations are not undoable through the Level Editor's undo system (Ctrl+Z). Once instances are erased, they are removed from the foliage data. The only recovery method is to close the editor without saving (if the map was not saved after the erase) or to restore the Level/Foliage/ directory from a backup.
Why does my grass stop appearing at a certain distance from the camera?
The grass LOD distance is controlled by the Tile_Dither setting and the detail mesh LOD group in Unity. Grass that disappears at a specific distance threshold is reaching the limit of its LOD group range. Increase the LOD group distances in the source Unity asset or enable Tile_Dither for a softer fade-out.
How do I make foliage that only appears on certain terrain material layers?
Edit the foliage asset's .dat file and set the Min_Weight and Max_Weight fields to the material weight range of the target terrain layer. An asset with Min_Weight 0.5 and Max_Weight 0.9 only appears on terrain areas where the blend weight of the corresponding material layer falls within this range. The weight values correspond to the blend weight of the terrain material painted in the Level Editor.
What is the maximum number of foliage types I can paint on one map?
There is no hard limit enforced by the engine, but practical limits are imposed by GPU performance. The cohort recommendation is to keep foliage type counts under 20 per biome area and under 40 total for the entire map. Each foliage type requires a separate draw call batch for its GPU instanced meshes.
How do I create a forest with mixed tree types?
Paint each tree type separately. Select the first tree asset (e.g., Pine) and paint the forest area at density 0.08. Select the second tree asset (e.g., Oak) and paint the same area at density 0.05. The two tree types layer in the same area, producing a mixed forest. Ensure both tree assets have compatible Obstruction_Radius values so they do not exclude each other.
Can I paint foliage on vertical cliff faces?
Foliage placement is constrained by the foliage asset's Max_Angle field. By default, most foliage assets have Max_Angle set to 45-90 degrees. An asset with Max_Angle 90 can be painted on vertical surfaces. However, the foliage mesh is placed at the terrain surface angle, so grass on a vertical cliff face will be rendered sideways. For cliff vegetation, use foliage assets specifically authored for vertical placement with appropriate mesh geometry.
How do I remove the V1 backup foliage files after upgrading to V2?
Navigate to the map's Foliage/ directory and delete the V1 backup files. The V2 single-file format is active and the V1 files are no longer needed. Verify the map loads and foliage appears correctly after deletion. The cohort recommendation is to keep the V1 files until the map has been tested and confirmed stable on V2.
What happens to existing foliage when I repaint the terrain material?
Existing foliage placement is baked into the foliage data based on the terrain material configuration at the time of painting. Repainting terrain materials does not automatically remove or re-evaluate existing foliage. Foliage instances placed on a previously grass-covered area remain even if the area is repainted to rock. The map author must erase and re-paint the foliage to apply new material constraints.
Why is my tree foliage not growing near buildings?
The tree asset's Obstruction_Radius prevents placement within a certain distance of any obstruction, including buildings. Check the tree asset's Obstruction_Radius value. A radius of 4 meters prevents trees from appearing within 4 meters of a building wall. Reduce the value if trees should grow closer to structures, or paint trees manually at lower density in building-adjacent areas.
How do I make seasonal foliage variations?
Season-specific foliage is achieved through separate foliage assets for different seasons. Create multiple InstancedMeshInfoAsset configurations with the same mesh and material but different color ranges. When the in-game season changes, the active foliage configuration must be updated. This requires server-side scripting or map-level configuration updates and is not achievable through the foliage panel alone.
Best practices
- Paint foliage systems in order from base layer to top layer: ground cover grass, then flowers and scatter, then bushes, then trees. Each layer is visible on top of the previous layer and the ordering reduces the need to erase and re-paint.
- Use the minimum foliage density that achieves the intended visual coverage. Higher density is the leading cause of performance issues on custom maps.
- Layer multiple foliage types with overlapping but different material weight ranges to create natural-looking vegetation transitions at biome boundaries.
- Configure the scale range for each foliage type to produce natural size variation. Uniformly sized foliage looks artificial at any density.
- Test foliage density at the maximum view distance to ensure the intended coverage level reads correctly from a distance.
- Save the map before any erase operation. Erase operations are not undoable.
- Erase and re-paint foliage after terrain material repainting to apply the new material constraints.
- Keep V1 backup foliage files until V2 conversion is verified stable.
- Use foliage assets with
Uniform_Scale truefor grass and pebbles to maximize GPU instancing performance.
Advanced considerations
Biome-specific foliage configuration using material weight constraints
Foliage types can be restricted to specific biome zones by pairing terrain material painting with foliage material weight constraints. Paint distinct terrain material layers for each biome zone (grass for temperate, sand for desert, rock for mountain). Configure each foliage asset's Min_Weight and Max_Weight fields to match the material weight range of its target biome. A desert cactus foliage asset with Min_Weight 0.0 and Max_Weight 0.3 only appears on terrain with predominantly sand or rock material, which corresponds to the desert biome's material layer.
Performance tuning for dense foliage areas
Areas with very dense foliage (forest interiors, overgrown ruins) benefit from targeted performance tuning. The cohort recommendation for dense foliage areas is:
- Use at most three grass types in the dense area.
- Set the density slider to 0.3-0.4 for each grass type.
- Use trees with
Obstruction_Radiusvalues that produce natural spacing (3-5 meters for standard trees). - Avoid using non-uniform scale (
Uniform_Scale false) on any foliage in the dense area. - Enable
Tile_Ditheron all foliage types in the dense area to distribute the rendering cost across frames.
Foliage LOD group configuration in Unity
The foliage mesh's LOD group is configured in the Unity source prefab. For instanced mesh foliage, the LOD group consists of two levels: the full-detail mesh at close range and a lower-detail mesh (or culled) at far range. The transition distance between these levels is set in the LOD group component. The cohort recommendation for foliage LOD groups is to set the first LOD transition at 30-40 meters and the cull distance at 60-80 meters, with Tile_Dither enabled for soft fade-out.
Appendix A: Foliage brush parameters quick-reference card
| Foliage type | Brush Size | Density slider | Min Scale | Max Scale |
|---|---|---|---|---|
| Short grass (base layer) | 100-150 | 0.4-0.6 | 0.6 | 1.2 |
| Tall grass (accent layer) | 80-120 | 0.2-0.3 | 0.8 | 1.8 |
| Flowers | 60-100 | 0.15-0.25 | 1.0 | 1.4 |
| Pebbles / scatter | 60-100 | 0.1-0.2 | 0.5 | 1.5 |
| Small bushes | 40-80 | 0.15-0.3 | 0.5 | 1.3 |
| Large bushes | 30-60 | 0.1-0.2 | 0.7 | 1.6 |
| Trees (forest) | 30-60 | 0.08-0.15 | 0.7 | 1.3 |
| Trees (open terrain) | 20-40 | 0.03-0.08 | 0.8 | 1.2 |
Appendix B: Foliage failure mode diagnostic table
| Symptom | Most likely cause | Resolution |
|---|---|---|
| Foliage visible in editor but absent in-game | Master bundle not accessible at runtime | Verify bundle path and Master_Bundle_Override field |
| Grass instances appear suddenly as camera approaches | LOD transition distance too short | Increase Tile_Dither or adjust LOD group in source mesh |
| Foliage density is too high after painting | Density slider too high for the asset's base density | Reduce the density slider or erase and re-paint at lower setting |
| Foliage density is too low after painting | Density slider too low for the asset's base density | Increase the density slider or paint additional passes |
| Trees not placed on hillsides | Max_Angle constraint in tree asset is too low | Increase Max_Angle in tree asset's .dat file |
| Foliage appears on wrong terrain material | Min_Weight / Max_Weight range too broad | Narrow the weight range in the foliage asset's .dat file |
| Trees growing inside buildings | Obstruction_Radius too small for building coverage | Increase Obstruction_Radius in tree asset's .dat file |
| Foliage instances all the same size | Scale range too narrow (Min Scale and Max Scale too close) | Widen the scale range to 0.6-1.4 or greater |
| Foliage instances stretched or squashed | Non-uniform scale with incompatible mesh | Enable Uniform_Scale true in the asset's .dat file |
| Erase brush removes all types instead of one | Specific foliage type not selected before switching to Erase | Select the type in the foliage list before toggling Erase |
| Foliage has no color variation | Color_Range is 0 in the asset's .dat file | Increase Color_Range to 0.1-0.15 |
| Map loads slowly with V1 foliage | Foliage storage is in V1 fragmented format | Save the map to trigger automatic V2 conversion |
Appendix C: Foliage biome configuration reference
The table below provides cohort-validated foliage type combinations for common biomes.
| Biome | Grass type | Ground cover | Bushes | Trees |
|---|---|---|---|---|
| Temperate forest | Short green grass | Ferns, moss, flowers | Small deciduous bushes | Pine and oak mix |
| Desert | Sparse tan grass | Pebbles, small rocks | Dry brush | Cacti, acacia |
| Tundra | Short pale grass | Moss, lichen | Low alpine shrubs | Spruce, bare pines |
| Tropical | Dense green grass | Ferns, vines | Dense tropical bushes | Palm, hardwood |
| Grassland | Medium green grass | Wildflowers | Scattered bushes | Few trees, widely spaced |
| Swamp | Dark green grass | Reeds, cattails | Dense wetland shrubs | Cypress, mangrove |
Appendix D: Biome foliage terrain weight ranges
| Biome | Grass weight range | Ground cover weight range | Bush weight range | Tree weight range |
|---|---|---|---|---|
| Temperate forest | 0.2-0.9 | 0.3-0.8 | 0.4-0.8 | 0.5-0.8 |
| Desert | 0.0-0.3 | 0.0-0.5 | 0.0-0.2 | 0.0-0.2 |
| Tundra | 0.2-0.7 | 0.2-0.6 | 0.2-0.5 | 0.3-0.6 |
| Tropical | 0.3-1.0 | 0.4-0.9 | 0.4-0.9 | 0.5-1.0 |
| Grassland | 0.2-0.8 | 0.2-0.6 | 0.2-0.5 | 0.3-0.6 |
| Swamp | 0.6-1.0 | 0.5-1.0 | 0.5-0.9 | 0.6-1.0 |
Authoring checklist
Before publishing a map with painted foliage, confirm the following:
- [ ] Base grass layer painted at appropriate density across all vegetated terrain
- [ ] Bush and tree layers painted with correct density for each biome zone
- [ ] Scale range configured for natural-looking size variation
- [ ] Foliage LOD pop-in tested at maximum view distance
- [ ] Foliage visible in-game on both single-player and dedicated server
- [ ] V2 foliage format active (V1 backup files deleted after verification)
- [ ] Foliage density does not cause frame rate drops in dense areas
- [ ] Color variation produces natural-looking tint distribution
- [ ] Terrain material repainting does not leave orphaned foliage in wrong zones
- [ ] Erase operations verified and backed up before destructive editing
Cross-references
- Water Placement and Configuration -- the previous article in the mapping pipeline; covers water plane configuration.
- Road and Path Tool -- the next article; covers road spline placement and configuration.
- Foliage Asset Reference -- the complete field reference for InstancedMeshInfoAsset and FoliageResourceInfoAsset configuration.
- Terrain Heightmap Editing -- the terrain editing workflow that precedes foliage painting.
- The Optimal Angle for Grass Blades in Foliage -- grass blade geometry configuration for foliage authoring.
- Landscape Material Asset Reference -- terrain material configuration for foliage layer association.
- Smartly Dressed Games modding documentation -- official field reference.
- Unturned on Steam -- game page and community.
Document history
| Version | Date | Author | Notes |
|---|---|---|---|
| 1.0 | 2026-07-26 | 57 Studios | Initial publication. Foliage painting workflow, brush parameters, color variation, erase workflow, failure mode documentation. |
