A quest system that always tells players why a quest is locked. The logic is plain C# you can unit test, and quests are ScriptableObjects you can diff in Git.Smart Quest System has no rendering of its own. The framework is pure C#, and the optional UI uses uGUI and TextMeshPro, which render the same on Built-in, URP and HDRP. Import TMP Essential Resources once and the UI works on any of them. It supports both the legacy Input Manager and the new Input System, with mouse or touch. Verified on Unity 6 (6000.5).I built this because the same thing kept breaking in every quest system Itried. A quest wouldn't show up, or a player got stuck, and there was nofast way to see why. So that's the whole idea here. Every condition aquest checks hands back a real reason in words, not just true or false.When a quest is locked it can say "Requires at least level 3, you have 1."That same line shows up in the quest log, in a tooltip, and in thedebugger, and you can drop it into your own UI, because it gets worked outin one place.Two things come out of that, and you can check both before you buy. Thequest logic lives in a plain C# core that never touches UnityEngine, so itruns in unit tests without you entering Play mode. I put 130 of thosetests in the package so you can run them yourself. And every quest is justa ScriptableObject, so when a teammate edits one you read it as anordinary line in a Git diff instead of opening a graph editor to work outwhat moved.It stays out of your way. Rewards are data in your own words, and theframework never hands anything to the player. You register one small hookand your economy stays yours. Objectives handle the common cases: countsomething like "collect 3 ore", check a live world state like "have 3ore" (which drops back to incomplete if the player spends it), or countdistinct things like "visit 3 different shrines". Anything unusual is acustom objective in about ten lines. Chains, choices, timed quests, repeatrules and fail states are fields you set in the inspector, not classes youhave to inherit from.Any game that tracks goals fits, from an RPG to a survival game to atutorial to a side questline in a shooter. The quest log, tracker andpopups are an optional uGUI prefab with a single theme asset. Restyle it,replace it, or skip it and use your own. Nothing here depends on it, andnothing depends on any other asset I sell. You get the full C# source. NoDLLs.• Every unlock condition returns a written reason instead of a bool. A reason is a key plus arguments plus a fallback string, so you can localize it.• The core is pure C# compiled with noEngineReferences, so it runs in tests without the engine. 130 EditMode tests are included.• Quests are ScriptableObjects and diff cleanly in version control. No node graph is required, though a read-only graph view is there if you want to inspect chains and branches.• Objective types: counter, live world-state check, distinct-key counter, and a one-interface seam for your own.• Completion rules: all, any, at least N, or in order. Objectives can be required or hidden. A chain is just a prerequisite pointing at another quest.• Rewards go through one IRewardGranter hook. The framework never touches your economy, and an ungranted reward is flagged so you notice it instead of losing it silently.• Choices resolve when a quest completes. Fail states always store a reason, whether it came from a rule, a deadline, or an explicit fail call.• Save and restore is tolerant. Remove an objective, retarget a quest, or lower a target, and old saves still load, with a report of what changed.• A JSON serializer is included. Swap in your own through IQuestSerializer.• Optional uGUI UI (quest log, HUD tracker, toast popups) driven by one theme asset. Built on TextMeshPro.• Editor tools: a quest creator, a validator that checks across quests, and a live debugger.• Full C# source, no DLLs. Assembly definitions keep UI, core and persistence apart.• Tested on Unity 6 (6000.5). Works with built-in, URP and HDRP, and with the old Input Manager and the new Input System.I used an AI assistant to help write code and find bugs duringdevelopment. The design decisions and the final code are my own, and Itested everything by hand before release.

