Unreal Bridge
TornLux/UnrealBridge
Execute Python scripts inside a running Unreal Engine 5.3+ editor via TCP bridge.
Creates Unreal Engine foliage types and scatters or places foliage instances on landscapes and meshes through FoliageService, with seeded, reproducible layouts.
$ npx skills add kevinpbuckley/VibeUE --skill foliage -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install kevinpbuckley/VibeUE foliage --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .claude/skills && cp -r skills-src/Content/Skills/foliage .claude/skills/foliage && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "foliage" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/foliage into .claude/skills/foliage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "foliage", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/foliageType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add kevinpbuckley/VibeUE --skill foliage -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install kevinpbuckley/VibeUE foliage --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .agents/skills && cp -r skills-src/Content/Skills/foliage .agents/skills/foliage && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "foliage" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/foliage into .agents/skills/foliage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "foliage", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add kevinpbuckley/VibeUE --skill foliage -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install kevinpbuckley/VibeUE foliage --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/Content/Skills/foliage .cursor/skills/foliage && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "foliage" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/foliage into .cursor/skills/foliage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "foliage", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/kevinpbuckley/VibeUE.git --path Content/Skills/foliage--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add kevinpbuckley/VibeUE --skill foliage -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install kevinpbuckley/VibeUE foliage --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/Content/Skills/foliage .gemini/skills/foliage && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "foliage" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/foliage into .gemini/skills/foliage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "foliage", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install kevinpbuckley/VibeUE foliageInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add kevinpbuckley/VibeUE --skill foliage -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .github/skills && cp -r skills-src/Content/Skills/foliage .github/skills/foliage && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "foliage" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/foliage into .github/skills/foliage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "foliage", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add kevinpbuckley/VibeUE --skill foliage -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install kevinpbuckley/VibeUE foliage --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/kevinpbuckley/VibeUE.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/Content/Skills/foliage .opencode/skills/foliage && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "foliage" agent skill from https://github.com/kevinpbuckley/VibeUE/tree/master/Content/Skills/foliage into .opencode/skills/foliage/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "foliage", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
foliageCreates Unreal Engine foliage types and scatters or places foliage instances on landscapes and meshes through FoliageService, with seeded, reproducible layouts.
This skill drives Unreal Engine foliage from the agent: creating foliage types from static meshes, adding or scattering trees, grass, bushes and rocks across landscapes and meshes, and querying or removing instances on a surface. Placement methods need a valid static mesh or foliage type asset path, and the agent is told to list the available methods with discover_python_class on unreal.FoliageService.
Several rules shape the work. Scatter calls trace downward to find the ground, so instances outside the landscape bounds are rejected and counted in instances_rejected. Passing a mesh creates a temporary foliage type, so create_foliage_type comes first when you want a reusable one with custom properties. A seed makes layouts reproducible, with seed 0 giving random results, and scatter_foliage_on_layer needs a named landscape that has a painted layer.
World Partition levels get extra handling. Foliage lives in one actor per grid cell, the foliage type must be an asset, and a cell whose foliage actor exists but is not loaded makes the call fail without changing anything, so you load that region first. A scatter_foliage script ships with the skill.
3 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit dc051be. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/, which the agent can run.
From the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Unreal Foliage Placement loads about 3.2k tokens when it runs. Until then it costs about 71 tokens; SKILL.md has 913 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.
The full file from kevinpbuckley/VibeUE at commit dc051be, republished under its MIT licence (© kevinpbuckley). 913 words, ~3,163 tokens.
.claude/skills/foliage/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.🧠 Brains complement: IF an
unreal-engine-skills-managertool (external MCP) exists in this session, call it with{action: "load", skill: "landscape-and-foliage"}for UE domain knowledge on this topic — correct APIs, architecture, best practices — and treat it as the rubric for any review / "best practices" question. If no such tool is available (e.g. running under Claude Code or Codex without that MCP), skip this line entirely and proceed with this skill alone — do NOT attempt the call.
All placement methods require a valid UStaticMesh or UFoliageType asset path. Use discover_python_class('unreal.FoliageService') to see available methods.
All scatter/add methods trace downward to find the ground surface. If no surface is hit (e.g., position is outside the landscape bounds), that instance is rejected. Check instances_rejected in the result.
When you pass a UStaticMesh path, the service auto-creates a transient UFoliageType internally. For persistent, reusable foliage types with custom properties, use create_foliage_type() first.
On a World Partition level the engine keeps foliage in one foliage actor per grid cell, and the service places,
lists, counts and removes through those cell actors. There the foliage type must be an asset: a mesh path uses
<Mesh>_FoliageType next to the mesh, or the one other foliage type asset for that mesh (several: the call asks for
a foliage type path), and creates <Mesh>_FoliageType when there is none, saved only when the call places
something and refused while PIE runs. A call that would touch a cell whose foliage actor exists but is not loaded fails and changes nothing:
load that region first. Placement only counts the cell actor of the editor's current data layer / content bundle
context, as the engine does: an unloaded cell actor of another data layer does not block placing into that cell. Builds that do this define the read-only console variable vibeue.Foliage.WorldPartitionCells.
Use the seed parameter to get reproducible scatter patterns. Same seed + same parameters = same layout. Use seed=0 for random.
scatter_foliage_on_layer() requires:
If you get instances_added=0 with instances_rejected ≈ 4× requested, every candidate failed the surface trace or the weight check. Before blaming the threshold, check geometry:
unreal.LandscapeService.get_layer_weights_at_location(label, x, y).| WRONG | CORRECT |
|---|---|
result.success | result.success (Python auto-converts bSuccess) |
result.count | result.instances_added |
result.instances_placed | result.instances_added (NOT instances_placed) |
ft.asset_path on VibeUEFoliageTypeInfo | ft.foliage_type_path (NOT asset_path) |
scatter_foliage(..., landscape="X") | scatter_foliage(..., landscape_name_or_label="X") |
clear_all_foliage() to clear one landscape | clear_all_foliage() removes ALL foliage from the ENTIRE level — use remove_foliage_in_radius() for targeted removal |
| Manually scattering foliage on a cloned landscape | If source uses LandscapeGrassType (procedural), just copy paint layers — foliage auto-generates. Check list_foliage_types(): if 0, foliage is procedural. |
Forgetting to check instances_rejected | Always check — tells you how many failed surface trace or layer filter |
Expecting get_instance_count() == -1 after removing all instances | -1 means the type was never in the level. Once registered, the count is 0 after removal — the foliage type entry persists |
Expecting list_foliage_types() to shrink after clear_all_foliage() | Clearing removes instances, not type registrations — 0-instance entries remain listed. Filter on ft.instance_count > 0 |
set_foliage_type_property(path, "CullDistance", "30000") | Whole structs need UE import text: "(Min=0,Max=30000)". Simpler: set the member via a dotted path — set_foliage_type_property(path, "CullDistance.Max", "30000") |
| Scattering "around the landscape at (0,0)" centered on (0,0) | Landscapes are corner-anchored: created at (0,0) the terrain spans +X/+Y only. Center the scatter on the landscape's actual center (location + (resolution-1)*scale/2) or most candidates miss the surface |
AssetDiscoveryService.list_assets(path) for cleanup | AssetDiscoveryService.list_assets_in_path(path, asset_type) — or the manage_asset tool with action='list' |
| Property | Type | Description |
|---|---|---|
success | bool | Whether operation succeeded |
instances_added | int | Number of instances actually placed |
instances_requested | int | Number of instances requested |
instances_rejected | int | Number rejected (no surface, slope, layer weight) |
error_message | str | Error details if failed |
| Property | Type | Description |
|---|---|---|
success | bool | Whether operation succeeded |
instances_removed | int | Number of instances removed |
error_message | str | Error details if failed |
| Property | Type | Description |
|---|---|---|
foliage_type_name | str | Name of the foliage type |
mesh_path | str | Path to the static mesh |
instance_count | int | Number of instances in level |
foliage_type_path | str | Asset path of the foliage type |
| Property | Type | Description |
|---|---|---|
success | bool | Whether creation succeeded |
asset_path | str | Path to the created foliage type asset |
error_message | str | Error details if failed |
| Property | Type | Description |
|---|---|---|
success | bool | Whether query succeeded |
total_instances | int | Total matching instances (may exceed returned list) |
instances | Array | List of FFoliageInstanceInfo |
error_message | str | Error details if failed |
| Property | Type | Description |
|---|---|---|
location | Vector | World location |
rotation | Rotator | World rotation |
scale | Vector | Scale (DrawScale3D) |
instance_index | int | Index in the foliage info array |
import unreal
result = unreal.FoliageService.scatter_foliage(
"/Game/Meshes/SM_Tree_01",
0.0, 0.0, # center X, Y
5000.0, # radius
200, # count
min_scale=0.8,
max_scale=1.2,
seed=42
)
if result.success:
print(f"Placed {result.instances_added}/{result.instances_requested}")
print(f"Rejected: {result.instances_rejected}")import unreal
# Step 1: Create a reusable foliage type with custom properties
ft = unreal.FoliageService.create_foliage_type(
mesh_path="/Game/Meshes/SM_Pine_Tree",
save_path="/Game/Foliage",
asset_name="FT_PineTree",
min_scale=0.7,
max_scale=1.3,
align_to_normal=True,
align_to_normal_max_angle=30.0,
ground_slope_max_angle=40.0,
cull_distance_max=25000.0
)
if ft.success:
print(f"Created: {ft.asset_path}")
# Step 2: Scatter using the foliage type
result = unreal.FoliageService.scatter_foliage(
ft.asset_path, 0.0, 0.0, 8000.0, 500, seed=42)import unreal
# Place grass clumps only where the "Grass" paint layer is dominant
result = unreal.FoliageService.scatter_foliage_on_layer(
"/Game/Meshes/SM_Grass_Clump",
"MyTerrain", # landscape name
"Grass", # layer name
1000, # count
min_scale=0.5,
max_scale=1.5,
layer_weight_threshold=0.6,
seed=99
)
print(f"Placed {result.instances_added}, rejected {result.instances_rejected}")import unreal
result = unreal.FoliageService.scatter_foliage_rect(
"/Game/Meshes/SM_Bush",
-5000.0, -5000.0, # min X, Y
5000.0, 5000.0, # max X, Y
300, # count
min_scale=0.5,
max_scale=1.0,
seed=7
)import unreal
locations = [
unreal.Vector(0, 0, 0),
unreal.Vector(500, 500, 0),
unreal.Vector(-500, 500, 0),
unreal.Vector(500, -500, 0),
unreal.Vector(-500, -500, 0),
]
result = unreal.FoliageService.add_foliage_instances(
"/Game/Meshes/SM_Tree_01",
locations,
min_scale=1.0,
max_scale=1.0,
align_to_normal=True,
random_yaw=True,
trace_to_surface=True
)import unreal
configs = [
("/Game/Meshes/SM_Oak", 300, 0.8, 1.2),
("/Game/Meshes/SM_Pine", 200, 0.7, 1.3),
("/Game/Meshes/SM_Birch", 100, 0.6, 1.0),
("/Game/Meshes/SM_Bush", 400, 0.4, 0.8),
]
for mesh, count, min_s, max_s in configs:
result = unreal.FoliageService.scatter_foliage(
mesh, 0.0, 0.0, 10000.0, count,
min_scale=min_s, max_scale=max_s, seed=42)
print(f"{mesh}: {result.instances_added} placed")import unreal
# List all foliage types in the level
types = unreal.FoliageService.list_foliage_types()
for ft in types:
print(f"{ft.foliage_type_name}: {ft.instance_count} instances ({ft.mesh_path})")
# Get count for a specific type
count = unreal.FoliageService.get_instance_count("/Game/Meshes/SM_Tree_01")
print(f"Tree count: {count}")
# Query instances in a region
query = unreal.FoliageService.get_foliage_in_radius(
"/Game/Meshes/SM_Tree_01", 0.0, 0.0, 2000.0, max_results=50)
for inst in query.instances:
print(f" [{inst.instance_index}] at {inst.location}")import unreal
# Remove trees from a building site
result = unreal.FoliageService.remove_foliage_in_radius(
"/Game/Meshes/SM_Tree_01", 2000.0, 3000.0, 500.0)
print(f"Removed {result.instances_removed}")
# Remove ALL instances of one type
result = unreal.FoliageService.remove_all_foliage_of_type("/Game/Meshes/SM_Bush")
# Nuclear option: remove everything
result = unreal.FoliageService.clear_all_foliage()
print(f"Cleared {result.instances_removed} total instances")import unreal
# Does the mesh/foliage type exist as an asset?
if unreal.FoliageService.foliage_type_exists("/Game/Meshes/SM_Tree_01"):
print("Asset exists")
# Are there any instances of this type in the level?
if unreal.FoliageService.has_foliage_instances("/Game/Meshes/SM_Tree_01"):
print("Instances exist in level")execute_python_code)scripts/scatter_foliage.txt — create a foliage type from a mesh and scatter instances onto the surface.© kevinpbuckley, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file (scripts) in Content/Skills/foliage of kevinpbuckley/VibeUE.
Open the folder on GitHubat commit dc051be
Unreal Foliage Placement next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Unreal Foliage Placement this skillkevinpbuckley/VibeUE | 730 | — | ~3.2k | Automated safety check: Pass | MIT | |
| Unreal BridgeTornLux/UnrealBridge | 306 | — | ~8.4k | Automated safety check: Notes | MIT | |
| Scenario Unreal Cinematicsscenario-labs/skills | 946 | — | ~5.1k | Automated safety check: Pass | MIT | |
| Scenario Unreal Pipeline Automationscenario-labs/skills | 946 | — | ~5k | Automated safety check: Pass | MIT | |
| Scenario Unreal Expertscenario-labs/skills | 946 | — | ~6.4k | Automated safety check: Pass | MIT | |
| Scenario Unreal Gameplayscenario-labs/skills | 946 | — | ~5.2k | Automated safety check: Pass | MIT |
TornLux/UnrealBridge
Execute Python scripts inside a running Unreal Engine 5.3+ editor via TCP bridge.
scenario-labs/skills
A skill your agent uses when making a trailer, cutscene, cinematic or short film in Unreal Engine 5.8 with Sequencer: shot lists, master and shot sequences, cameras, lenses, depth of field, camera…
scenario-labs/skills
A skill your agent uses when importing FBX, USD, OBJ or glTF from Maya, ZBrush or Blender into Unreal Engine 5.8 in bulk or reimporting changed files, writing Editor Python tools, Interchange…
scenario-labs/skills
A skill your agent uses when an agent drives Unreal Engine 5.8 on a Mac for any task: Editor Python (the unreal module), headless UnrealEditor-Cmd -run=pythonscript jobs, Epic's Unreal MCP server…
scenario-labs/skills
A skill your agent uses when building or debugging UE5 gameplay: a character with double jump or dash, abilities with cooldowns, enemy AI that patrols, chases and attacks, a health bar or HUD…
0x0funky/agent-sprite-forge
Plans and builds 2D game maps and scenes, from tilemaps and parallax backgrounds to HD-2D plates, with collision checks, a playable HTML preview and Tiled, Godot or LDtk export.
kevinpbuckley/VibeUE
Previews, validates and bakes bone-rotation edits on Unreal Engine AnimSequences, enforcing a coordinate space and a constraint-checked preview-validate-bake loop.
kevinpbuckley/VibeUE
Creates and edits Unreal Engine Animation Montages through AnimMontageService: sections, slots, segments, branching points, notifies and blend settings.
kevinpbuckley/VibeUE
Creates and edits AnimSequence keyframes and bone tracks in Unreal Engine through AnimSequenceService, following an inspect, preview, validate and bake workflow with correct bone-space handling.
kevinpbuckley/VibeUE
Imports files into Unreal Engine, exports textures, reads the Content Browser selection and checks open assets via VibeUE, plus mesh reimport material fixes.
kevinpbuckley/VibeUE
Changes Unreal Engine console variables, scalability levels and raw INI values through VibeUE's Python API, now that registered settings moved to the engine's own toolset.
kevinpbuckley/VibeUE
Creates and wires Unreal Engine Enhanced Input assets through VibeUE's InputService: Input Actions, Mapping Contexts, key bindings, triggers and modifiers.
Works with
Categories
Creates Unreal Engine foliage types and scatters or places foliage instances on landscapes and meshes through FoliageService, with seeded, reproducible layouts. This skill drives Unreal Engine foliage from the agent: creating foliage types from static meshes, adding or scattering trees, grass, bushes and rocks across landscapes and meshes, and querying or removing instances on a surface.FoliageService.
Unreal Foliage Placement fits situations like: adding trees, grass, bushes or rocks as foliage on a landscape; creating a reusable foliage type from a static mesh; scattering foliage reproducibly or onto a painted landscape layer; querying or removing foliage instances on a surface.
Run `npx skills add kevinpbuckley/VibeUE --skill foliage -a claude-code`. Or copy the skill folder (Content/Skills/foliage in kevinpbuckley/VibeUE) into .claude/skills/foliage in your project. Claude Code loads it when a task matches its description.
Run `npx skills add kevinpbuckley/VibeUE --skill foliage -a codex`. Or copy the skill folder (Content/Skills/foliage in kevinpbuckley/VibeUE) into .agents/skills/foliage in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add kevinpbuckley/VibeUE --skill foliage -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/foliage, .gemini/skills/foliage, .github/skills/foliage and .opencode/skills/foliage in your project.
SKILL.md names no scripts, command-line tools or credentials: Unreal Foliage Placement is instructions for the agent only. Our summary lists: Unreal Engine with the VibeUE tooling available to the agent; A static mesh or foliage type asset path.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Unreal Foliage Placement is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Unreal Foliage Placement: Unreal Bridge (TornLux/UnrealBridge, 306 stars), Scenario Unreal Cinematics (scenario-labs/skills, 946 stars), Scenario Unreal Pipeline Automation (scenario-labs/skills, 946 stars) and Scenario Unreal Expert (scenario-labs/skills, 946 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
kevinpbuckley (a GitHub user) maintains it in kevinpbuckley/VibeUE, which has 730 GitHub stars. The repository holds 39 skills in this directory. The repository was last updated on October 7, 2026.
Source: kevinpbuckley/VibeUE on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.