subtitlesGame Creator 2 Integration

This page documents the Character Creator integration nodes for Game Creator 2.

It explains:

  • What each Instruction, Condition, and Property does.

  • What each field means.

  • Where to get the field values in Unity.

  • Why and when to use each node.

Requirements

  • Game Creator 2 installed.

  • Character Creator runtime components on your character prefab or scene object:

    • EquipmentManager

    • CharacterPresetManager

    • CharacterCreatorDemoUI (only if you use Demo UI binding/rebuild nodes)

  • Define symbol GAME_CREATOR_2_PRESENT enabled.

Using Instantiated Character Prefabs

This is the recommended runtime flow when the character does not exist in scene at design time and is spawned from a prefab.

Core rule

Always use the spawned instance as Character Root, never the prefab asset reference.

The prefab asset is only a template. Character Creator nodes must target the runtime instance that was instantiated by GC2.

1. Prepare the character prefab

On the prefab root, add and configure:

  • EquipmentManager

  • CharacterPresetManager

  • BlendshapeSynchronizer (recommended)

  • BodyPartLengthAdjuster (optional, only if you want body length sliders)

Also ensure:

  • CharacterPresetManager.bodyRenderer is assigned.

  • EquipmentManager.equipmentPrefabs contains all equipable entries you need at runtime.

  • If you use material color saving/loading, CharacterPresetManager tracking/slots are configured.

2. Spawn and store the runtime instance in GC2

In your GC2 instruction list:

  1. Spawn/instantiate the character prefab.

  2. Store the spawned GameObject into a variable (for example CurrentCharacterInstance).

That variable is what you pass into Character Creator nodes as Character Root.

3. Bind the Demo UI to the spawned instance

After spawn, call one bind instruction:

  • CharacterCreatorDemoUI Bind Character (Root + Rebuild) (recommended)

    • Demo UI: the scene UI object with CharacterCreatorDemoUI

    • Character Root: CurrentCharacterInstance

    • Rebuild UI: true

This is required because the UI is scene-side, while the character is runtime-spawned.

4. Save and load with scoped keys per spawned character

Do not use one global key for all players/NPCs.

Recommended flow:

  1. Build a base key from runtime identity (player ID, network ID, save slot, character ID).

  2. Optionally call CharacterPresetManager Build Scoped Preset Key.

  3. Use resulting key in:

    • CharacterPresetManager Save Preset

    • CharacterPresetManager Load And Apply Preset

    • CharacterPresetManager Delete Preset

Examples:

  • player_01/main_look

  • coop_p2/slotA

  • npc_blacksmith/work_outfit

5. Practical GC2 sequence

  1. Spawn character prefab -> save output to CurrentCharacterInstance.

  2. CharacterCreatorDemoUI Bind Character (Root + Rebuild) with that variable.

  3. Player customizes character.

  4. Save using per-character key.

  5. On load: spawn same prefab again -> bind again -> load/apply same key.

6. Common mistakes

  • Passing the prefab asset to Character Root instead of the spawned instance.

  • Calling save/load/equip before the character is spawned.

  • Forgetting to rebind UI after character respawn or character swap.

  • Reusing one preset key for multiple characters (causes overwrite collisions).

7. If you do not use CharacterCreatorDemoUI

You can still run full customization from GC2:

  • Equip/unequip through EquipmentManager ... instructions.

  • Save/load through CharacterPresetManager ... instructions.

  • Branch via Character Creator conditions/properties.

In that setup, you only need references to managers on the spawned instance.

8. Crystal Save workflow for spawned prefabs (SaveablePrefab + RememberCharacterPreset)

Use this when you want full world-state save/load with Crystal Save and automatic character appearance restore.

Setup on the character prefab root

Add these components on the same prefab root:

  • SaveablePrefab (Crystal Save)

  • CharacterPresetManager

  • RememberCharacterPreset (Character Creator CrystalSave bridge)

Recommended runtime stack on the same prefab:

  • EquipmentManager

  • BlendshapeSynchronizer

  • optional BodyPartLengthAdjuster

Important:

  • RememberCharacterPreset should be on the same object as CharacterPresetManager (it has RequireComponent for this).

  • RememberCharacterPreset is compiled only when Crystal Save remember symbols are present (MEMORYPACK and ARAWN_REMEMBERME).

What gets saved and restored

RememberCharacterPreset captures and restores the full Character Creator appearance in one component:

  • equipped items

  • blendshapes

  • body part scales

  • uniform scale

  • tracked material colors/floats/textures

This means you do not need per-mesh remember components for normal character appearance persistence.

Save/load lifecycle with Crystal Save

On save:

  1. Crystal Save serializes the prefab instance.

  2. RememberCharacterPreset.SerializeComponentData() captures current appearance from CharacterPresetManager.

