Game 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:
EquipmentManagerCharacterPresetManagerCharacterCreatorDemoUI(only if you use Demo UI binding/rebuild nodes)
Define symbol
GAME_CREATOR_2_PRESENTenabled.
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:
EquipmentManagerCharacterPresetManagerBlendshapeSynchronizer(recommended)BodyPartLengthAdjuster(optional, only if you want body length sliders)
Also ensure:
CharacterPresetManager.bodyRendereris assigned.EquipmentManager.equipmentPrefabscontains all equipable entries you need at runtime.If you use material color saving/loading,
CharacterPresetManagertracking/slots are configured.
2. Spawn and store the runtime instance in GC2
In your GC2 instruction list:
Spawn/instantiate the character prefab.
Store the spawned
GameObjectinto a variable (for exampleCurrentCharacterInstance).
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 withCharacterCreatorDemoUICharacter Root:CurrentCharacterInstanceRebuild 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:
Build a base key from runtime identity (player ID, network ID, save slot, character ID).
Optionally call
CharacterPresetManager Build Scoped Preset Key.Use resulting key in:
CharacterPresetManager Save PresetCharacterPresetManager Load And Apply PresetCharacterPresetManager Delete Preset
Examples:
player_01/main_lookcoop_p2/slotAnpc_blacksmith/work_outfit
5. Practical GC2 sequence
Spawn character prefab -> save output to
CurrentCharacterInstance.CharacterCreatorDemoUI Bind Character (Root + Rebuild)with that variable.Player customizes character.
Save using per-character key.
On load: spawn same prefab again -> bind again -> load/apply same key.
6. Common mistakes
Passing the prefab asset to
Character Rootinstead 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
CharacterCreatorDemoUIYou 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)
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)CharacterPresetManagerRememberCharacterPreset(Character Creator CrystalSave bridge)
Recommended runtime stack on the same prefab:
EquipmentManagerBlendshapeSynchronizeroptional
BodyPartLengthAdjuster
Important:
RememberCharacterPresetshould be on the same object asCharacterPresetManager(it hasRequireComponentfor this).RememberCharacterPresetis compiled only when Crystal Save remember symbols are present (MEMORYPACKandARAWN_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:
Crystal Save serializes the prefab instance.
RememberCharacterPreset.SerializeComponentData()captures current appearance fromCharacterPresetManager.
On load:
SaveablePrefabrestores/recreates the prefab instance.RememberCharacterPreset.DeserializeComponentData()runs and applies the saved appearance back throughCharacterPresetManager.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.csAssets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Instructions/InstructionCharacterPresetManagerMethods.csAssets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Instructions/InstructionCharacterCreatorDemoUIMethods.csAssets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Conditions/ConditionCharacterCreatorQueries.csAssets/Arawn/CrystalCharacterCreator/Integrations/GameCreator2/Properties/PropertyCharacterCreatorQueries.cs
Field Source Guide
Use this guide whenever a node asks for references.
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
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
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
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
Preset Gallery UI Instructions
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.
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.
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 byCache Slotstring.Json: parses a fullCharacterPresetJSON string.
Use Cache for local flow in the same runtime session. Use Json when your flow gets preset payload from external systems.
Recommended Node Patterns
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
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 Providersupports custom backend bridges.
Last updated