Use a menu character preview to show the player’s equipped Items beside the Bag or Equipment UI. In released Ultimate Inventory System Version 1, Menu Character is a scene and prefab pattern rather than a UIS component: a duplicate visual character uses an Equipper, a Unity Camera renders it to a Render Texture, and a Raw Image displays that texture in the menu.

Choose the preview source

Approach Use it when Important tradeoff
Dedicated preview character The menu needs a stable pose, isolated lighting, or a transparent background Recommended. It needs its own visual rig and an explicit reference to the correct player’s Inventory.
Camera on the live character A simple third-person game can show the real character without a duplicate The preview reacts to the world, may be obscured, is unsuitable for many first-person setups, and cannot use an independent menu pose.

The dedicated preview is the more predictable choice. It observes the real Equipment collection; it must not own a second Inventory or save a second copy of the player’s Items.

Before you begin

Complete the normal equipment workflow first:

  • the player has an Inventory with a Bag collection and an Equipment Item Slot Collection;
  • Equipment, its UI, and the player’s Equipper use the same Item Slot Set;
  • equippable Items such as Iron Sword and Fire Wand provide a valid EquipmentPrefab GameObject attribute; and
  • moving an Item into Equipment already updates the player character correctly.

See Equipping Items if this workflow is not working yet.

Build a dedicated preview character

  1. Duplicate only the player’s visible model and Animator hierarchy. Remove gameplay, input, interaction, Inventory, Currency Owner, and saver components from the duplicate.
  2. On the preview Animator, disable Apply Root Motion. Assign a simple idle or menu pose. If the Main Menu sets Time.timeScale to zero, set Update Mode to Unscaled Time so the pose can continue animating.
  3. Add the released V1 Equipper component to the duplicate root.
  4. Set Equipment Item Collection ID to the player’s Equipment collection. The V1 default is name Equipped with purpose Equipped; change the name to Equipment when that is the collection’s actual name.
  5. Keep Equipable Prefab Attribute Name as EquipmentPrefab. Keep Usable Item Prefab Attribute Name as UsableItemPrefab only when the preview also needs that functional prefab. If gameplay Items define UsableItemPrefab but the preview should create only their models, point the preview Equipper at a separate optional attribute name that those Items do not define, or use a display-only Equipper subclass.
  6. Assign the same Item Slot Set used by the player’s Equipment collection. The Inspector builds Item Object Slots from that asset.
  7. Select each Item Object Slot. For a rigid Iron Sword or Fire Wand, leave Skinned Equipment off and assign the hand socket to Transform. For rigged clothing, enable Skinned Equipment and use matching, uniquely named bones.
  8. Leave each slot’s Item Object empty before Play Mode. It reports the spawned object at runtime. Use More Options > Hide When Wearing Equipment only for model parts that should disappear while that slot is occupied.
  9. Skinned Mesh Character is enabled by default. Assign Main Root Node, or let the Equipper find it from a child Skinned Mesh Renderer. Disable this option when the preview has no skinned bone hierarchy.

The Equipper does not choose an animation or pose. Keep that responsibility in the preview Animator rather than adding gameplay animation logic to the menu model.

Bind the correct Inventory owner

For a scene-owned single player, drag the active player’s Inventory component into Equipper > Inventory. Do not leave the field empty on a separate preview object: the V1 fallback searches only the Equipper’s own GameObject.

UIS panel ownership and preview ownership are related but separate:

Setting V1 default What it controls
Inventory Identifier > ID 1 Registers the player’s Inventory owner for lookup. The ID must be nonzero and unique.
Display Panel Manager > Panel Owner None Receives panel and input events and supplies the owner to supported UI bindings.
Panel Owner Inventory Identifier ID 1 Resolves Panel Owner when it is not assigned directly.
Equipper > Inventory None Supplies the Equipment collection shown by this preview. It does not bind automatically from Panel Owner.

When the player is spawned at runtime, assign the resolved player’s Inventory before the preview Equipper reaches Start, then enable the preview. If the UI exists first, Dynamic Panel Owner can assign the Display Panel Manager when the player appears, but a small project-specific preview binder must still pass that owner’s Inventory to the preview Equipper. DisplayPanelManager.OnPanelOwnerAssigned is the useful notification for that binder.

For split-screen, give each player a unique Inventory Identifier ID and a matching Display Panel Manager ID. Use one preview character, Camera, Render Texture, and Raw Image per player. Sharing the preview or Render Texture allows the last rendered or last bound player to replace the other player’s view. See Split Screen Co-op UI for the complete ownership setup.

Render the preview in the menu

  1. Put the preview character on a dedicated layer that the gameplay Cameras do not render.
  2. Choose Create > Render Texture in the Project window and set a size appropriate for the menu panel.
  3. Create a Camera for the preview, frame the character, restrict Culling Mask to the preview layer, and assign the Render Texture to Target Texture.
  4. For a transparent result, use a solid camera background with alpha 0. The exact camera background label differs between the Built-in Render Pipeline and Scriptable Render Pipelines.
  5. Add a Raw Image to the Main Menu and assign the same Render Texture to Texture. Turn off Raycast Target when the preview should not receive pointer input.
  6. Keep the preview rig outside the gameplay area or otherwise isolate its lighting and shadows. Layer isolation is safer than relying on distance alone.

