View Format: Multi-Page Single Page

Simple Skill Forge

Generate Complete Skill Databases, Skill Trees, Loadouts, and Combos in Minutes.

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.

If the wizard window closes during domain reload, reopen it from the menu. The generation will resume automatically via [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 SessionState keys 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.

// Example value provider for skill ranks bool met = SimpleSkillHelper.CheckPrerequisite(prereq, code => { if (skillRanks.ContainsKey(code)) return skillRanks[code]; if (code == "Level") return playerLevel; return 0f; });

Integration Issues

SAF/SIF/SEF/SQF bridge not detecting installed package

Bridge detection uses two paths:

  1. UPM path: versionDefines in .asmdef files detect packages by com.livingfailure.* package name and set scripting defines automatically.
  2. Non-UPM path: [InitializeOnLoad] detector classes use Type.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.