Customization
In short
Cosmetics are looks only: no stats. There are four slots (hat, glasses, shoes, bat), one item worn per slot. Items are bought once with meta points, and most need an account level before they go on sale. A cosmetic bat changes how your bat looks; the shop’s Bat upgrade still gives the stats. A call sign is a free title over your batter, opened by account level.
How it works
The screen (top bar CUSTOMIZE):
- Left sidebar: HATS, GLASSES, SHOES, BATS, CALL SIGN, then CLOTHES, GLOVES, EMOTES greyed out with a SOON pill.
- Middle: your selected batter on a spotlit stage. Left-drag spins (a flick keeps coasting), right-drag tilts, middle-drag or arrow keys / WASD pan, the wheel zooms toward the cursor, double-click resets. It slowly turns by itself until you touch it. Picking a category frames that part of the body; BATS switches to the batting stance.
- Footer: POSE: STANDING / POSE: STANCE and RESET VIEW. There is no back button: the PLAY tab or Esc returns to the title screen.
- Right: a grid of item tiles with rendered thumbnails. The first tile is NONE (empty slot). Locked tiles are dimmed with a lock and a purple price pill (a gem and the cost) or, if your level is too low, LV n. The equipped tile has a yellow border and a check.
- Detail card under the grid: name, blurb and one action.
Buying and wearing:
- Hovering a tile tries the item on the batter right away; moving off puts back what you wear.
- Clicking an owned tile equips it (clicking NONE empties the slot).
- Over the button, a locked item shows its price as a purple pill with a gem (n PTS; greyed while your level is too low). The detail card button is one of: REACH LV n (greyed, your account level is too low), BUY (spends the points and equips it), EQUIP, EQUIPPED, REMOVE (on the NONE tile) or NOTHING WORN.
MetaProgression.Equipsaves at once and raisesCosmeticsChanged, so the batter in the box updates.
One loadout for every batter. SaveData.cosmetics holds one id per slot (hatId, glassesId, shoesId,
batId), shared by all batters. A new save wears nothing (“Wearing: nothing yet” on the title screen).
Bats. A Bat cosmetic is a model from the BatModelLibrary. In an at-bat the bat shown is: the dev override if any,
else your equipped Bat cosmetic, else the model of your Bat-slot upgrade. Stats always come from the upgrade.
Co-op spectators see the batter’s own bat, never their own cosmetic.
Call signs (CALL SIGN category): a list of titles. Each shows WEAR, WEARING, or a lock and LV n.
They cost nothing; the account level opens them. The worn one is shown over your batter on the title screen. If the
saved one is locked or unknown, the first open one (ROOKIE) is worn.
Numbers
| What | Value | Where to tune |
|---|---|---|
| Slots | Hat, Glasses, Shoes, Bat | CosmeticSlot |
| Free from the start | Ball Cap, Shades, Sneakers (0 PTS, no level) | DefaultContent |
| Cheapest bought item | Hickory bat, 20 PTS, LV 2 | DefaultContent |
| Dearest item | Old Faithful bat, 70 PTS, LV 10 | DefaultContent |
| Call sign levels | 1, 3, 5, 7, 10, 15, 20 | DefaultContent |
| Grid | 4 columns of 96 px tiles | CustomizeView.GridColumns, TileSize |
Full price and level lists: Cosmetics and Call Signs.
In the code
| File | What it does |
|---|---|
Assets/_Project/Scripts/UI/CustomizeView.cs | The screen: sidebar, tiles, detail card, try-on, orbit camera, call sign list |
Assets/_Project/Scripts/Data/CosmeticDefinition.cs | CosmeticSlot, CosmeticStyle, price, requiredLevel, fit offset / rotation / scale, optional prefab |
Assets/_Project/Scripts/Data/CallSignDefinition.cs | id, text, requiredLevel |
Assets/_Project/Scripts/Progression/MetaProgression.cs | IsUnlocked, CanBuy, TryBuy, Equip, Unequip, Equipped, SelectedCallSign |
Assets/_Project/Scripts/Progression/SaveData.cs | CosmeticLoadout, callSignId |
Assets/_Project/Scripts/Batting/AtBatController.cs | SetBatModel picks which bat model shows |
Assets/_Project/Scripts/Batting/CosmeticBuilder.cs | Builds the code-made hats, glasses and shoes |
Assets/_Project/Scripts/UI/ThumbnailRenderer.cs | Tile pictures: For(item) queues a request, LateUpdate renders it, then it is cached for the session |
Gotchas
- Owning an item always counts, whatever your level. The level only gates buying.
- Cosmetic ids share one unlock list with batters and upgrades, which is why they carry a slot prefix (
hat_,glasses_,shoes_,bat_). - An equipped id that no longer exists in the content, or is locked again (dev lock all), simply stops showing.
- While a top-bar popup is open, hover try-on and camera drags are off.
- A tile’s picture appears one frame after it is first asked for. Thumbnails render in
LateUpdate, not fromOnGUI: rendering a camera mid-frame fromOnGUIthrew URP’s “UniversalCameraData has already been created” (fixed in PR #45). An item with no model gets no picture and is not retried. - String Bean has a new model since PR #44 (flat toon colours, no texture). See Characters and Rigs.
- Fit Mode (dev only: the purple FIT button in the Editor, or Ctrl+Shift+F in any build) docks a socket and item editor on the stage. See Fit Mode.
Not built
CLOTHES, GLOVES and EMOTES are placeholders marked SOON. Uniforms with stats are not started.
Related
- Cosmetics: every item, price and level
- Call Signs: every title and its level
- XP and Levels: the account level that opens items
- Meta Progression: points
- Fit Mode: the dev tool for fitting items to models
- Characters and Rigs: the batter models items attach to
- Add a Cosmetic