{"id":28322295,"url":"https://github.com/flo-baheux/unity-meta-package","last_synced_at":"2026-04-29T08:33:45.880Z","repository":{"id":292318890,"uuid":"978673225","full_name":"flo-baheux/unity-meta-package","owner":"flo-baheux","description":"A packaged set of configurable system features for meta progression. Includes currencies, rarities, upgradables (skills, heroes, any entity with levels), tracks (leagues, account level, any progression with points, steps and rewards), rewards, chests with random distribution of experience for upgradables depending on their rarity.","archived":false,"fork":false,"pushed_at":"2025-06-06T09:24:06.000Z","size":116,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-06-23T20:49:53.487Z","etag":null,"topics":["game-development","gamedev","package","tools","unity","unity-package"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flo-baheux.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-06T10:46:59.000Z","updated_at":"2025-06-06T09:24:07.000Z","dependencies_parsed_at":"2025-05-09T09:41:17.221Z","dependency_job_id":"1037651d-7e1e-4c4e-8e39-6de2e3440da6","html_url":"https://github.com/flo-baheux/unity-meta-package","commit_stats":null,"previous_names":["flo-baheux/unity-meta-package"],"tags_count":5,"template":false,"template_full_name":null,"purl":"pkg:github/flo-baheux/unity-meta-package","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flo-baheux%2Funity-meta-package","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flo-baheux%2Funity-meta-package/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flo-baheux%2Funity-meta-package/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flo-baheux%2Funity-meta-package/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flo-baheux","download_url":"https://codeload.github.com/flo-baheux/unity-meta-package/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flo-baheux%2Funity-meta-package/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32417803,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T06:29:02.080Z","status":"ssl_error","status_checked_at":"2026-04-29T06:29:00.631Z","response_time":110,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["game-development","gamedev","package","tools","unity","unity-package"],"created_at":"2025-05-25T14:09:34.105Z","updated_at":"2026-04-29T08:33:45.863Z","avatar_url":"https://github.com/flo-baheux.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"# unity-meta-package\nConfigurable meta progression game system. Includes: \n- currencies\n- rarities\n- upgradables (skills, heroes, etc.)\n- tracks (leagues, account level, etc.)\n- rewards\n- upgradable chests (XP distribution based on rarity)\n\nNote: \nNot a \"Unity Package\" per se - requires you to edit enum files.\n\n[Design note](http://www.laywelin.com/Meta-Package-Initial-design-draft-1ee058cee40180e880dbea7dcb5a2186)\n\nby [Florian \"Laywelin\" Baheux](http://www.laywelin.com)\n\n# Setup info\n\n## How to add package in your project\n\n1. [Download latest release](https://github.com/flo-baheux/unity-meta-package/releases/latest)\n2. Import into `Assets/`\n3. Add `MetaManager` prefab to your scene\n\n`MetaPackage/Databases`: contains ScriptableObject (SO) config lists and entity kind enums.\n`MetaPackage/Examples`: Example setup per entity. Recommended to remove after your setup is done.\n\n## Currencies\n\nUsed for costs and rewards. Can be locked/unlocked, capped or not, and spent.\n\n### How to setup\n\nTo define a new currency, you need to:\n\n1. Edit `CurrencyKind` enum in `MetaPackage/Databases/CurrencyKind.cs`\n2. Create CurrencySettings SO (right click in Project - `Create \u003e MetaPackage \u003e Currency`) and set CurrencyKind in settings\n3. Add created SO to `MetaPackage/Databases/CurrencyDatabase`\n\nThe currency is now available from anywhere in the project.\nA default currency `ExampleCoins` can be found as an example.\n\n```csharp\nCurrency currency = MetaManager.Instance.GetCurrency(CurrencyKind.Coins);\n\ncurrency.Unlock();\ncurrency.AdjustQuantity(-10);\ncurrency.GetDisplayNameSingular(); // \"Coin\"\ncurrency.GetDisplayNamePlural(); // \"Coins\" (fallback to singular if left empty)\ncurrency.GetSingleIcon(); // Sprite for one coin\ncurrency.GetMultipleIcon(); // Sprite for n coins (fallback to single if left empty)\n\ncurrency.OnQuantityChanged;\ncurrency.OnUnlocked;\n\nMetaManager.OnCurrencyQuantityChanged;\nMetaManager.OnCurrencyUnlocked;\n```\n\n## Rarities\n\nRarities are linked to upgradables, as an upgradable have settings and levels based on rarity.\n(For instance, Rare upgradables can be configured with 5 levels and specific costs to upgrade)\n\n### How to setup\n\nTo add a new rarity, you need to: \n\n1. Edit `RarityKind` enum in `MetaPackage/Databases/RarityKind.cs`\n2. Create RaritySettings SO (right click in Project - `Create \u003e MetaPackage \u003e Rarity`) and set RarityKind in settings\n3. Add created SO to `MetaPackage/Databases/RarityDatabase`\n\nThe rarity is now available from anywhere in the project.\nA default set of rarities can be found as examples: Common, Rare, Epic\n\n```csharp\nRaritySettings raritySettings = MetaManager.Instance.GetRaritySettings(RarityKind.Rare);\n```\n\n## Upgrade Chests\n\nGive XP to upgradables (configurable weighted algorithm) based on rarity.\n\n### How to setup\n\nTo add a new chest, you need to:\n\n1. Edit `ChestKind` enum in `MetaPackage/Databases/ChestKind.cs`\n2. Create ChestSettings SO (right click in Project - `Create \u003e MetaPackage \u003e UpgradeChest`) and set UpgradeChestKind accordingly in settings\n3. Add created SO to `MetaPackage/Databases/UpgradeChestDatabase`\n\nThe chest is now available from anywhere in the project.\nA default Normal chest is already setup as an example.\n\n```csharp\nChestSettings chestSettings = MetaManager.Instance.GetUpgradeChestSettings(UpgradeChestKind.Normal);\n```\n\n## Tracks / Steps\n\nHandles meta progression (account level, leagues, etc.).\n\nIt's possible to extend tracks and steps settings, as well as tracks and steps instances, allowing one to add features and settings.\nA track and a step have \"Settings\" which are what's configured in the editor, and an instance with live data.\n\n### Concepts\n\n**Track:** Progress path\n\n**Step:** Level/Stage inside track (Leagues, Arenas, etc.)\n\n**Progress Point (PP):** XP-like value. Can increase or decrease.\n\n**Reward Points (RP):** XP-like value adjacent used to reach milestones. Cannot decrease. If disabled, fallsback to PP.\n\n**Milestone:** A bundle of rewards that gets available and can be claimed upon reaching points threshold.\n\n**Trigger:** Event that gets manually triggered to get a Bundle. Main example is Victory / Defeat\n\n**Bundle:** Set of rewards. Can be retrieved and claimed via milestones and triggers.\nHas a state: `not_available`, `available`, or `claimed`. A bundle contains **n** rewards and can only be claimed **once**.\n\n**Reward:** Track points, currency, chest, unlock, etc. Can be extended for custom rewards.\n\n### How to setup\n\nFor simplicity's sake, let's say you want to create a `CustomTrack` track.\nTo define a new track and associated steps, you need to:\n\n1. Edit `TrackKind` enum in `MetaPackage/Databases/TrackKind.cs`\n2. Copy from `MetaPackage/Examples/Scripts/Tracks/ExampleLeague`\n3. Replace all `ExampleLeague`\n\nexample for ExampleLeagueTrack:\n```csharp\n// FROM\n  public sealed class ExampleLeagueTrack : BaseTrack\u003cExampleLeagueTrackSettings, ExampleLeagueTrackStep, ExampleLeagueTrackStepSettings\u003e\n  {\n    public ExampleLeagueTrack(ExampleLeagueTrackSettings settings) : base(settings)\n    { }\n\n    public static ExampleLeagueTrack GetLeagueTrack() =\u003e MetaManager.Instance.GetTrack\u003cExampleLeagueTrack\u003e(TrackKind.ExampleLeagueTrack);\n  }\n\n// TO\n  public sealed class CustomTrack : BaseTrack\u003cCustomTrackSettings, CustomTrackStep, CustomTrackStepSettings\u003e\n  {\n    public CustomTrack(CustomTrackSettings settings) : base(settings) { }\n    public static CustomTrack GetLeagueTrack() =\u003e MetaManager.Instance.GetTrack\u003cCustomTrack\u003e(TrackKind.CustomTrack);\n  }\n```\n\n4. Create a new TrackSettings SO (right click in Project - `Create \u003e MetaPackage \u003e Tracks \u003e CustomTrackSettings`)\n5. Create a new TrackStepSettings SO (right click in Project - `Create \u003e MetaPackage \u003e Tracks \u003e Steps \u003e CustomTrackStepSettings`)\n6. Inside the created TrackSettings SO, add a step and link the TrackStepSettings SO\n7. Add the created TrackSettings SO inside the list in `MetaPackage/Databases/TrackDatabase`\n\nThe track is now available from anywhere in the project.\n\n```csharp\nTrack track = MetaManager.Instance.GetTrack\u003cCustomTrack\u003e(TrackKind.CustomTrack);\n```\n\nAll default capabilities [can be found here](./Scripts/Tracks/BaseTrack.cs)\n\n## Upgradables\n\nEntities with rarity + levels. Highly extendable.\nLevels have an XP requirement and cost to upgrade. Upgrade requires a manual action.\nUpgrade XP is provided via chests or custom scripting and is optional.\nUpgrade cost using Currencies.\n\nAn upgradable cannot \"downgrade\". Can be locked/unlocked by default, not eligible for rewards if locked.\nCan be set non-eligible for rewards.\n\n### How to setup\n\nFor simplicity's sake, let's say you want to create an `UpgradableWeapon` weapon.\nTo define a new upgradable kind and be able to define a list of upgradables, you need to:\n\n1. Edit `UpgradableKind` enum in `MetaPackage/Databases/UpgradableKind.cs`\n2. Copy from `MetaPackage/Examples/Scripts/Upgradables/ExampleSkills`\n3. Replace all `ExampleUpgradableSkill`\n\nexample for ExampleUpgradableSkill:\n```csharp\n// FROM\n  public sealed class ExampleUpgradableSkill : Upgradable\u003cExampleUpgradableSkillKind, ExampleUpgradableSkillSettings, ExampleUpgradableSkillLevelSettings\u003e\n  {\n    public ExampleUpgradableSkill(ExampleUpgradableSkillSettings settings) : base(settings)\n    {\n    }\n  }\n\n// TO\n  public sealed class UpgradableWeapon : Upgradable\u003cUpgradableWeaponKind, UpgradableWeaponSettings, UpgradableWeaponLevelSettings\u003e\n  {\n    public UpgradableWeapon(ExampleUpgradableSkillSettings settings) : base(settings)\n    {\n    }\n  }\n```\n\n4. Create a new UpgradableCategorySettings SO (right click in Project - `Create \u003e MetaPackage \u003e Upgradables \u003e UpgradableWeaponCategorySettings`)\n5. Create a new UpgradableSettings SO (right click in Project - `Create \u003e MetaPackage \u003e Tracks \u003e Steps \u003e UpgradableWeaponSettings`)\n6. Inside the created UpgradableCategorySettings SO, link the new UpgradableSettings SO\n7. Inside the created UpgradableSettings SO, link the new UpgradableCategorySettings SO (It's a two way relationship!)\n8. Add the created UpgradableCategorySettings SO inside the list in `MetaPackage/Databases/UpgradableCategories`\n\nThe upgradable is now available from anywhere in the project.\n\n```csharp\n  UpgradableFireSword upgradableFireSword = MetaManager.Instance.GetUpgradable\u003cUpgradableFireSword\u003e(\n    UpgradableKind.UpgradableWeapon,\n    UpgradableWeaponKind.FireSword\n  );\n```\n\nAll default capabilities [can be found here](./Scripts/Upgradables/Upgradable.cs)\n\n# Extending the package\n\nThe package is made to be easy to edit and add project specific features. \nHere is a non-exhaustive section to help you with it.\n\n## Adding a new reward kind\n\nReminder: A reward is something that can be granted once reashing a threshold in a track.\nIt's also possible to design game systems that grants rewards manually.\n\n1. Edit `RewardKind` enum in `MetaPackage/Scripts/Rewards/RewardKind.cs`\n2. Make sure the settings you want are available within `MetaPackage/Scripts/Rewards/RewardSettings.cs`\n3. Create a new reward extending `BaseReward` \n\nExample:\n```csharp\n  public class UpgradableExperienceReward : BaseReward\n  {\n    public UpgradableExperienceReward(RewardSettings settings) : base(settings)\n    { }\n\n    public override void Claim()\n    {\n      var upgradable = MetaManager.Instance.GetUpgradable(settings.upgradable.UpgradableKind, settings.upgradable.EntityKindAsEnum);\n      upgradable.IncreaseExperience(settings.quantity);\n    }\n\n    public override Sprite GetSprite() =\u003e settings.upgradable.icon;\n\n    public override string GetText() =\u003e $\"{settings.quantity}xp for {settings.upgradable.displayName}\";\n  }\n```\n\n4. Add a new case in `RewardFactory` in `MetaPackage/Scripts/Rewards/RewardFactory.cs`","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflo-baheux%2Funity-meta-package","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflo-baheux%2Funity-meta-package","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflo-baheux%2Funity-meta-package/lists"}