The Main Menu UI Designer creates menu panels and bindings, but it does not create this character-preview rig. Add the Raw Image and preview objects after the menu structure is in place.

How it runs

At startup, the preview Equipper resolves its assigned Inventory and finds the configured Equipment Item Slot Collection. It creates representations for Items already equipped, then listens for Inventory add and remove events. Moving Iron Sword into Equipment creates the sword model in the matching Item Object Slot; moving it out removes that model.

The Camera writes the settled preview to the Render Texture and the Raw Image displays it. UIS does not automatically turn the preview Camera, rig, or Animator on and off with the panel, so projects that need the optimization should connect that lifetime to their menu open and close workflow.

Editor checkpoint

Before entering Play Mode, confirm that:

  • the preview contains visual and Animator components but no second Inventory or saver;
  • Equipper > Inventory resolves the intended player before the Equipper starts;
  • Equipment Item Collection ID matches an Item Slot Collection on that Inventory;
  • the preview Equipper, Equipment collection, and Equipment UI use the same Item Slot Set;
  • every rigid slot has the correct Transform, and skinned equipment has a valid Main Root Node;
  • the preview Camera renders only the preview layer into Target Texture; and
  • the Raw Image uses that same Render Texture.

Verify in Play Mode

  1. Start with Iron Sword in Bag and its Equipment slot empty. Open the Main Menu and confirm that the correct player’s preview appears without a sword.
  2. Equip Iron Sword. Confirm that one sword appears at the intended hand socket without changing the live player’s Inventory twice.
  3. Unequip it. Confirm that the preview removes the sword and restores any objects configured under Hide When Wearing Equipment.
  4. Equip Fire Wand and confirm that its own EquipmentPrefab appears in the same compatible slot.
  5. Close and reopen the Main Menu. Confirm that the preview still shows the current Equipment state.
  6. When the menu pauses scaled time, confirm that an Animator using Unscaled Time continues the intended menu pose.
  7. In a runtime-spawn or split-screen test, open each player’s menu and confirm that its preview follows only that player’s Equipment.

Troubleshooting

Symptom Check Fix
The preview fails during startup Equipper > Inventory is empty and the preview has no Inventory on the same GameObject Assign the real player’s Inventory before the Equipper starts.
The character appears but equipped Items do not Equipment Item Collection ID, collection type, and Item Slot Set Point the Equipper at the correct Equipment Item Slot Collection and use the same slot set throughout.
An equipped Item logs a prefab error EquipmentPrefab, or an optional UsableItemPrefab defined with a null value Assign a valid Equipment prefab. Remove the optional usable-prefab attribute when the preview does not need it, rather than leaving its value null.
The preview creates an unwanted functional weapon object Usable Item Prefab Attribute Name resolves the gameplay Item’s usable prefab Use a separate undefined optional attribute name for the display-only Equipper, or a project-specific display-only subclass.
A sword appears at the character origin The matching Item Object Slot’s Skinned Equipment and Transform Keep a rigid weapon unskinned and assign the intended hand socket.
Skinned clothing is missing or distorted Main Root Node, bone names, and the slot’s Skinned Equipment option Use matching uniquely named rigs and the correct character root node.
The preview shows another player’s equipment Panel Owner, Inventory Identifier ID, and the Inventory assigned to the preview Equipper Bind each preview explicitly to its matching player; Panel Owner alone does not rebind Equipper.
Both split-screen panels show the same image Preview rig, Camera, or Render Texture is shared Give each player a separately bound preview and output texture.
The preview freezes while the menu is open Display Panel Manager pauses scaled time and the Animator uses the normal update mode Set the preview Animator’s Update Mode to Unscaled Time, or do not pause scaled time.
The background is opaque Camera background alpha, render-pipeline camera settings, Render Texture format, and Raw Image color Configure an alpha-capable output and keep the Raw Image color alpha at 1.
The preview is visible in the game world Gameplay Camera Culling Mask and the preview layer Put the rig on a dedicated layer and exclude it from gameplay Cameras.

Developer, save, and network boundaries

Released V1 has no MenuCharacter component and no automatic Panel Owner-to-Equipper binding. EquipperBase stores its Inventory in a protected serialized field and resolves it in Start; it does not expose a public Inventory setter. A runtime owner binder therefore needs a small Equipper subclass or another project-specific initialization path, and it must set the Inventory before the Equipper starts. Rebinding an already started Equipper is a custom lifecycle because the component has already cached the Equipment collection and registered its Inventory events.

DisplayPanelManager.OnPanelOwnerAssigned and the global EventNames.c_OnPanelOwnerChange_GameObjectPanelOwner_DisplayPanelManager event announce a UI owner change. The preview Equipper emits EventNames.c_Equipper_OnChange after an equip or unequip operation. These notifications do not synchronize ownership by themselves.

The preview needs no saver. Save the authoritative player Inventory with Inventory Saver; after loading changes the Equipment collection, the initialized preview follows its normal Inventory events. Do not add an Inventory Saver to a display-only duplicate.

Released UIS Version 1 does not replicate Inventory, Equipment, spawned Item Objects, Cameras, or Render Textures. A networking layer must establish the authoritative Inventory and replicate its Equipment state. Each client can then bind a local preview to the Inventory representation it is allowed to display. Inventory Identifier ID is a local UIS lookup key, not a network object identity.