Наші ігри
Кожна наша гра — це експеримент і виклик. Ми ділимось із вами найкращим, що створили.
Процедурна генерація рослин для Unreal Engine 5.6.1/5.7.1
Ця документація не є гарантовано актуальною через можливі оновлення плагіна. Unreal Engine та його API регулярно змінюються, що може вплинути на структуру файлів, функції та поведінку плагіна. Перед внесенням змін перевіряйте актуальність інформації. Документація актуальна виключно для версії 1.2 станом на 01.01.2026. Будь-яке втручання в код плагіна може призвести до нестабільної роботи та втрати підтримки.
Tryzillya TreeLab — це процедурний генератор дерев та рослин для Unreal Engine, який дозволяє створювати унікальні рослинні моделі за лічені секунди. Плагін інтегрується в редактор UE та надає зручний UI для керування параметрами генерації.
| Параметр | Мінімум | Рекомендовано |
|---|---|---|
| Unreal Engine | 5.6.1 | 5.7.1+ |
| OS | Windows 10/11 x64 | Windows 11 |
| RAM | 8 GB | 16+ GB |
| GPU | DirectX 12 compatible | RTX 3060+ |
| Dependencies | ProceduralMeshComponent (включено) | - |
| Build Configuration | Development Editor | Shipping |
Core, CoreUObject, Engine, InputCore, UMGSlate, SlateCore, ToolMenusUnrealEd, LevelEditorTryzillya_TreeLab_v1.2.zip# Шлях для встановлення: [YourProject]/Plugins/Tryzillya_TreeLab/
Tryzillya_TreeLab/
├───Binaries/Win64/ # Скомпільовані DLL (UnrealEditor-*.dll)
├───Config/ # Конфігураційні файли (не використовується)
├───Content/ # Ассети плагіну
│ └───Content/ # Додатковий рівень вкладеності
│ ├───Mat/ # Матеріали (M_Birch, M_Pine, M_Oak)
│ ├───PresentLevel/ # Демонстраційний рівень
│ ├───PresentsTrees/ # Збережені дерева (Static Meshes)
│ │ ├───Birch/
│ │ ├───Pine/
│ │ └───Oak/
│ └───Tex/ # Текстури (PBR maps)
├───Intermediate/Build/ # Файли компіляції (генерується автоматично)
├───Resources/ # Іконки плагіну (TreeLab_40.png, TreeLab_20.png)
└───Source/Tryzillya_TreeLab/ # Вихідний код
├───Private/ # Реалізація (.cpp)
└───Public/ # Заголовки (.h)
/Source/Tryzillya_TreeLab/Public/ (Заголовки)Роль: Центральний модуль генерації геометрії
USTRUCT(BlueprintType) FTreeSettings
Призначення: Структура, що містить 100+ параметрів генерації. Поділяється на категорії:
Клас FTreeGenerator:
GenerateTree() — головний метод, що створює AActor з повною ієрархією компонентівSaveTreeAsStaticMesh() — конвертація процедурної геометрії в UStaticMesh з LODBuildStaticMeshFromProcedural() — копіювання вершин, нормалей, UV з UProceduralMeshComponent у FMeshDescriptionРоль: UI панель керування
class STreeLabWidget : public SCompoundWidget
Призначення: Slate UI для візуального редагування FTreeSettings
Ключові члени:
CurrentSettings — поточні параметри генераціїLastGeneratedActor — посилання на останнє згенероване деревоPresetBirch/Pine/Oak — жорстко закодовані пресетиMaterialBirch/Oak/Pine — посилання на матеріалиМетоди UI:
BuildSection() — створює розкриваючийся блок (SExpandableArea)BuildTrunkSection() — UI для стовбураBuildBranchesSection() — UI для гілокBuildLeavesSection() — UI для листяBuildLODSection() — UI для рівнів деталізаціїРоль: Головний модуль плагіну
class FTryzillya_TreeLabModule : public IModuleInterface
Призначення: Реєстрація плагіну в системі модулів UE
Ключові методи:
StartupModule() — викликається при запуску редактора
ShutdownModule() — очищення ресурсівOnSpawnPluginTab() — створення екземпляру STreeLabWidgetРоль: Команда відкриття вікна
class FTryzillya_TreeLabCommands : public TCommands<FTryzillya_TreeLabCommands>
Призначення: UI_COMMAND для кнопки на панелі інструментів
Команда: OpenPluginWindow — прив'язана до FInputChord() (Ctrl+Shift+T можна додати)
Роль: Завантаження іконок
class FTryzillya_TreeLabStyle
Призначення: Завантажує PNG-іконки з /Resources/ та реєструє їх в SlateStyle
/Source/Tryzillya_TreeLab/Private/ (Реалізація)Роль: Ядро алгоритму генерації
Sides+1 вершин (UV seam fix)U = i / Sides, V = t — без шва завдяки додатковій вершиніCleanupPreviousTree)gravityPull = -Settings.Gravity * t² * 5.0f)CreateCylinderMeshangle та висота heightTUProceduralMeshComponentRand() < SubBranchProbability, генерує аж до MaxSubBranchesPerBranchGenerateLeavesForBranchLODCount > 0Generated_Tree_{Seed}SetNumSourceModels(LODCount) + ReductionSettings.PercentTriangles
CreateBodySetup() + CTF_UseSimpleAsComplex + FKSphylElem (капсула)
Package::MarkPackageDirty() + AssetRegistry::AssetCreated
UProceduralMeshComponentTriangleSkipFactor)Роль: 1000+ рядків UI-коду
Створює вертикальний лейаут з 5 секціями:
http://tryzillyast.zzz.com.ua GEditor->GetWorldContexts() Editor WorldFTreeGenerator::GenerateTree()GEditor->SelectActor)DebugLogComponentMaterials() — логує всі матеріали компонентів
FSaveAssetDialogConfig)/Game/Generated_Trees/FTreeGenerator::SaveTreeAsStaticMesh()/Tryzillya_TreeLab/Materials/ (плагін)/Game/Materials/ (проект)LoadObject з явних шляхівUE_LOG з емодзі (🔴⚠️✅🎨)UMeshComponentsSetMaterial(i, Material) для кожного слотаLOCTEXT/Resources/, реєстрація в FSlateStyleRegistryКритичні залежності:
Public: "ProceduralMeshComponent", "MeshDescription", "StaticMeshDescription" Private (Editor): "UnrealEd", "AssetTools", "ContentBrowser", "PropertyEditor"
Примітка: Плагін типу Editor, тому не працює в Runtime/Build без перекомпіляції.
{
"VersionName": "1.2",
"EngineVersion": "5.7.1",
"Type": "Editor",
"CanContainContent": true
}
Важливо: "Type": "Editor" — плагін активний лише в редакторі.
Для Runtime-підтримки потрібно змінити на "Type": "Runtime" та додати відповідні модулі.
SubBranchProbability
ScreenSize = Pow(0.5, LODIndex)
Actor->Destroy())
TrunkHeight = 1600.f, TrunkRadius = 20.f Taper = 0.08f, TaperCurve = 28.1f BendAmount = 100.0f, Gravity = 8.0f BranchCount = 12, BranchLength = 420.f BranchCurl = 8.0f, BranchSpread = 45° LeafCount = 39, LeafSize = 95.f LeafDensity = 1.2f, LeafSizeVariation = 0.3f
Логіка: Витончений стовбур, багато дрібного листя, помірна кривизна. Підходить для лісових сцен.
TrunkHeight = 1700.f, TrunkRadius = 40.f Taper = 0.06f, TaperCurve = 0.03f BendAmount = 35.0f, Gravity = 2.0f BranchCount = 18, BranchLength = 360.f BranchCurl = 12.0f, BranchSpread = 60° LeafCount = 20, LeafSize = 100.f LeafDensity = 1.0f, LeafRandomTilt = 0.6f
Логіка: Товстий стовбур, багато коротких гілок, мала гравітація (хвойні дерева стоять прямо). Листя як хвоїнки.
TrunkHeight = 1500.f, TrunkRadius = 45.f Taper = 0.12f, TaperCurve = 0.15f BendAmount = 10.0f, Gravity = 9.0f BranchCount = 7, BranchLength = 820.f BranchTaper = 0.1f, BranchSpread = 80° LeafCount = 27, LeafSize = 240.f LeafRandomTilt = 100.0f
Логіка: Масивний стовбур, товсті довгі гілки, велике листя, сильна гравітація (важкі гілки провисають). Підходить для паркових сцен.
#include "TreeGenerator.h"
FTreeSettings Settings;
Settings.Seed = 12345;
Settings.Type = TEXT("CustomTree");
Settings.TrunkHeight = 2000.f;
Settings.BranchCount = 15;
AActor* Tree = FTreeGenerator::GenerateTree(
GEditor->GetEditorWorldContext().World(),
FTransform(FVector(0,0,0)),
Settings
);
UStaticMesh* Mesh = FTreeGenerator::SaveTreeAsStaticMesh(
Tree,
TEXT("/Game/MyTrees/CustomTree_StaticMesh"),
Settings
);
// Додайте в STreeLabWidget::InitPresetTemplates()
FTreeSettings PresetCustom;
PresetCustom.Preset = 3; // Новий ID
PresetCustom.Type = TEXT("Palm");
PresetCustom.TrunkHeight = 3000.f;
PresetCustom.BranchCount = 5;
// ...
TreeLabWidget.h додайте FTreeSettings PresetYourName;TreeLabWidget.cpp:
InitPresetTemplates() ініціалізуйте параметриPopulatePresetOptions() додайте PresetOptions.Add(MakeShared<FString>(TEXT("YourName")));ApplyPreset() додайте else if (Name == TEXT("YourName")) ApplyPreset(3);M_YourName та M_YourName_Leaf в /Content/Mat/BendAmount та NoiseScale в TreeGenerator.cpp
branchDir в GenerateTree() (додайте синусоїди для хвилястих гілок)
GenerateLeavesForBranch()
"Type": "Editor" на "Type": "Runtime" в .upluginPrivateDependencyModuleNames з if (Target.bBuildEditor) до PublicRTTI та PhysicsCore в PublicDependencyModuleNamesПричина: Некоректний шлях або права доступу
Рішення: Перевірте SaveAssetPath, переконайтесь що /Game/ існує
Причина: Матеріали не знайдені в /Tryzillya_TreeLab/Materials/
Рішення:
Tryzillya_TreeLab папціПричина: Занадто високі значення (LeafCount > 100, BranchCount > 50)
Рішення:
Зменшіть LODReductionPercent до 50% та LODDistanceStep до 1000
Причина: nullptr World або недостатня пам'ять
Рішення: Переконайтесь, що відкритий рівень в редакторі (EWorldType::Editor)
Причина: BodySetup не створюється для LOD0
Рішення:
В SaveTreeAsStaticMesh() додайте StaticMesh->GetBodySetup()->InvalidatePhysicsData();
[BUG] TreeLab v1.2[FEATURE REQUEST]Кожна наша гра — це експеримент і виклик. Ми ділимось із вами найкращим, що створили.