On load:

  1. SaveablePrefab restores/recreates the prefab instance.

  2. RememberCharacterPreset.DeserializeComponentData() runs and applies the saved appearance back through CharacterPresetManager.ApplyPreset(...).

Respawn/restore option to check

If a prefab instance is destroyed and respawned by restore and you see missing component-state reapply, enable:

  • SaveablePrefab.Apply Saved Component Data On Respawn (on the prefab root)

This helps Crystal Save force component data reapplication for respawned prefabs.

GC2 usage after Crystal Save load

After load, bind the UI to the restored runtime instance:

  • CharacterCreatorDemoUI Bind Character (Root + Rebuild)

Do not bind to prefab assets. Bind to the loaded/spawned instance object.

Also avoid double-spawn flows:

  • if Crystal Save restores the prefab instance, do not also spawn a second copy from your own GC2 startup flow unless intentionally needed.

Named presets vs Crystal Save snapshot

RememberCharacterPreset works even if the player never created a named preset in your preset list UI.

It stores a direct appearance snapshot as component data inside the save game. Named preset files/keys are still optional and can be used in parallel for character slots, loadouts, or user-facing preset galleries.

Where The Nodes Come From

Source files:

  • Assets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Instructions/InstructionEquipmentManagerMethods.cs

  • Assets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Instructions/InstructionCharacterPresetManagerMethods.cs

  • Assets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Instructions/InstructionCharacterCreatorDemoUIMethods.cs

  • Assets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Conditions/ConditionCharacterCreatorQueries.cs

  • Assets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Properties/PropertyCharacterCreatorQueries.cs

Field Source Guide

Use this guide whenever a node asks for references.

Field
What it is
Where to get it
Why it matters

Equipment Manager

GameObject with EquipmentManager

Character root in scene or prefab instance

Needed for equip/unequip and equipment queries

Preset Manager

GameObject with CharacterPresetManager

Same character root (usually)

Needed for save/load/apply preset flow

Demo UI

GameObject with CharacterCreatorDemoUI

Canvas or UI root created by Scene Demo Wizard

Needed to bind/rebuild character customization UI

Gallery UI

GameObject with CharacterPresetGalleryUI

Preset gallery canvas/panel object

Needed for runtime preset gallery manager binding

Equipment Prefab

Equipment prefab reference

Must be one of EquipmentManager.equipmentPrefabs[].prefab

Equip/query functions rely on registered prefab identity

Equipped Object

Runtime equipped instance GameObject

Object currently attached by EquipmentManager

Used by detach-single-item node

Slot

EquipmentSlot enum value

Match slot configured on the registered equipment entry

Determines which equipment category to affect

Character Root

Character GameObject

Spawned player/NPC root at runtime

Used by DemoUI.BindCharacter(root) nodes

Root

Parent GameObject to search in

Usually the spawned prefab instance stored in a GC2 Global Variable

Used by child-lookup properties to resolve nested objects at runtime

Child Name

Name of the child object to find

The GameObject.name in the hierarchy

Resolves specific nested objects from a runtime instance

Search Recursively

Bool flag

Enable for deep hierarchy lookup

Finds nested descendants, not only direct children

Case Sensitive

Bool flag

Enable only if you need strict name matching

Controls name comparison behavior during child lookup

Include Inactive

Bool flag

Enable if target object may be inactive

Allows finding disabled children too

Body Renderer

SkinnedMeshRenderer for body

Character mesh renderer (usually torso/body)

Used for direct component bind variant

Blendshape Synchronizer

BlendshapeSynchronizer component

Character root

Keeps equipped meshes synced with body blendshapes

Body Part Adjuster

BodyPartLengthAdjuster component

Character root (optional)

Enables body length sliders via UI bind nodes

Default Hair Object

Base hair GameObject on character

Usually the character's built-in/default hair object

Auto-shown when no Hair-slot item is equipped

Default Face Object

Base face GameObject on character

Usually the character's built-in/default face mesh/object

Auto-shown when no Face-slot item is equipped

Preset Key

String identifier

Player input, dialogue variable, quest data, save key

Unique key for saving/loading preset files

Preset Name

Display name

Player input field

Human-readable preset label

Cache Slot

Temporary in-memory key

Any string like last, npc01, slotA

Used to pass CharacterPreset objects between nodes

Preset JSON

Serialized preset text

String variable generated externally

Alternative to cache when passing full preset payload

IDs CSV

Comma separated equipment IDs

Build from saved data or variable text

Reapply specific equipped set quickly

Reset Existing

Bool flag

Constant or bool property

Controls append vs rebuild behavior in auto-config nodes

Destroy Loaded Texture / Destroy Captured Texture

Bool cleanup flag

Usually true

Prevents leaked runtime textures when loading/capturing portraits

Use Provider From GameObject

Bool strategy flag

Enable when custom provider component exists

