Skip to content

Core — Changelog

All notable changes to this pack are recorded here.

The format follows Keep a Changelog and the pack follows Semantic Versioning.

The version below must always match FOSVersion.CoreVersion in Runtime/FOSVersion.cs — that is the version the FOS Hub shows, and the one every pack declares a minimum against.


Nothing yet.


  • The shop button now covers several stores. The branding settings hold a list of stores instead of a single URL, pre-filled with FOS Shop, Jinxxy, Booth and Gumroad. The button appears both in the banner of every FOS component and in the Hub.
  • An entry with no URL is ignored, so a store can be prepared before its page exists. With one usable store the button opens it directly; from two it becomes a dropdown — a menu holding a single entry would only be an extra click.
  • A pack can declare what it needs from other packs, through MinimumVersions on the FOSTool attribute: MinimumVersions = "FOS Tablet System=2.0.0". Until now a pack could only state a minimum Core version, so a dependency between two packs existed only in an assembly reference — invisible to the buyer, and unverifiable by the Hub.
  • The Hub reports every unmet requirement on a tool, telling a missing pack apart from one that is merely too old, and naming the version actually installed.
  • The former single shop URL is moved into the store list the first time the editor loads, and the old field is then cleared. Nothing to redo by hand.
  • Hub layout: Links now sits directly under Environment, before the prefabs and the tool list.
  • The banner stretched over hundreds of empty pixels inside an editor window. It centres its text with flexible spacing, which does nothing in an inspector whose height follows its content, but claimed all the available height in a window. It now keeps the height of its content everywhere.
  • The branding settings and Discord and Shop links rows of the environment section, and the Open branding settings button. They told the author of a pack about their own configuration and taught a buyer nothing. The branding asset is still reachable in the project, and the Core recreates it if it goes missing.

  • The Hub window was slow to the point of feeling laggy, and got worse with every pack installed. Three of its status rows queried the AssetDatabase and the Package Manager on every repaint, and one of them ran a full project search per installed pack. With seven packs that came to roughly ten project-wide searches and fifty asset loads for each frame the window drew. The results are now read once when the window opens, when it regains focus, and after any action that changes them.
  • FOSCoreBootstrap.CountUnregistered() collects the registered assemblies in a single pass instead of searching the whole project once per pack. Any caller benefits, not just the Hub.
  • The Hub’s Repair now button refreshes the state it displays, instead of leaving the row in error until the window regained focus.

Every pack built on 1.0.0 keeps working. Tools that use the localisation system or the prefab menu require this version.

Localisation

  • FOSLoc — translation lookup for the whole editor interface, in English, French, Spanish and German. A key resolves against the active language, then English, then the caller’s fallback, then the raw key. Showing the raw key is deliberate: a missing translation is meant to be seen.
  • FOSCoreStrings — the four tables, held in code rather than in assets, so no buyer can break them by moving or deleting a file.
  • FOSLocalizedInspector — replaces DrawDefaultInspector() and translates field labels, tooltips and section titles. Keys resolve from the type that declares a field, so an inherited field is translated once and serves every tool deriving from it.
  • FOSSectionAttribute — localisable replacement for [Header], whose text is frozen at compile time.
  • Language selector in the Hub and in the branding settings, stored in EditorPrefs. The language belongs to the machine, not to the pack.

Menu and prefabs

  • Root FOS Essentials menu, as the VRChat SDK itself does.
  • FOSPrefabCatalog — discovers prefabs by convention under Assets/FOS/<Pack>/Prefabs/, and Assets/FOS/<Pack>/<Edition>/Prefabs/ for a pack shipped in several editions. No pack has a line of code to write to expose its prefabs.
  • FOSPrefabMenuGenerator — writes real [MenuItem] entries per pack into a generated file. [MenuItem] is an attribute and cannot be built from a runtime scan; Unity’s dynamic Menu.AddMenuItem is internal and undocumented, so it is not used.
  • Add to scene section in the Hub, one button per prefab, dropped in front of the scene view as a linked prefab instance.
  • FOSMenu — shared priority bands for every menu entry of the line.
  • FOSCoreBootstrap now registers every FOS.*.Runtime assembly with UdonSharp, not only the Core’s. A new pack no longer needs a manual step to avoid being silently ignored by the compiler.
  • The Hub resolves a tool’s description through FOSLoc when it is a translation key, so the tool list reads in the user’s language. Plain text still works.
  • Branding settings removed from the menu; they are opened from the Hub.
  • [Tooltip] texts rewritten in English, where they now serve as fallbacks.
  • Shipped README.md files rewritten in English.
  • Menu ordering: prefab entries were numbered by a running counter that grew with every pack, and past five packs it overflowed into the Core utilities. A pack could appear between two tools. Each pack now receives its own priority band, and the generator warns instead of silently degrading when the bands run out.

First release.

Runtime

  • FOSBehaviour — base class of every FOS behaviour: filterable logging, ownership and serialisation helpers. Abstract, so UdonSharp generates no program asset for it.
  • FOSPlayerRegistry — player list rebuilt on join and leave instead of every frame, with listeners notified through OnFOSPlayersChanged().
  • FOSToolAttribute — how a pack declares itself to the Hub.
  • FOSVersion — identity and version constants.

Editor

  • FOSBrandingSettings — logo, accent colour, Discord, shop, site and documentation URLs in a single asset. No URL is ever written in code.
  • FOSDefaultInspector — the FOS banner appears automatically on anything deriving from FOSBehaviour, with no editor class to write, through a [CustomEditor] that UdonSharp propagates to derived types.
  • FOSInspectorBase — base for a custom inspector that keeps the banner.
  • FOSToolRegistry — discovers installed tools by scanning assemblies, so the Core holds no hard-coded list, and warns when a tool needs a newer Core.
  • FOSHubWindow — environment diagnostics, installed tools and links.
  • FOSProgramAssets — creates the missing UdonSharpProgramAsset files. UdonSharp does not generate them, and without one a behaviour cannot be added to a GameObject at all.
  • FOSCoreBootstrap — registers the runtime assembly with UdonSharp. Without that registration, behaviours placed in an asmdef are ignored by the compiler with no error whatsoever.