Troubleshooting
Common issues and their solutions when working with Simple Skill Forge.
Generation Issues
"Generation seems stuck" / Nothing happens after clicking Generate
Simple Skill Forge uses two-phase generation. Phase 1 generates C# scripts, which triggers a Unity domain reload (recompilation). Phase 2 runs automatically after the reload to create the ScriptableObject asset. This process can take 5–30 seconds depending on your project size.
[InitializeOnLoad]."The generated .asset file is empty"
This typically means Phase 2 failed. Check the Console for errors. Common causes:
- A compile error in your project prevented the domain reload from completing.
- The
SessionStatekeys were lost (rare, usually caused by a Unity crash during generation).
Fix: Delete the generated Scripts/ folder, fix any compile errors, and re-run the wizard.
"Duplicate code" validation error
Every entry code must be unique within a database and must be a valid C# identifier (letters, digits,
underscores; cannot start with a digit). Use SCREAMING_SNAKE_CASE for consistency:
FIREBALL, DARK_SLASH, HEAL_OVER_TIME.
"Output path does not exist"
The output folder must exist before generation. Create it manually in your Assets folder, or use the Browse button in Step 4 to select an existing folder.
Editor Issues
The generated custom inspector shows "Element 0, Element 1" instead of property names
This can happen if the database was generated with an older version of the editor generator. Re-run the wizard to regenerate the editor script.
Cross-forge sections (SIF/SEF/SQF) appear in the inspector even without companion packages
The generated editor uses Type.GetType() bridge checks to gate cross-forge sections.
If sections appear without the companion package installed, regenerate the database — the editor
generator has been updated to include proper bridge detection.
Property definitions changed but entries are out of sync
When you add/remove/reorder property definitions in Step 2, the wizard automatically syncs all entries. However, if you modify the generated database asset manually, the sync won't apply. Use the wizard for all structural changes.
Runtime Issues
SimpleSkillTreeTracker throws "Tree not initialized"
Call InitializeTree(treeCode) for each tree before attempting to unlock nodes or query state.
The tracker does not auto-initialize — this is intentional so you can control which trees are active.
SimpleSkillBarManager set bonuses not activating
Set bonuses require the correct number of distinct skills equipped. Equipping the same skill
in multiple slots does not count multiple times. Check GetEquippedCount(setCode) to verify.
SimpleSkillComboTracker drops combos unexpectedly
Combos have timing windows defined by maxDelay on each step. If you cast skills too slowly,
the combo will drop. Set maxDelay to 0 to disable timing for a step. Also ensure you're
passing consistent Time.time values to OnSkillUsed().
Prerequisite checks always return false
SimpleSkillHelper.CheckPrerequisite() requires a Func<string, float> value
provider that returns the current value for any prerequisite target code. Common mistake: the provider
returns 0 for all codes because it doesn't check the right dictionary.
Integration Issues
SAF/SIF/SEF/SQF bridge not detecting installed package
Bridge detection uses two paths:
- UPM path:
versionDefinesin.asmdeffiles detect packages bycom.livingfailure.*package name and set scripting defines automatically. - Non-UPM path:
[InitializeOnLoad]detector classes useType.GetType()to probe for companion types and set scripting defines manually.
If detection fails, check that the companion package's .asmdef files are present and correctly
named. For Asset Store imports, ensure the folder structure matches the expected layout.
Character class restrictions not showing in the wizard
Class names come from SAF Character Template assets assigned in Step 1. If you don't have SAF installed or haven't assigned any character template assets, the class restriction section will be empty. You can still manually type class names in the builder.
Cross-forge reference dropdowns are empty
Cross-forge dropdowns in Step 3 are populated from linked databases assigned in Step 1. If you haven't assigned any SIF/SEF/SQF databases, the dropdowns will only show manual code entry fields.
Demo Scene Issues
ARPG Demo: "Assign all databases to SkillDemo component"
After running Window > Living Failure > Simple Skill Forge > Generate Skill Demo,
you need to manually assign your generated database ScriptableObjects to the SkillDemo component in the
Inspector. Drag your Skill, Tree, Set, and Combo database assets into the corresponding array fields.
Soulslike Demo: Shows upsell panel instead of main UI
The Soulslike demo requires all 4 companion packages (SAF, SIF, SEF, SQF) to be installed. If any are missing, it shows an upsell panel explaining what's needed. Install the missing packages and re-enter Play mode.
Soulslike Demo: "forceShowUpsell" is checked
The SoulslikeSkillDemo component has a debug toggle forceShowUpsell. Uncheck it in the
Inspector to show the main UI even when all bridges are detected.
Demo scroll views don't scroll
Ensure the EventSystem exists in the scene. The generator creates one automatically, but if you deleted
it, scrolling won't work. Add GameObject > UI > Event System.
FAQ
Can I have multiple skill databases in one project?
Yes. Run the wizard multiple times with different database names. Each run generates its own enum, database
class, and editor. At runtime, cast each ScriptableObject to ISimpleSkillDataSource and merge
or query them independently.
Can I modify the generated database asset in the Inspector?
Yes. The generated custom editor provides a full split-panel builder with search, sort, filter, and pagination — identical to the wizard's Step 3. You can add, remove, edit, and duplicate entries directly in the Inspector without reopening the wizard.
Does SSF support multiplayer / networking?
SSF generates data assets and provides runtime state trackers. The trackers (SimpleSkillTreeTracker,
SimpleSkillBarManager, SimpleSkillComboTracker) are pure C# classes with snapshot serialization. You can
serialize their state via CreateSnapshot() / RestoreFromSnapshot() for network
sync, save/load, or undo/redo.
What's the performance impact?
Generated databases are standard Unity ScriptableObjects with struct arrays. All runtime lookups use linear scans over small arrays (typical game databases have 50–500 entries). The trackers use dictionaries for O(1) state lookups. There are no per-frame allocations in normal usage.
Can I use SSF with Addressables / Asset Bundles?
Yes. The generated database is a standard ScriptableObject and works with any Unity asset loading system. Cast the loaded asset to the appropriate interface at runtime.