Selects custom provider instead of default JSON provider

Provider GameObject

Object implementing ICharacterPresetProvider

Your custom save backend bridge object

Lets GC2 nodes use your own persistence system

JSON Folder Path

Persistent directory path

e.g. from config variable

Used when selecting default JsonFilePresetProvider(folder)

Instruction Nodes

All instructions are under Character Creator/... categories in GC2 Visual Scripting.

Equipment Manager Instructions

Node
Calls
Key fields
Use this when

EquipmentManager Get Equipped Items

GetEquippedItems(slot)

Equipment Manager, Slot

You need list visibility for a slot (debug/flow checks)

EquipmentManager Toggle Equip Item

ToggleEquipItem(prefab, slot)

Equipment Manager, Equipment Prefab, Slot

You want one button to equip or unequip

EquipmentManager Get Thumbnail Sprite

GetEquipmentThumbnailSprite(prefab)

Equipment Manager, Equipment Prefab

You need icon-style preview sprite lookup

EquipmentManager Get Thumbnail Texture

GetEquipmentThumbnailTexture(prefab)

Equipment Manager, Equipment Prefab

You need texture-level preview processing

EquipmentManager Clear Generated Thumbnails

ClearGeneratedThumbnails()

Equipment Manager

You want to release runtime thumbnail cache

EquipmentManager Get Equipped Equipment IDs

GetEquippedEquipmentIDs()

Equipment Manager

You want an ID snapshot for save/replication

EquipmentManager Set Equipped Equipment IDs

SetEquippedEquipmentIDs(ids)

Equipment Manager, IDs CSV

You want to restore equipment state from stored IDs

EquipmentManager Equip Item

EquipItem(prefab, slot)

Equipment Manager, Equipment Prefab, Slot

You want deterministic force-equip

EquipmentManager Detach Item

DetachItem(equippedObject, slot)

Equipment Manager, Equipped Object, Slot

You want to remove one known equipped instance

EquipmentManager Detach All Items

DetachAllItems(slot)

Equipment Manager, Slot

You want to clear a full slot quickly

EquipmentManager Is Equipment Equipped

IsEquipmentEquipped(prefab, slot)

Equipment Manager, Equipment Prefab, Slot

You need direct yes/no check during instruction flow

EquipmentManager Get Equipped Item

GetEquippedItem(prefab, slot)

Equipment Manager, Equipment Prefab, Slot

You need runtime instance object from prefab+slot

EquipmentManager Is Item Equipped

IsItemEquipped(slot)

Equipment Manager, Slot

You only care whether slot is occupied

EquipmentManager Equip All Items

EquipAllItems()

Equipment Manager

You need quick setup/debug mass equip

Preset Manager Instructions

Node
Calls
Key fields
Use this when

CharacterPresetManager Set Provider

SetProvider(...)

Preset Manager, provider fields

You switch between default JSON and custom backend

CharacterPresetManager Build Scoped Preset Key

BuildScopedPresetKey(key)

Preset Manager, Preset Key

You need namespace-safe key generation

CharacterPresetManager Capture Preset

CapturePreset(name)

Preset Manager, Preset Name, Cache Slot

You need runtime snapshot without saving yet

CharacterPresetManager Capture Preset (Name + Key)

CapturePreset(name, key)

Preset Manager, Preset Name, Preset Key, Cache Slot

You need explicit key-tagged snapshot

CharacterPresetManager Save Preset

SavePreset(key, name)

Preset Manager, Preset Key, Preset Name

You want to persist current appearance

CharacterPresetManager Apply Preset

ApplyPreset(preset)

Preset Manager, source mode fields

You want to apply preset from cache or JSON payload

CharacterPresetManager Load And Apply Preset

LoadAndApplyPreset(key)

Preset Manager, Preset Key

You want one-step load+apply

CharacterPresetManager Get Saved Preset Keys

GetSavedPresetKeys()

Preset Manager

You need current preset list

CharacterPresetManager Load Preset

LoadPreset(key)

Preset Manager, Preset Key, Cache Slot

You want object load for later apply/edit

CharacterPresetManager Delete Preset

DeletePreset(key)

Preset Manager, Preset Key

You want to remove preset and portrait

CharacterPresetManager Auto Configure Explicit Color Slots

AutoConfigureExplicitColorSlots(reset)

Preset Manager, Reset Existing

You want quick auto slot setup from materials

CharacterPresetManager Auto Configure Material Tracking

AutoConfigureMaterialTracking(reset)

Preset Manager, Reset Existing

You want tracked material properties auto-built

CharacterPresetManager Load Portrait By Key

LoadPortrait(key)

Preset Manager, Preset Key, destroy flag

You need portrait texture for UI preview

CharacterPresetManager Load Portrait By Preset

LoadPortrait(preset)

Preset Manager, source mode, destroy flag

