Schema v3 Recipe Authoring Guide¶
This guide covers the complete JSON schema for creating custom Asset Scaffolding recipes. Schema v3 introduces powerful features like parameters, presets, conditional sections, and recipe inheritance.
Schema Overview¶
{
"schema_version": 3,
"id": "unique_recipe_id",
"display_name": "Human Readable Name",
"description": "What this recipe creates",
// Metadata
"author": "Your Name",
"version": "1.0.0",
"category": "Gameplay",
"tags": ["blueprint", "character"],
// Customization (Schema v3)
"parameters": [...],
"presets": [...],
// Asset definition
"asset_type": "Blueprint",
"asset_subtype": "Character",
"expected_path": "/Game/Blueprints/{{Name}}",
// Blueprint contents
"components": [...],
"variables": [...],
"functions": [...],
"interfaces": [...],
"event_graph": [...]
}
Core Fields¶
Identification¶
| Field | Type | Required | Description |
|---|---|---|---|
schema_version |
int | Yes | Must be 3 for Schema v3 |
id |
string | Yes | Unique identifier (lowercase, underscores) |
display_name |
string | Yes | Human-readable name shown in UI |
description |
string | Yes | What the recipe creates |
Metadata¶
| Field | Type | Required | Description |
|---|---|---|---|
author |
string | No | Recipe author name |
version |
string | No | Semantic version (default: "1.0.0") |
category |
string | Yes | Category for organization |
pack_id |
string | No | Recipe pack (fps_pack, rpg_pack, etc.) |
tags |
string[] | No | Searchable tags |
is_curated |
bool | No | Official BrahmaForge recipe |
is_template |
bool | No | Base recipe for inheritance only |
is_deprecated |
bool | No | Mark as deprecated |
Asset Definition¶
| Field | Type | Required | Description |
|---|---|---|---|
asset_type |
string | Yes | Blueprint, WidgetBlueprint, Material, DataAsset, etc. |
asset_subtype |
string | No | For Blueprints: Actor, Character, Pawn, etc. |
parent_class |
string | No | Parent class path for custom inheritance |
expected_path |
string | No | Suggested output path (supports {{Param}}) |
Parameters¶
Parameters make recipes customizable. Users can adjust values when scaffolding.
Parameter Definition¶
{
"parameters": [
{
"name": "CharacterName",
"type": "string",
"default": "MyCharacter",
"description": "Name for the character",
"required": true,
"group": "Identity"
},
{
"name": "MaxHealth",
"type": "float",
"default": "100.0",
"min": 1,
"max": 100000,
"description": "Maximum health points",
"group": "Stats"
},
{
"name": "CharacterType",
"type": "enum",
"default": "Player",
"options": ["Player", "NPC", "Enemy"],
"description": "Type of character",
"group": "Identity"
},
{
"name": "CanSprint",
"type": "bool",
"default": "true",
"description": "Enable sprinting",
"group": "Abilities"
}
]
}
Parameter Types¶
| Type | Description | Additional Fields |
|---|---|---|
string |
Text value | validation_regex |
int |
Integer number | min, max |
float |
Decimal number | min, max |
bool |
true/false | - |
enum |
Selection from options | options (required) |
asset_ref |
Asset reference | asset_class |
Parameter Fields¶
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Parameter name (use in templates as {{Name}}) |
type |
string | Yes | One of: string, int, float, bool, enum, asset_ref |
default |
string | Yes | Default value (as string) |
description |
string | No | Shown in UI |
required |
bool | No | Must be provided (default: true) |
group |
string | No | UI grouping |
min |
number | No | Minimum value (numeric types) |
max |
number | No | Maximum value (numeric types) |
options |
string[] | Enum only | Valid enum values |
validation_regex |
string | No | Regex pattern for string validation |
Presets¶
Presets are pre-configured parameter combinations for quick scaffolding.
{
"presets": [
{
"name": "ThirdPerson_Player",
"description": "Standard third-person player character",
"values": {
"CharacterName": "Player",
"CharacterType": "Player",
"MaxHealth": "100",
"WalkSpeed": "600",
"HasCamera": "true",
"CameraStyle": "ThirdPerson"
},
"tags": ["player", "third-person"]
},
{
"name": "Basic_Enemy",
"description": "Basic enemy character",
"values": {
"CharacterName": "Enemy",
"CharacterType": "Enemy",
"MaxHealth": "50",
"HasCamera": "false"
},
"tags": ["enemy", "ai", "combat"]
}
]
}
Preset Fields¶
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Preset identifier |
description |
string | No | What this preset creates |
values |
object | Yes | Parameter value overrides |
tags |
string[] | No | Searchable tags |
thumbnail_path |
string | No | Preview image path |
Template Expressions¶
Use {{ParameterName}} syntax to insert parameter values anywhere in the recipe.
In Expected Path¶
In Component Properties¶
{
"components": [
{
"class": "CharacterMovementComponent",
"name": "CharacterMovement",
"properties": {
"MaxWalkSpeed": "{{WalkSpeed}}",
"JumpZVelocity": "{{JumpHeight}}"
}
}
]
}
In Variable Defaults¶
Enum Mapping¶
Map enum parameter values to different output values:
Components¶
Define Blueprint components to add.
{
"components": [
{
"class": "CapsuleComponent",
"name": "CapsuleComponent",
"is_root": true,
"properties": {
"CapsuleHalfHeight": "96",
"CapsuleRadius": "42"
}
},
{
"class": "SkeletalMeshComponent",
"name": "Mesh",
"attach_to": "CapsuleComponent"
},
{
"class": "SpringArmComponent",
"name": "CameraBoom",
"attach_to": "CapsuleComponent",
"condition": "{{HasCamera}} == true",
"properties": {
"TargetArmLength": "{{CameraArmLength}}",
"bUsePawnControlRotation": "true"
}
},
{
"class": "CameraComponent",
"name": "FollowCamera",
"attach_to": "CameraBoom",
"attach_socket": "CameraSocket",
"condition": "{{HasCamera}} == true"
}
]
}
Component Fields¶
| Field | Type | Required | Description |
|---|---|---|---|
class |
string | Yes | UE component class name |
name |
string | Yes | Instance name |
is_root |
bool | No | Set as root component |
attach_to |
string | No | Parent component name |
attach_socket |
string | No | Socket name for attachment |
properties |
object | No | Property key-value overrides |
condition |
string | No | Include only if condition is true |
Conditional Components¶
Use the condition field to include components based on parameter values:
{
"class": "AIPerceptionComponent",
"name": "AIPerception",
"condition": "{{UsePerception}} == true"
}
Supported operators: ==, !=, >, <, >=, <=
Combine conditions: {{A}} == true && {{B}} > 0
Variables¶
Define Blueprint variables.
{
"variables": [
{
"name": "MaxHealth",
"type": "float",
"default": "{{MaxHealth}}",
"category": "Stats",
"tooltip": "Maximum health points",
"exposed": true
},
{
"name": "CurrentHealth",
"type": "float",
"default": "{{MaxHealth}}",
"category": "Stats",
"replicated": true,
"replication_condition": "COND_OwnerOnly"
},
{
"name": "InventoryItems",
"type": "object",
"object_class": "InventoryItem",
"is_array": true,
"category": "Inventory"
},
{
"name": "TeamColor",
"type": "struct",
"struct_type": "LinearColor",
"default": "(R=1,G=0,B=0,A=1)",
"category": "Team"
}
]
}
Variable Fields¶
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Variable name |
type |
string | Yes | Type (see table below) |
default |
string | No | Default value |
category |
string | No | Category in Details panel |
tooltip |
string | No | Description tooltip |
exposed |
bool | No | Blueprint editable (default: true) |
read_only |
bool | No | Read-only in editor |
replicated |
bool | No | Network replicated |
replication_condition |
string | No | COND_None, COND_InitialOnly, COND_OwnerOnly |
is_array |
bool | No | Make array type |
struct_type |
string | Struct only | Struct name (Vector, LinearColor, etc.) |
object_class |
string | Object only | Object class path |
Variable Types¶
| Type | Description | Example Default |
|---|---|---|
bool |
Boolean | "false" |
int |
Integer | "0" |
float |
Float | "0.0" |
text |
FText | "Hello" |
string |
FString | "World" |
name |
FName | "None" |
struct |
Struct | Depends on struct_type |
object |
Object reference | "None" |
Functions¶
Define Blueprint functions and events.
{
"functions": [
{
"name": "TakeDamage",
"is_event": true,
"category": "Damage",
"tooltip": "Handle incoming damage",
"stub_implementation": "subtract_health_and_check_death",
"inputs": [
{ "name": "DamageAmount", "type": "float" },
{ "name": "DamageEvent", "type": "struct", "struct_type": "DamageEvent" },
{ "name": "EventInstigator", "type": "object", "object_class": "Controller" }
],
"outputs": [
{ "name": "ActualDamage", "type": "float" }
]
},
{
"name": "GetHealthPercent",
"category": "Stats",
"is_pure": true,
"outputs": [
{ "name": "Percent", "type": "float" }
]
},
{
"name": "Heal",
"category": "Stats",
"blueprint_callable": true,
"access_specifier": "Public",
"inputs": [
{ "name": "HealAmount", "type": "float" }
]
}
]
}
Function Fields¶
| Field | Type | Required | Description |
|---|---|---|---|
name |
string | Yes | Function name |
category |
string | No | Category in Blueprint |
tooltip |
string | No | Description |
is_event |
bool | No | Is this an event (BeginPlay, Tick, etc.) |
is_pure |
bool | No | Pure function (no side effects) |
blueprint_callable |
bool | No | Callable from Blueprint (default: true) |
access_specifier |
string | No | Public, Protected, Private |
stub_implementation |
string | No | Implementation hint |
inputs |
array | No | Input parameters |
outputs |
array | No | Output parameters |
Interfaces¶
Implement Blueprint interfaces.
{
"interfaces": [
{
"path": "/Script/Engine.GenericTeamAgentInterface"
},
{
"path": "/Game/Interfaces/BPI_Interactable",
"functions_to_implement": ["OnInteract", "GetInteractionText"]
}
]
}
Event Graph¶
Define starter event graph nodes.
{
"event_graph": [
{
"event": "BeginPlay",
"nodes": ["InitializeHealth", "SetupMovement"],
"comment": "Character initialization"
},
{
"event": "SetupPlayerInputComponent",
"nodes": ["BindMoveActions", "BindJumpAction"],
"comment": "Input binding"
}
]
}
Widget Blueprints¶
For WidgetBlueprint recipes, use root_widget to define the widget hierarchy.
{
"asset_type": "WidgetBlueprint",
"expected_path": "/Game/UI/WBP_{{HUDName}}",
"root_widget": {
"name": "RootCanvas",
"class": "CanvasPanel",
"children": [
{
"name": "HealthContainer",
"class": "HorizontalBox",
"children": [
{
"name": "HealthBar",
"class": "ProgressBar",
"is_variable": true,
"style": {
"min_width": 200,
"min_height": 20,
"background_color": [0.1, 0.1, 0.1, 0.85]
}
},
{
"name": "HealthText",
"class": "TextBlock",
"default_text": "100/100",
"is_variable": true
}
]
}
]
}
}
Widget Classes¶
Common widget classes:
- CanvasPanel - Root canvas
- VerticalBox - Vertical layout
- HorizontalBox - Horizontal layout
- Border - Background/border container
- Button - Clickable button
- TextBlock - Text display
- Image - Image display
- ProgressBar - Progress indicator
- Spacer - Layout spacer
Widget Style¶
{
"style": {
"background_color": [0.1, 0.1, 0.1, 0.85],
"hover_color": [0.18, 0.18, 0.18, 0.9],
"pressed_color": [0.08, 0.08, 0.08, 0.9],
"text_color": [1, 1, 1, 1],
"font_size": 16,
"text_justification": "Center",
"padding": 4,
"min_width": 100,
"min_height": 40
}
}
Recipe Inheritance¶
Extend existing recipes with extends_recipe.
{
"schema_version": 3,
"id": "fps_character",
"display_name": "FPS Character",
"extends_recipe": "character_blueprint",
"parameters": [
{
"name": "HasWeapon",
"type": "bool",
"default": "true",
"group": "Combat"
}
],
"components": [
{
"class": "SkeletalMeshComponent",
"name": "ArmsMesh",
"attach_to": "FollowCamera"
}
]
}
Inherited recipes: - Merge parameters (child overrides parent) - Merge components (child adds to parent) - Merge variables and functions - Override metadata
Dependencies¶
Declare required plugins or classes.
{
"dependencies": [
{
"type": "plugin",
"name": "EnhancedInput",
"optional": false
},
{
"type": "class",
"name": "/Script/AIModule.AIController"
},
{
"type": "recipe",
"name": "blackboard_data",
"optional": true
}
]
}
Conditions¶
Platform or configuration-based inclusion.
{
"conditions": [
{
"type": "plugin",
"key": "EnhancedInput",
"value": "enabled"
},
{
"type": "platform",
"key": "Windows",
"value": "true"
}
]
}
Complete Example¶
Here's a complete character recipe demonstrating all Schema v3 features:
{
"schema_version": 3,
"id": "my_character",
"display_name": "My Custom Character",
"description": "A fully customizable character blueprint",
"author": "Your Name",
"version": "1.0.0",
"category": "Gameplay",
"tags": ["character", "player", "custom"],
"parameters": [
{
"name": "Name",
"type": "string",
"default": "Player",
"required": true,
"group": "Identity"
},
{
"name": "Health",
"type": "float",
"default": "100",
"min": 1,
"max": 10000,
"group": "Stats"
},
{
"name": "HasCamera",
"type": "bool",
"default": "true",
"group": "Features"
}
],
"presets": [
{
"name": "Default_Player",
"description": "Standard player",
"values": {
"Name": "Player",
"Health": "100",
"HasCamera": "true"
}
}
],
"asset_type": "Blueprint",
"asset_subtype": "Character",
"expected_path": "/Game/Characters/BP_{{Name}}",
"components": [
{
"class": "CapsuleComponent",
"name": "Capsule",
"is_root": true
},
{
"class": "CameraComponent",
"name": "Camera",
"attach_to": "Capsule",
"condition": "{{HasCamera}} == true"
}
],
"variables": [
{
"name": "MaxHealth",
"type": "float",
"default": "{{Health}}",
"exposed": true
}
],
"functions": [
{
"name": "TakeDamage",
"is_event": true,
"inputs": [
{ "name": "Amount", "type": "float" }
]
}
]
}
Best Practices¶
- Use Descriptive IDs:
fps_characternotchar1 - Group Parameters: Use the
groupfield for UI organization - Provide Presets: Give users quick-start options
- Document Everything: Use
descriptionandtooltipfields - Test Conditions: Verify conditional components work correctly
- Version Your Recipes: Update
versionwhen making changes - Use Tags: Make recipes discoverable with relevant tags
Validation¶
Use Studio Mode to validate recipes before use: - Schema version check - Required field validation - Parameter type checking - Component class verification - Condition syntax validation
Schema v3 Documentation - Asset Scaffolding Plugin © 2026 BrahmaForge. All rights reserved.