One component for Unity UI. Add a UIShape to any UI element and you get rounded, squircle, octagonal or slanted shapes with fill, gradients, textures, drop shadow, inner shadow, glow, outline, bevel and background blur, plus soft masking, progress wipes and per-state button styling. No sprites, no 9-slices, no render textures. Everything stays crisp at any resolution.
The demo scene is UI Shapes/Demo/UI Shapes Demo Scene.unity. It runs on any render pipeline.
To make it interactive, click Add... next to the Selectable field at the top of the inspector. See Interactive Controls.
UIShape as a decorator: leave Fill off and put it on (or beside) an existing Image to wrap it in a shadow, glow or outline.To start from a finished control rather than a blank shape, use GameObject ▸ UI. The UI Shapes entries sit at the top of that menu, above Unity's own. Every one builds the whole hierarchy out of UI Shapes, with no Image and no sprites anywhere, and with its hover and pressed looks already set up.
| Item | What you get |
|---|---|
| UI Shape | A plain shape, same as adding the component by hand. |
| Button | A shape with a Button and a label. |
| Toggle | A row with a checkbox, a checkmark that turns on with it, and a label. |
| Slider | A track with a fill and a handle that follow the slider's value. |
| Dropdown | A closed control plus its drop-down list, with rows that highlight on hover. |
| Input Field | A text box with placeholder text. |
| Scroll View - Vertical Scroll View - Horizontal | A soft-masked scrolling area with a scrollbar, a layout group that stacks items along the scrolling axis, and one Item_1 shape to duplicate. |
Dropdown and Input Field use TextMeshPro, so they appear only when TMP is installed. Everything else works either way, and adds a TMP label when TMP is there.
To turn a shape you've already styled into a control instead, click Add... next to Selectable and pick from the same list. Your shape becomes the control's background, and any parts it needs are created inside it. Scroll View isn't offered there, since a scrolling area has no states to drive.
Each effect is a collapsible module, styled like Unity's Particle System. The checkbox in the module header is the on/off switch, and clicking the bar expands the settings. A module you expand while it's off shows its settings read-only.
Most effects share the same handful of controls at the top of their module, described once under Common Controls. Each effect's section below lists only its own settings.
All sizes and distances are in canvas units, and all angles are in degrees.
| Field | What it does |
|---|---|
| Corner Style | Sharp (default) is a plain rectangle, and hides the radius controls since they don't apply. Rounded gives circular corner arcs. Octagonal cuts each corner off as a straight 45° chamfer. Squircle gives superellipse arcs, the continuous corner familiar from iOS and Figma, with Squareness setting how square they are.
Sharp
Rounded
Octagonal
Squircle
|
| Border Mode | How the corner radius is shared out. Uniform uses one radius for all four corners. Round auto-sizes it to half the short side, so squares become circles and long rectangles become pills. Free gives a separate radius per corner.
Uniform
Round
Free
|
| Squareness | Squircle only. How square the corner arcs are, from 0 to 1. At 0 the arc is a plain circle, identical to Rounded; around 0.5 sits the familiar iOS and Figma look; 1 is a nearly square corner that still meets the edges smoothly. Animatable, and it blends smoothly between button states. |
| Corner Radius | The arc radius on Rounded and Squircle, or the chamfer size on Octagonal. Radii that would overlap along an edge scale down together, the same way CSS border-radius does. |
Fill, outline, shadows, glow and bevel all follow the corner style, so the shape keeps one silhouette. Style and radii animate and can be overridden per button state. Transitions between Sharp, Rounded and Squircle morph the corners rather than popping, because squareness 0 is exactly the Rounded arc.
Pick a style by looks. Sharp, Rounded and Octagonal all cost the same. Squircle costs a little more, mostly on the soft effects, and only on the shapes that use it. That difference never registers on PC or console, and on mobile ordinary squircle buttons and panels are fine. The case worth profiling is a whole screen of squircle panels each carrying a drop shadow.
Turn the Skew module on to slant the shape like italic text. It's purely visual, so the RectTransform, layout and anchoring don't change, and every effect slants with it, still anti-aliased.
| Field | What it does |
|---|---|
| Skew Axis | Horizontal or Vertical. |
| Skew Angle | The slant in degrees. 0° is upright. |
| Skew Mode | Parallel: both edges share the angle, giving a parallelogram. This is the classic italic slant, and the default. Mirrored: the opposite edge takes the negative angle, giving a symmetric trapezoid. Good for banners, ribbons and fake-perspective panels. Custom: an angle per edge (Left and Right, or Bottom and Top on a vertical skew) for an asymmetric trapezoid. Parallel
Mirrored
Custom
|
| Even Effect Width | Off by default. Off, the effects slant along with the shape, so an outline gets thicker on some edges and thinner on others, exactly the way italic text slants its own strokes. Turn it on to keep outlines, shadows and glows the same thickness all the way around instead. It costs noticeably more to draw: see Performance & Platforms. |
The module has its own on/off switch, so you can keep an angle set and switch the slant per button state, where it fades in and out smoothly.
A trapezoid narrows as the angle grows and stops before the edges cross, settling into a clean triangle. How steep you can go depends on the element's proportions: a tall element takes a much steeper angle than a short one.
Soft masks, Background Blur and click detection all follow the slanted outline.
A slanted shape costs the same as an upright one to draw, unless you turn Even Effect Width on: see Performance & Platforms.
These four settings appear on most effect modules. Each effect section below says which of them it has, then lists its own specific fields.
| Field | What it does |
|---|---|
| Color Mode | Whether the effect uses a Single Color or a gradient. See below. |
| Opacity | 0 to 1, fading that effect alone. Layers on top of the color's own alpha. |
| Blend Mode | How the effect composites over what's beneath it. Normal covers, Additive brightens (good for glows and bevel highlights), and Multiply darkens (good for bevel shadows and tinted overlays). |
| Intensity | 0.1 to 10, an alpha multiplier. Values above 1 make a soft effect's core denser without making it any bigger, which is the difference between a faint haze and a solid core at the same radius. Only the three soft effects have it. |
Wherever Color Mode offers a gradient, the choices are Vertical (top to bottom), Horizontal (left to right), or Custom Angle, which adds an Angle slider (0° puts the end color on the right, 90° on top).
Fill uses Unity's own gradient editor: click the Gradient field and add as many color and alpha stops as you like, anywhere along the ramp. Set the gradient's own mode to Fixed for hard-edged bands instead of a smooth blend. Every other effect (Texture, Drop Shadow, Inner Shadow, Glow, Outline) keeps a simpler start and end color, which is what those effects are normally used for.
Colors carry alpha, so a transparent stop gives a clean fade-out, and alpha stops can sit at different positions from the color stops. Colors blend the way they do in Photoshop, Figma and CSS. Gradients cost nothing extra to draw, and state transitions cross-fade them, including between a single color and a gradient, or between two gradients with different numbers of stops.
The shape's interior, as a single color or a multi-stop gradient.
Common controls: Color Mode and Opacity. Fill has no blend mode or intensity of its own, since it's the bottom layer everything else composites over. Textures are a separate module, covered next.
A sprite drawn on top of the Fill and clipped to the shape's corners. It has its own on/off switch, so you can use it with Fill off. With no sprite assigned it draws a plain white rect, which the tint turns into a flat colored layer.
Common controls: Color Mode, Blend Mode and Opacity. The color here is a tint: it multiplies the sprite's own colors rather than replacing them, like Image.color. White, the default, leaves the sprite untouched, and a grayscale or white sprite can be recolored freely. A gradient Color Mode tints across the shape, so one sprite can fade between two colors. The tint's alpha multiplies with Opacity.
| Field | What it does |
|---|---|
| Texture | The sprite to draw. Leave it empty to draw nothing. |
| Texture Fit | How the sprite fits the rect when the aspect ratios don't match. See the table below. |
| Pixels Per Unit Multiplier | Constant Size only. Scales the tile's on-screen size, matching Image.pixelsPerUnitMultiplier. |
| Grayscale | Strips the sprite's color before the tint is applied. On its own it grays an image out, which is what you want on a Disabled state. Combined with a tint it recolors the image through that single color. |
Texture Fit handles mismatched aspect ratios:
| Mode | Behavior |
|---|---|
| Stretch (default) | Scales to fill, ignoring aspect ratio. |
| Aspect Fit | Keeps aspect and fits inside the shape. The margin is transparent, like Image.preserveAspect. |
| Aspect Fill | Keeps aspect, scales up to cover the shape, crops the overflow. |
| Constant Size | A fixed on-screen texel size, tiled to cover the rect. Needs a non-atlas sprite with Wrap Mode: Repeat, and the inspector warns if the sprite doesn't qualify. The tile size comes from the sprite's Pixels Per Unit, the Canvas's Reference Pixels Per Unit, and the multiplier above. |
Every fit works from the sprite's full authored size, including any transparent border, so artwork sitting off to one side keeps its intended aspect and position. A sprite packed into a trimmed Sprite Atlas is the exception: the border no longer exists there, so the fit uses the trimmed artwork. Set the sprite to Mesh Type: Full Rect if you need the border preserved in an atlas.
Textures always render upright. They never shear with a skewed shape, though the silhouette still clips them. The tint gradient does follow the shape, so it stays aligned with the fill's gradient.
Every Texture field animates and can be overridden per state, so a state can swap the sprite, the fit, the tint or the opacity. Grayscale is on or off rather than an amount, so it switches at the start of a state transition instead of fading across it, like Texture Fit and the blend modes. The two fields below are the exception: they apply to the whole shape rather than per state, so you'll find them on the Normal tab only.
Cut-out artwork, an icon, a character or a logo on a see-through background, usually wants its shadow and its outline around the picture, not around the rect it sits in. Tick Use Texture Outline for Effects and they do.
| Field | What it does |
|---|---|
| Use Texture Outline for Effects | Outline, Drop Shadow, Glow, Inner Shadow and Bevel trace the sprite's own shape. |
| Targets | Which of the five follow. The rest keep the shape's outline. |
Every effect keeps all of its settings. Width, Placement, Radius, Distance, Spread, colors and blend modes all behave exactly as they do on a plain shape.
The tick appears once you assign a sprite, and it turns itself on the first time you assign one with a see-through background to a shape that has no Fill. Turn it off any time; it stays off after that.
A soft shadow behind the element.
Common controls: Color Mode, Opacity, Blend Mode and Intensity.
| Field | What it does |
|---|---|
| Radius | Blur distance. |
| Distance | How far the shadow is offset from the shape. |
| Angle | Which way it's offset. 0° is right, 90° is up. |
| Spread | Grows or shrinks the shadow before blurring. |
The shadow is cut out of the shape's interior, so a semi-transparent glass panel never shows its own shadow through itself.
A soft shadow drawn inside the shape's edge, for a recessed look. It covers the outer edge completely, so no rim of fill color peeks through.
Common controls: Color Mode, Opacity, Blend Mode and Intensity.
| Field | What it does |
|---|---|
| Radius | Blur distance. |
| Distance | How far the shadow is offset inside the shape. |
| Angle | Which way it's offset. 0° is right, 90° is up. |
| Spread | Positive values thicken the shadow on all sides. |
A halo around the shape, additive by default. It's centered, so unlike the shadows it has no distance or angle, and like the drop shadow it renders only outside the shape. The halo keeps an even width all the way around, so corners stay as sharp or as round as the shape's own.
Common controls: Color Mode, Opacity, Blend Mode and Intensity.
| Field | What it does |
|---|---|
| Radius | How far the glow reaches out from the shape. |
| Spread | Pushes the whole halo out from the shape, or pulls it in, without changing how soft it is. |
A stroke on the shape's edge.
Common controls: Color Mode, Opacity and Blend Mode. The outline is a hard-edged effect, so it has no intensity.
| Field | What it does |
|---|---|
| Placement | Inside, Outside or Centered on the edge. |
| Width | Stroke thickness. On a slanted shape it slants too, unless you turn on Even Effect Width in the Skew module. |
| Softness | 0 for a crisp stroke, higher to feather it. |
| Distance | Pushes the stroke further out, for a detached ring. |
On a sharp-cornered shape, Outside and Center strokes miter to a point. With a radius, the outer edge grows to radius + width, the way design tools stroke a rounded rectangle.
A Photoshop-style inner bevel: a lit band along the edge, with a highlight on the light-facing side and a shadow opposite, wrapping around rounded corners.
Bevel has no single color of its own. Instead the highlight and the shadow each get their own Color, Opacity and Blend Mode, so you can tune the two halves independently. The defaults are additive white and normal black; set the shadow to Multiply for the classic Photoshop look.
| Field | What it does |
|---|---|
| Width | The band size. |
| Depth | Shading strength. |
| Softness | Feathers the band and flattens the shading where two edges meet: a square corner's miter line, an octagon's facet joins, and the ridge running inward from every corner. 0 gives a crisp chisel with hard miter joins. Measured in the same units as Width, so a Softness near the Width washes the facets out completely. |
| Angle | Light direction. The default 135° is Photoshop's up-left. |
| Invert | Flips the lighting so the shape reads as pressed in. Handy for a pressed button state. |
| Highlight Color Highlight Opacity Highlight Blend Mode | The lit side of the band. Additive white by default. |
| Shadow Color Shadow Opacity Shadow Blend Mode | The unlit side. Normal black by default. |
Frosted glass, blurring whatever is rendered behind the shape. Pair it with a semi-transparent Fill for tinted glass. It's clipped to the shape's corners, respects soft masks, and composes correctly where panels overlap.
Blur has none of the common controls. Its three settings are its own, and the tint comes from the Fill module underneath.
| Field | What it does |
|---|---|
| Radius | Blur strength. |
| Blur Opacity | Mixes between the sharp and the blurred background. 1 is fully blurred. This is a mix, not a fade to transparent, so lowering it lets the sharp background show through rather than making the panel see-through. |
| Quality | The blur's sample count: High (32 taps), Medium (16) or Low (8). Lower counts cost proportionally less and stay smooth even at large radii. On busy, high-contrast backdrops the lower settings can look very slightly softer, which is usually invisible in context. This is your main lever on mobile, so see Performance & Platforms before shipping. |
| Pipeline | Setup |
|---|---|
| Built-in | Works out of the box, and is the only pipeline that also blurs UI behind the panel, including elements on the same canvas. |
| URP | One-time setup: press Fix on the reminder in the Background Blur module, and UI Shapes adds the Renderer Feature UI Shapes Background Blur Feature to the default renderer of your active URP Asset. To do it by hand, select your URP Renderer asset (under your URP Asset's Renderer List) and add that feature there. Until the feature is in place, blur panels stay invisible. The feature costs nothing on frames with no blur panel, so it's safe to leave installed. Its Capture Resolution (default Half) is a second mobile lever, covered under Performance & Platforms. |
| HDRP | No setup. It's handled automatically. |
Reveal a fraction of the shape, like an Image's Fill Amount, for radial timers, linear bars and cooldown sweeps. Off by default; turn the module on with its header checkbox.
| Field | What it does |
|---|---|
| Amount | 0 to 1, how much shows. This is the value you animate or drive from script (ProgressAmount). |
| Method | Radial is a 360° sweep (pie or clock). Linear is a straight wipe. |
| Origin | Where the fill starts: the edge it grows from on Linear, or the starting angle on Radial. |
| Clockwise | Radial only. Reverses direction. |
| Targets | Which effects get trimmed: any mix of Fill, Texture, Outline, Glow, Drop Shadow, Inner Shadow, Bevel and Background Blur. Fill and Texture are ticked by default. Unticked effects always draw in full, so you can wipe the Fill while a static Outline frames the whole shape. |
The wipe has smooth anti-aliased edges, adds no draw calls, and works with masking, the Animator and button states. Gradients, textures and bevels are revealed exactly as far as the Amount.
A mask hides whatever its children draw outside it. Use one to keep a scrolling list inside its panel, or to make a square photo come out round.
| Mode | What it does |
|---|---|
| None | No masking. |
| Simple | Hard-edged clipping through Unity's own Mask component. Add that component to the same GameObject. |
| Soft | Smooth-edged clipping, and any side can fade out. Replaces Mask and RectMask2D, so remove those from the object first. |
A shape is clipped by the nearest Soft mask above it. Nesting one Soft mask inside another clips against the inner one only, so content can spill past the outer mask; make the outer one Simple if you need both to clip.
Soft also skips rows that scroll fully out of sight, so a long list only costs you what's on screen.
Soft mode adds two settings that reshape the clipped area:
Each takes four values, for Left, Right, Top and Bottom, so every side can differ:
| Field | What it does |
|---|---|
| Padding | Pulls that side inward. Negative values push it outward instead, letting children spill past the shape. Corner radii stay as they are. |
| Softness | Fades that side out over the distance you give it. Softening the top and bottom of a scrolling list is the classic use: rows dissolve at the edges, with no gradient overlay image. A side left at 0 keeps its crisp edge, and two soft sides meet cleanly in the corner between them. |
Both belong to the shape itself, so they stay the same across button states and aren't saved into a style. From script they're MaskingPadding and MaskingSoftness.
Maskable, the last field in the module, works in every mode. Turn it off to stop a mask further up the hierarchy from clipping this shape, so a large shadow or glow can spill outside a masked parent. It controls whether this shape is clipped, not whether it clips others.
Whether the shape catches pointer events is set at the top of the inspector, next to Selectable. Most shapes show a Raycast Target checkbox. A shape whose Selectable lives on a different UI Shape, such as a child checkmark, shows a Raycast Mode dropdown instead:
| Mode | What it does |
|---|---|
| Follow (default) | Catches nothing itself, but mirrors the parent shape's Highlighted, Pressed and Selected look across the whole parent. That's how a checkmark lights up with its toggle. |
| On | Hit-tests its own bounds and computes its own state. |
| Off | Inert, purely decorative. |
Hit-testing matches the shape you see, not its bounding rectangle. Rounded, squircle and octagonal corners, slant and taper are all accounted for, so a click just outside a corner falls through to whatever's behind. Drop shadow and glow aren't clickable.
What the shape draws decides whether it catches clicks. Fill, Texture and Background Blur cover the shape's area, so any one of them makes it catch clicks, the way an Image does.
Outline, Inner Shadow and Bevel only draw near the edges, so on their own they catch nothing: a frame or a highlight drawn over your interface never blocks the controls underneath. A shape with a Selectable is the exception. A control has to be clickable everywhere it is shown, so it catches clicks whatever it draws, even when that is only an outline or a look that appears on hover.
This applies to the shape itself only. Children keep their own pointer behavior, so turning Raycast Target off makes the shape click-through without affecting anything parented under it.
A UI Shape can be the whole look of a Unity control, so a button, a slider or a dropdown needs no sprites at all. Point the Selectable field at a Button, Toggle, Slider, Scrollbar, Dropdown or Input Field and the shape takes over its visuals.
They all work the same way: the shape restyles itself as you hover, press, check and disable the control, with no sprite swaps. Control Types below covers what's specific to each, and Text Transitions carries the same states to the control's labels.
Selectable to the Selectable field, or click Add... to add and assign one in a single step.The selected tab is also the live preview, and an orange bar in the left gutter marks everything that differs from Normal, like Unity's prefab override lines. Previews are never saved.
Assigning a Selectable sets its Transition to None and turns Raycast Target on. Assigning one you already have, with the picker or by drag and drop, leaves its Navigation as you have it. Controls created from the GameObject > UI menu or the Add... button have their Navigation set to None.
Precedence matches Unity's: Disabled > Pressed > Selected > Highlighted > Normal.
The Transform module lets a state move, turn and resize the shape, so a button can sink a little when pressed or grow under the pointer. It appears once a Selectable is assigned.
| Property | What it does |
|---|---|
| Offset | Moves the shape sideways and up or down, in canvas units. |
| Rotation | Turns the shape, in degrees. |
| Scale | Resizes the shape. 1 is its resting size, 1.05 is five percent bigger. |
All three are changes on top of the Rect Transform, not replacements for it, so you can move or lay out the shape later and every state still works. That's why they're read-only on the Normal tab: Normal is whatever the Rect Transform already holds. They cross-fade with the rest of the look over Transition Duration, and anything parented to the shape, like a button's label, moves with it.
Every control below drives its states through the same tabs. What changes is which parts you get to style, and where each one's states come from.
A control's sub-parts, like a slider handle or a dropdown arrow, share the control's Selectable. They light up together with it, across its whole area, using the Follow raycast mode.
This works in your own layouts too. Give several shapes the same Selectable, such as a background and a separate icon, and they change state together across the whole button. It holds even when the Selectable sits on a plain parent object rather than on a UI Shape, which is common when a button prefab keeps its Button on an empty root.
The shape itself is the button. Nothing else to wire up.
A Toggle adds an Off | On bar above the state tabs, so the unchecked and checked looks are authored separately. Off/Normal is the base; On/Normal is the checked resting look.
An On state falls back to On/Normal, then to the matching Off state, then to the base, so you only override what actually differs when checked. Checking cross-fades with the same Transition Duration, including changes made from code or by a Toggle Group.
Adding a Toggle also creates a child Checkmark shape driven by the same Toggle. That's the pattern for any shape checkmark: give the child the same Toggle as its Selectable and author its On and Off looks.
The track, the Fill and the Handle are three separate shapes, each with its own effects and state looks. Style the handle on its own to make it stand out on hover.
Same split as the Slider: a track shape and a Handle shape. Unity resizes the handle to match how much content fits, so leave its length to the Scrollbar and style the rest.
The closed control and the drop-down list are separate hierarchies. The list's Template and its Viewport are ordinary shapes, and each row carries its own Toggle, so a row has the full Off and On columns: On is the currently chosen option.
The shape is the text box. While the field has focus it sits in the Selected state, which is where a focus ring or a brighter outline goes.
A Scroll View has no Selectable of its own, so its background shape has no state tabs. Its scrollbars do, and its Viewport uses Soft masking, so the corner radius you give the viewport is the shape the content clips to.
When a button inverts its fill on hover, its label often needs to change with it to stay readable. Text Transitions applies the shape's states to the TextMeshPro labels on it and beneath it. It sits at the bottom of the inspector, once a Selectable is assigned.
Each label gets its own module there, appearing and disappearing as you add and remove labels.
| Property | What it does |
|---|---|
| Text Color | The color the label takes in this state. |
| Font Style | B bold, I italic, U underline, S strikethrough, and ab lowercase, AB uppercase, SC small caps, the same buttons TextMeshPro itself uses. |
| Spacing | The character, word, line and paragraph spacing the label uses in this state. |
| Offset | Moves the label, in canvas units. |
| Rotation | Turns the label, in degrees. |
| Scale | Resizes the label. 1 is its resting size, 1.05 is five percent bigger. Text stays crisp at any scale, and the line breaks don't move. |
Color, font style and spacing are the label's actual values: a state sets what the label is, and the Normal tab shows what it already holds. Offset, Rotation and Scale work like the shape's own Transform settings instead, as changes on top of the label's Rect Transform, so you can still move or lay the label out afterwards and every state keeps working.
Text Color, Offset, Rotation and Scale cross-fade with the shape over Transition Duration. Font Style and Spacing snap instead, because changing either makes the label lay itself out again, which is fine once per state change but too expensive every frame of a fade.
Any tab, Normal or a state, can save its settings as a style asset and load them onto other shapes. The Style field at the top of each tab is the picker.
.asset file and loads it.A style saved from Normal is a complete look, so loading it onto a state tab overrides every property there. A style saved from a state tab stores only that state's overrides. Load it onto another button and it changes just those properties, leaving the rest to follow that button's own Normal. That's what makes one shared hover or pressed style work across buttons that look nothing alike.
Styles are an authoring tool. The link between a shape and its style is an editor one, so it costs nothing in a build and deleting a style asset never breaks a shape. To swap looks at runtime, keep a reference to the asset and call shape.ApplyStyle(asset), which copies its settings across without changing the asset.
Every setting is a plain serialized field, so the Animator can drive it directly: corner radius, colors, shadow distance, anything. Animated values sit under state overrides, so animation drives the base look and states override on top.
From code, every setting is a property in the PrizmGames.UIShapes namespace. Set one and the shape updates itself, with nothing else to call:
using PrizmGames.UIShapes;
var shape = GetComponent<UIShape>();
shape.CornerRadius = 24f;
shape.FillColor = Color.white;
shape.Glow = true;
shape.DropShadowOpacity = 0.6f;
shape.BorderMode = BorderMode.Round;
shape.CornerStyle = CornerStyle.Squircle;
shape.Progress = true; // radial timer
shape.ProgressAmount = timeLeft / duration;
Each property is named after the field it matches in the inspector, and your IDE shows the same description as the tooltip.
From code you change how the shape looks now. The per-state looks a Selectable drives are authoring data: build those on the state tabs, or in a style asset, and they blend on top of whatever you set.
Two things are free, so you can write the straightforward code:
Each enabled effect draws one quad in a single pass, and effects of the same kind batch together across the whole canvas. However many shapes a canvas holds, it costs at most one draw call per kind of effect in use. There are no blur passes, no render textures and no per-frame memory churn.
On PC, Mac, PlayStation and Xbox, UI Shapes is not a budget item. Every effect is too cheap to time reliably there, and that holds when you stack effects on a shape or fill a screen with shapes. Even Background Blur, the one effect worth thinking about on mobile, disappears into the noise at every quality setting.
Design for looks first. The charts below are for mobile and Switch, on a deliberately unforgiving scale. An orange bar means "the most expensive thing in this asset", not "expensive".
Typical UI built with UI Shapes, as a share of a frame's GPU budget. Here the full track is the whole frame, so short bars are the point:
Mobile and Switch have real budgets, so the rest of this section is written for them. The guidance is simple, and following it costs you nothing visually.
Relative GPU cost of each effect on its own, on a mobile-class GPU:
Bevel is the heaviest of the ordinary effects, because it draws two quads: a highlight and a shadow. Drop Shadow and Inner Shadow cost in proportion to their Radius, so read them as one band rather than a ranking. A shape with both Fill and Inner Shadow costs less than the two bars added together, because the two are drawn as one. Glow is the cheapest of the soft effects: per pixel it costs about the same as a plain Fill, though it still covers more ground as its Radius grows. Everything below Bevel is cheap enough to use freely at ordinary button and card sizes, even on mobile.
Slanting a shape is free. The slant is built into the shape's geometry, so it draws at the same cost as the upright version and the chart above applies to it unchanged.
Leave it off on effect-heavy mobile and Switch screens, and on any shape whose slant is gentle enough that you can't see the difference.
A Mirrored or Custom slant costs a little even with the setting off, because the shape narrows across its width. A Parallel slant is free either way.
Blur is the one effect that can dominate a mobile frame. On PC and console it's free in practice, but on a mobile-class GPU, Switch included, a large panel can cost more than every other effect combined. Your levers, in order of impact:
Blur suits menus and dialogs on any platform. Budget it before putting it on a permanent HUD.
On the same scale as the chart above:
Effects add up, plus a little: six on one shape cost about half again as much as the same six spread out, because each is another transparent layer over the same pixels. Two effects on many elements is cheaper than six on a few.
| As you add shapes | What happens |
|---|---|
| CPU | Flat. Going from a handful of shapes to a screen full of them, with all of them animating a color every frame, does not move CPU time noticeably. |
| Draw calls | Nearly flat. Shapes using the same effect batch together, so a screen of overlapping three-effect shapes adds far fewer batches than shapes. |
| GPU | Adds up with painted area. Transparent UI never occludes, so every effect pixel is paid for whether it ends up visible or buried. |
The count of shapes is rarely the problem. The total area your effects paint almost always is. A drop shadow on every row of a long list is the classic way to run out of budget on mobile; the same shadow on the list container costs a fraction of it.
| Symptom | Fix |
|---|---|
| "Shader not found" in the console | The files under UI Shapes/Shaders/ were moved or deleted. Reimport the package. |
| Background Blur does nothing on URP | Add the UI Shapes Background Blur Feature to your URP Renderer asset. The inspector shows the same reminder. |
| Background Blur shows a sharp background | Unity cached a stale shader compile. Right-click UI Shapes/Shaders and choose Reimport. |
| Background Blur doesn't blur other UI on URP / HDRP | By design, since the capture is taken after the camera finishes. Only Built-in blurs same-canvas UI. |
| Effects invisible in VR | The canvas is Screen Space – Overlay. Switch it to World Space. |
| Button states don't apply in play mode | Check that a Selectable is assigned and its own Transition is None. The inspector hints at both. |
| TMP text isn't clipped by a Soft mask | The TMP integration compiles only when a TMP package is installed. Check that TMP is present in the project. |
| Soft-clipped TMP text is missing bevel / glow / lighting | By design: clipped text uses a Mobile Distance Field shader, which keeps face, outline and underlay. Use Simple masking if you need the full feature set. |
| A child Image or RawImage isn't soft-clipped | Graphics with a custom material are skipped deliberately. Remove the custom material, or use Simple masking. |
A child isn't clipped by Simple masking, Mask or RectMask2D | Check Maskable on that child. Stencil and rect clipping only apply to graphics that have it on. |
Hidden objects named [UIShape] … | The internal effect renderers. They're never saved into your scene or prefab and rebuild automatically, so don't edit them. |
The UI Shapes folder is also a UPM package (com.prizmgames.uishapes). To reference it from another project, add this to that project's Packages/manifest.json:
"com.prizmgames.uishapes": "file:../path/to/UI Shapes/Assets/UI Shapes"
Questions, bug reports and feature requests are all welcome. Email support@prizmgames.net.
For a bug report, please include your Unity version, the render pipeline you're using (Built-in, URP or HDRP), the UI Shapes version, and the steps to reproduce the problem. A screenshot or a small repro scene helps a lot.