You already have a preset object and need its portrait

CharacterPresetManager Capture Portrait

CapturePortrait(key)

Preset Manager, Preset Key, destroy flag

You need portrait capture independent from full save

Demo UI Instructions

Node
Calls
Key fields
Use this when

CharacterCreatorDemoUI Bind Character (Components)

BindCharacter(components...)

Demo UI, component references

You hot-swap characters and wire explicit components

CharacterCreatorDemoUI Bind Character (Root)

BindCharacter(root)

Demo UI, Character Root

You only have root object and want auto component discovery

CharacterCreatorDemoUI Bind Character (Root + Rebuild)

BindCharacter(root, rebuild)

Demo UI, Character Root, Rebuild UI

You need control over immediate UI refresh

CharacterCreatorDemoUI Bind Character (Components + Rebuild)

BindCharacter(components..., rebuild)

Demo UI, component references, Rebuild UI

You need full explicit runtime rebinding

CharacterCreatorDemoUI Set Default Head Meshes

sets defaultHairObject + defaultFaceObject

Demo UI, Default Hair Object, Default Face Object, Rebuild UI

You want to assign/replace base hair and face objects at runtime

CharacterCreatorDemoUI Rebuild UI

RebuildUI()

Demo UI

You changed data and need UI regeneration

Node
Calls
Key fields
Use this when

CharacterPresetGalleryUI Bind Preset Manager

assigns presetManager and optionally RefreshPresetList()

Gallery UI, Preset Manager, Refresh After Bind

You spawn/swap characters at runtime and need the gallery to target the current manager

Condition Nodes

All conditions support normal GC2 If / Not behavior.

Node
Logic
Fields
Why use it

CC Equipment Slot Is Equipped

IsItemEquipped(slot) == expected

Equipment Manager, Slot, Expected

Branch when a slot is empty/full

CC Equipment Prefab Is Equipped

IsEquipmentEquipped(prefab, slot) == expected

Equipment Manager, Equipment Prefab, Slot, Expected

Branch on specific item state

CC Preset Exists

LoadPreset(key) != null compared to expected

Preset Manager, Preset Key, Expected

Branch before load/delete

CC Has Any Saved Presets

GetSavedPresetKeys().Length > 0 compared to expected

Preset Manager, Expected

Branch for empty-state UI

Property Nodes

Use these in GC2 fields that accept dynamic Properties.

Property
Returns
Fields
Why use it

CC Slot Is Equipped

bool

Equipment Manager, Slot

Fast boolean binding for UI/logic

CC Prefab Is Equipped

bool

Equipment Manager, Equipment Prefab, Slot

Toggle buttons by exact item state

CC Equipped Item

GameObject

Equipment Manager, Equipment Prefab, Slot

Access runtime equipped instance

CC Find Child GameObject

GameObject

Root, Child Name, search flags

Resolves a child object from a spawned prefab instance/global variable

CC Equipped IDs (CSV)

string

Equipment Manager

Store/forward equipment snapshot text

CC Preset Exists

bool

Preset Manager, Preset Key

Enable/disable load/delete actions

CC Saved Preset Count

number (double)

Preset Manager

Display count, compare threshold

CC Saved Preset Keys (CSV)

string

Preset Manager

Quick list serialization for external systems

CC Scoped Preset Key

string

Preset Manager, Preset Key

Ensure namespace-consistent storage keys

Cache And JSON Preset Source Modes

Several nodes support preset source modes:

  • Cache: uses an in-memory preset object stored by Cache Slot string.

  • Json: parses a full CharacterPreset JSON string.

Use Cache for local flow in the same runtime session. Use Json when your flow gets preset payload from external systems.

Goal
Recommended flow

Save current look

Build Scoped Preset Key -> Save Preset

Load selected look

Preset Exists condition -> Load And Apply Preset

Runtime character swap

Bind Character (Root + Rebuild) or Bind Character (Components + Rebuild)

Restore equipment from save payload

Set Equipped Equipment IDs

Empty preset gallery handling

Has Any Saved Presets condition

Troubleshooting

Symptom
Likely cause
Fix

GC2 nodes do not appear

GAME_CREATOR_2_PRESENT missing

Recompile after detector runs and verify Player define symbols

Equip/query returns false unexpectedly

Prefab not registered in EquipmentManager.equipmentPrefabs

Register prefab in manager list and match correct slot

Preset apply fails in cache mode

Wrong Cache Slot string

Use same cache slot key in capture/load/apply chain

Portrait operations allocate memory

Destroy flag disabled

Keep destroy flag enabled unless texture must persist

Notes

  • Query-style Instructions currently log results. Use Conditions/Properties for branchable and bindable gameplay logic.

  • Character Creator runtime is not tightly coupled to GC2 save internals. Set Provider supports custom backend bridges.

Last updated