CubiLink is a BepInEx plugin that tracks animations in Unity games and turns their movement into T-Code/SR6 device output. It’s based on Gohyrt’s Live2D-to-SR6-Motion plugin.
It can detect animation values from Live2D, Spine, and regular Unity Transform animations, then lets you bind those values to motion axes like stroke, roll, pitch, twist, etc.
The basic idea is:
- Pick an animation parameter that moves with the scene.
- Bind it to an axis.
- Adjust the range until the device movement matches the animation.
- Save the setup as a template and connect your device.
Main Features
- Supports multiple animation types
- Live2D / Cubism
- Spine
- Unity Transform animations
- In-game parameter picker
- Search animation parameters
- See live values and movements
- Filter for moving or newly appearing parameters
- Use the live graph/trace window to inspect parameter movement over time
- Parameter highlighter
- Hover a parameter to see which character part it likely affects
- Helps identify useful animation values faster
- Axis mapping
- Bind animation parameters to SR6/T-Code axes
- Adjust Min / Max, Invert, Multiplier, Offset, and Smoothing
- Lock ranges or let CubiLink auto-detect the range while the animation plays
- Limit the final output range per axis
- Multi-Bind
- Lets one axis use multiple animation parameters
- Useful when different poses/scenes need different parameters for the same axis
- Each rule can have its own priority and optional activity condition
- The highest-priority active rule drives the axis
- Rules can override Min / Max, Invert, Multiplier, and Offset
- Built-in expression system
- Use formulas instead of fixed numbers for Min / Max / Multiplier / Offset
- Can also be used inside Multi-Bind, Auto-Load and Script-Override rules
- Useful for conditions/detections, offsets, scaling, range conversion, and combining parameters
- Auto-Load
- Switch templates by scene, object, animation, expression, or log message
- Shows currently detected scene/object/animation values in the UI
- Expression rules can switch templates based on parameter state or movement
- Script Overrides
- Play custom
.funscriptfiles fromBepInEx\config\CubiLink\Scriptsbased on set conditions - Useful for scripted moments where visual animation slows down, or more unique scripts are preferred
- Can target all axes or specific ones
- Supports Once/Loop playback and rule priority
- Play custom
- Templates
- Save mappings per game, character, or scene
- Import/export templates and template packs
- Makes it easy to share ready-to-use layouts with other users
- Default location:
BepInEx\config\CubiLink
- Output modes
- Serial T-Code
- UDP T-Code
- Intiface websocket (Buttplug)
- Optional recording
- Record enabled axis movement and export as multi-axis funscripts
- Default folder:
BepInEx\config\CubiLink\Recordings
- Improved UI
- Scalable and transparent UI
- Collapsible sections
- Different Layout modes
- Resizable picker / graph / expression windows
- Unsaved changes indicator
- Mouse UI mode to unlock the cursor and block game mouse input while using the plugin
Example: Griffith’s Paizuri Simulator - Full Template
Notes
- CubiLink is for Mono Unity games using BepInEx (currently does not support IL2CPP games).
- Spine and Unity Transform support are new and may need more testing.
- Older Mono Unity games (Unity 2017 / .NET 3.5-era) may require the separate Legacy Build.
How To Use
- Install BepInEx for the game you want to use it with.
Usually this means extracting BepInEx into the game folder where the.exeis located.
- Start the game once after installing BepInEx.
This should create the requiredBepInEx\..directories and config structure if everything works.
- Copy the plugin
CubiLink.dllinto:BepInEx\plugins(use thelegacyversion for older games, if the main one doesn’t work)
- The plugin UI should now show up on game start.
- In Options, choose an output mode:
- Serial: COM port, for example
COM4 - UDP: host and port, for example
127.0.0.1:7777 - Intiface: websocket address, for example
ws://127.0.0.1:12345
- Serial: COM port, for example
- Create a new template or use the default one.
Templates let you save different mappings for games, characters, or scenes.
You can also import/export templates shared by other user.
Default location\BepInEx\config\CubiLink
- In the Axis Mapping section, click the parameter button for an axis you want to bind:
- search for parameters by name
- freeze sorting if the list changes too fast
- hover over parameters to highlight likely matching model parts
- use the live values / graph to see how a parameter behaves
- right click a parameter to open its trace graph
- left click a parameter to bind it
- After binding a parameter, adjust:
- Min / Max
- Multiplier
- Offset
- Invert if needed
- You can temporarily disable individual axes (On/Off button), which will also exclude them from funscript recording.
- Set Global Smoothing and Target Hz based on your device/preference.
- Use Range Lock depending on what you want:
- Range Locked = keeps your range settings fixed
- Range Learning = automatically records motion range while the model is moving
- Save Current Configuration when you are happy with the setup.
Expression System
CubiLink includes a small formula system for advanced setups.
Instead of only entering fixed numbers, you can use the game parameters and formulas in fields like Min, Max, Multiplier, Offset, and Multi-Bind rule settings. This can help when a game needs extra logic, scene-state checks, parameter mixing, or dynamic offsets.
Most users do not need expressions at first, but they can be very useful for more complex templates.
More Info
Expressions become useful when you want to:
- only move during a specific animation state
- combine multiple animation parameters
- change offset or multiplier depending on the pose
- make Multi-Bind rules more selective
- trigger Script Overrides
- switch templates with Auto-Load expression rules
- convert one parameter range into another
- check if a parameter exists or moved recently
- check detected scene/object/animation names
- react to recent Unity/BepInEx log messages
Simple examples:
Use half of a parameter value:
p_ParamPiston / 2
Only move when another parameter is active [condition, valueIfTrue, valueIfFalse]:
if(p_ParamBodyForward == 0, p_ParamPiston / 2, 0)
This uses ParamPiston / 2 only while ParamBodyForward is 0. Otherwise it returns 0.
Check if a parameter moved recently [parameter, moveDistance, timeMs]:
movingMs(p_ParamPiston, 0.5, 500)
Returns 1 if ParamPiston moved by at least 0.5 within the last 500 ms.
Check the current motion amount [parameter, frames]:
motion(p_ParamPiston, 10)
Returns the recent movement amount of ParamPiston over the last 10 frames.
Check if a parameter currently exists [parameter]:
exists(Spine:Character/Index_L_03 Rotation)
Returns 1 if that parameter is currently available, otherwise 0.
Check detected scene/object/animation names [pattern, optionalPrefix]:
scene(Cowgirl) && animation(Loop)
Returns 1 when the detected scene contains Cowgirl and the detected animation contains Loop.
Prefix matching example:
scene(HScene_, 1)
Returns 1 only when the scene name starts with HScene_.
Check a recent log message [pattern, optionalTimeMs, optionalPrefix]:
log(Finish開始)
Works like a one-time trigger when that exact log message is received.
Keep a log condition active for a short time:
log("eventCG2_natsu_event_03 eventObject", 5000, 0)
Returns 1 for 5000 ms after a matching log line appeared.
Prefix log matching:
log("changeMotion:", 1000, 1)
Returns 1 for 1000 ms when a recent log line starts with changeMotion:.
Convert one range into another [value, oldMin, oldMax, newMin, newMax]:
map(p_ParamPiston, 0, 2, 0.3, 0.8)
Turns ParamPiston from the range 0..2 into 0.3..0.8.
Clamp a value into a range [value, min, max]:
clamp(p_ParamPiston, 0, 1)
Keeps ParamPiston between 0 and 1.
Check if a value is inside a range [value, min, max]:
between(p_ParamPiston, 0.2, 0.8)
Returns 1 if ParamPiston is between 0.2 and 0.8.
Conditional value [condition, valueIfTrue, valueIfFalse]:
if(p_ParamState > 0, 0.8, 0.5)
Returns 0.8 when ParamState > 0, otherwise 0.5.
Useful operators:
+ - * /, > < >= <=, == !=, and/&&, or/||, not/!
Useful helpers:
exists, value, scene, object, animation, anim, log, moving, movingMs, motion, motionMs, between, map, clamp, min, max, abs, if
A full expression guide can be found here.
If you like this tool, consider supporting me on Patreon
Game Templates Collection
Community-shared templates from this thread.
Changelog
- 16.05.2026 - v3.3.2 Workflow Update
- Improved template workflow
- Added adjustable template list height
- Template changes are now tracked more globally instead of only per-axis template edits
- Switching templates now keeps unsaved local edits staged in memory
- Renaming templates updates linked Auto-Load rule targets where applicable
- Implemented drag / ordering controls
- Added drag handles for reordering templates
- Added drag handles for Auto-Load rules
- Added drag handles for Script Override rules
- Hovering drag handles now highlights the affected row more clearly
- Added axis range learning lock
- Each axis can now be locked/unlocked individually
- Locked axes are ignored by Range Learning
- Useful when you only want to learn the range for specific axes without changing already-tuned ones
- Improved Script Overrides
Oncerules now play the full selected funscript after triggering by default- Added
Cutoption for rules to stop playback when the condition becomes false Looprules continue to repeat only while the condition stays true
- Expanded expression support
- Added
log(pattern, ms, prefix)helper for checking recent Unity/BepInEx log messages log(...)can be used in Script Overrides, Auto-Load expression rules, Multi-Bind conditions, and normal formula fields- Quoted log patterns can now contain commas, for example
log("changeMotion: 0, 0", 5000)
- Added
- Improved Auto-Load
- Auto-Load rules are included in template exports for sharing
- Auto-Load rule template selection works better with larger template lists
- Improved rule editing and layout behavior when many rules are present
- Improved axis behavior
- Disabled-axis Preview no longer changes the axis Offset value
- Turning an axis back on keeps the original Offset intact
- Improved visual indication when an axis is script-overridden
- Multi-Bind will now show if option is turned off
- Improved Global Axis Output Range
- Added Tools option to override final output range for all axes/templates
- Per-axis
Outvalues are preserved, but grayed out while the global override is active
- Improved Auto-Load rule creation
- New Auto-Load rules now automatically select the next template in list, making sequential template setup faster
- Fixed Script Override dirty-state behavior
- Opening the Script Overrides section no longer changes rule state by itself.
- Saving from the Script Overrides/Automation area should now clear unsaved changes correctly.
- Other UI and performance improvements
- Improved template workflow
- 14.05.2026 - v3.3.0 Switch
- Added selectable UI layout modes
- New Tabbed layout separates Setup, Mapping, Automation, and Tools
- Added Classic layout for users who prefer the older single-page view
- Layout preference is saved automatically
- Improved header/status area
- Header now shows the CubiLink name/version directly
- Current selected template is always visible
- Unsaved template changes are shown next to the template name
- Runtime bridge details moved into the Runtime tooltip
- Improved template sharing
- Exported templates now include automation/playback behavior
- Multi-Bind settings, Auto-Load rules, Script Override rules, formulas, and related settings are included
- Script-Override .funscripts are embedded into exported templates when available
- UI polish
- Updated layout toggle styling
- Improved save/layout controls
- Cleaned up status/header spacing
- Added selectable UI layout modes
- 13.05.2026 - v3.2.0 Keeping Tabs
- Main UI Overhaul
- Added main tabs for Setup, Mapping, Automation, and Tools
- Moved Save into the tab bar so it stays accessible from every page
- Improved section spacing and visual hierarchy
- Improved button hover/readability styling
- Gave picker toggles clearer active-state feedback
- Other minor improvements
- Added Tools / Utility page
- Added quick buttons for config, recordings, and script folders
- Added Reset UI action
- Performance improvements
- Cached picker row display/detail strings until the parameter list changes
- Reduced repeated text/detail rebuilding while scrolling or updating the picker
- Avoided rendering the embedded parameter list while its pop-out picker is open
- Kept picker refresh append-based so new parameters can appear without full list rebuilds
- Main UI Overhaul
- 11.05.2026 - v3.1.3 Bug fixes
- Fixed parameter picker GUI errors caused by mismatched IMGUI layout/repaint rows.
- Improved picker performance with large parameter lists by only drawing visible rows.
- Fixed Auto-Load rule list usability with many rules.
- Auto-Load rules now use their own scroll area.
- Long rule lists no longer push the rest of the plugin UI out of reach.
- 10.05.2026 - v3.1.2 Improvements
- Improved range learning
- Fixed cases where Range Learning could visually remain enabled but behave like Range Locked after switching parameters
- Range Learning now starts from the current raw value and expands to the detected min/max movement peaks
- Better handling for fully negative parameter ranges, such as
-20to-10
- Added extra Live2D visual parameters
- Added optional Cubism Part/Drawable based values for games where normal Cubism parameters are not useful enough
- Added Bounds / position / opacity style visual values where available
- The Simple toggle can hide these extra Live2D visual entries when they clutter the picker
- Improved Live2D highlighter
- Better scoring for common parameter names
- Reduced incorrect fallback highlights
- Improved Spine parameter detection in games with many active/static Spine objects
- CubiLink now prioritizes visible/animated Spine skeletons instead of relying on Unity’s object order
- Fixes cases where only static parameters appeared and animation-loop parameters were missing
- Slightly increased the Spine skeleton scan cap from 4 to 6
- Added a small diagnostic log showing which Spine skeletons were selected during scan
- Improved range learning
- 09.05.2026 - v3.1.0 Automation & Script Overrides
- Added Script Overrides
- Play selected
.funscriptfiles fromBepInEx\config\CubiLink\Scripts - Rules can target all axes or a specific axis
Whenexpression decides when a script starts/stopsOnceplays once when the condition becomes trueLooprepeats while the condition stays true- Script output overrides normal parameter / Multi-Bind output for the selected axis
- Highest priority active script rule wins per axis
- Recording/export captures active script override output
- Play selected
- Expanded Auto-Load
- Added rule types for Scene, Object, Animation, Expression, and Log
- Added current detection readout for scene/object/animation
- Added rule type and template dropdowns
- Added expression-based template switching for games where scene/object/animation names are unreliable
- Record / Export Info
- Added clearer tooltips for recording and cleanup settings
- Bug fixes / polish
- Fixed mode selection dropdown overlap/input issues
- Improved range learning for negative-only parameter ranges
- Improved output preview behavior for negative Live2D ranges
- Fixed expression editor parameter selection offset
- Added Script Overrides
- 07.05.2026 - v3.0.0 Expand
Thanks @akiyama for suggesting many of these features and testing them!- Added Spine animation support
- Detects Spine skeletons in supported Unity games
- Creates usable virtual parameters from bones and animation movement
- Includes rotation, world movement, distance, and delta movement style values
- Added Spine-focused parameter highlighting / slot isolation where possible
- Added a simpler Spine parameter list option for easier browsing
- Added Unity Transform animation support
- Detects animated Transform hierarchies in non-Live2D games
- Creates virtual parameters from position and rotation movement
- Improved delayed scene scanning so parameters appearing after scene load are not missed
- Better handling for parameters that appear/disappear during animation changes
- Added native Multi-Bind
- Multiple parameters can drive one axis
- Priority decides which active rule wins
- Optional activity/condition parameter per rule
- Per-rule Min / Max / Invert / Multiplier / Offset
- Supports formulas in rule fields
- Copy/paste Multi-Bind rules between axes
- Currently active rule is highlighted in the UI
- Added native Auto-Load
- Automatically switches templates by Unity scene name
- Can also switch templates by matching log output
- Useful for games with separate scenes, poses, or animation states
- Improved parameter picker
- Added pop-out resizable picker window
- Added “New” filter for parameters that appear after opening the list
- Added “Mark Old” to reset the new-parameter baseline
- Added optional movement bars for quick visual comparison
- Added optional reference range for picker indicators
- Added copy button for parameter names
- Added
+Mbutton to send parameters directly to Multi-Bind - Improved list refresh behavior while the picker is already open
- Improved parameter detection and naming
- Better unique names for Spine and Unity Transform parameters
- Better handling for duplicate/simple parameter names
- Improved support for full
Spine:andUnity:parameter names in formulas - Reduced cases where active raw values existed but output did not update correctly
- Improved scene scanning and performance
- Reduced repeated full scans
- Appends newly found parameters instead of constantly rebuilding the list
- Better warmup scanning for scenes where animation objects load late
- Lower overhead when the parameter list is open
- Expanded expression support
- Expressions can be used for Min / Max / Multiplier / Offset
- Expressions can be used in Multi-Bind fields
- Added helper functions such as
exists,value,moving,motion,movingMs,motionMs,between,map,clamp,min,max,abs,if, andnot - Added support for
!,&&,||,and, andor - Added better formula validation
- Added improved helper UI and tooltips
- Improved handling of full Spine / Unity parameter names with spaces and special characters
- Improved UI and workflow
- Added resizable pop-out windows for the parameter picker, graph, and expression editor
- Added clearer Multi-Bind editor window
- Added better parameter copy/selection workflow
- Improved tooltip positioning
- Improved spacing and scrolling in larger UI sections
- Added hotkeys for Menu, Pause, and Mouse UI mode
- Added Mouse UI mode to unlock the cursor and block game mouse input while using CubiLink
Escnow cancels accidental hotkey rebinding- Default UI transparency adjusted
- Improved axis panel layout and borders
- Added tooltips for several newer controls
- Added Legacy Build
- Separate build for older Mono Unity games
- Intended for Unity 2017 / .NET 3.5-era games where the normal build cannot load
- Added Spine animation support
- 19.04.2026 - v2.6.3 Preview fix
- Fixed preview/debug not matching actual sent output in some formula-driven cases
- Fixed preview/debug not matching actual sent output in some formula-driven cases
- 16.04.2026 - v2.6.2 UI fix
- Fixed UI preview bars not matching actual T-Code output (D4 range)
- Fixed UI preview bars not matching actual T-Code output (D4 range)
- 12.04.2026 - v2.6.1 UI & Perf
- Improved UI behavior across templates
- Template UI now acts as a baseline instead of resetting layout on every switch
- Prevents window position/scale from jumping between templates
- Improved performance
- Reduced unnecessary scene rescans
- Lower overhead while menu is open
- Faster reaction on scene changes
- Added unsaved changes indicator
- Shows when current configuration differs from saved state
- Save button now highlights pending changes
- Per-axis output range control
- Adjust final movement range (0–100%) independently from templates
- Adjust final movement range (0–100%) independently from templates
- Improved UI behavior across templates
- 10.04.2026 - v2.6 SavePoint
- Improved stability of saved configurations (registry / PlayerPrefs)
- Added sanitizing and size limits for saved expressions/functions
- Prevented corrupted saved data from breaking startup
- Reduced unnecessary save operations to avoid slowdowns over time
- Moved config storage from registry (PlayerPrefs) to local file (
BepInEx\config\CubiLink.cfg)
- Improved expression handling
- Missing parameters now default to 0 instead of causing errors
- Improves compatibility of templates across different games
- Fixed UI configuration saving
- “Save Current Configuration” now correctly stores window position, size, and layout
- Resolved issue where outdated values were saved due to GUI timing
- Improved stability during scene initialization
- Reduced error spam and unnecessary re-evaluation loops
- Minor internal improvements and cleanup
- More reliable runtime behavior across different titles
- More reliable runtime behavior across different titles
- Improved stability of saved configurations (registry / PlayerPrefs)
- 09.04.2026 - v2.5.4 Bug fix
- Fixed template export/import not preserving Multiplier and Offset expressions
- Templates now correctly retain formula-based values instead of only exporting evaluated numbers
- Switched T-Code axis output from 0–999 (D3) to proper 0–9999 (D4) range
- Fixed final output scaling so normalized values map correctly to full T-Code range
- Updated Intiface T-Code parsing to match 4-digit (0–9999) values
- Fixed template export/import not preserving Multiplier and Offset expressions
- 05.04.2026 - v2.5.2 UI fix
- Templates section is now collapsible + list has a fixed height / is scrollable.
- Minor layout and readability improvements
- 04.04.2026 - v2.5.1 Serial Improv
- Improved Serial Communication
- Fixed SerialPort compatibility issues in certain Unity runtimes
- Added Win32 fallback for systems where System.IO.Ports is unsupported
- Improved error logging for Serial connections
- Improved Serial Communication
- 03.04.2026 - v2.5 Calculus
- Expression support for Min / Max / Multiplier / Offset
- Adds option to dynamically tune and adjust parameters/axis
- Supports operators:
+ - * / ( ) < > <= >= == != - Cross-parameter reference via
p_ParameterName [value]syntax to set range boarders (e.g.[0])
- Expression support for Min / Max / Multiplier / Offset
- 29.03.2026 - v2.4 Compatibility Fix
- Fixed plugin being unloaded immediately in certain Unity games
- Refactored initialization: runtime now loads on a persistent
DontDestroyOnLoadobject instead of the BepInEx plugin instance - Improved compatibility with games that rebuild or clean up objects during startup
- 28.03.2026 - v2.3.3 Bugfix.
- Fixed reduced movement range during manual animation movement
- Implemented adaptive smoothing
- Fixed issue with some template export on some games
- 28.03.2026 - v2.3.2 Bugfix.
- Fixed recording export issue on some Unity runtimes by replacing unsupported JSON/file write calls with a compatible manual export
- Fixed manual parameter control not reaching full range during playback
- Caused by output being sent before GUI-driven parameter updates were applied
- Adjusted sampling order so manual (input-driven) changes are correctly reflected in device output
- Some more code-cleanup
- 27.03.2026 - v2.3 Rec.
- Added recording functionality to capture motion and export each enabled axis as a separate funscript file.
Note: I tried to build a video recorder into the plugin, but that caused significant performance issues, which were also reflected in the recordings.
For now, it is recommended to use an external screen recorder if a video is needed alongside the scripts.
- Added recording functionality to capture motion and export each enabled axis as a separate funscript file.
- 25.03.2026 - v2.2 Share & Sync
- Added template import/export for sharing mappings between users
- Can be done per scene or as a full game bundle
- Added collapsible UI sections for better layout
- Improved window opacity handling
- Added option to enable/disable each axis
- Added template import/export for sharing mappings between users
- 24.03.2026 - v2.1 Small Improvements
- Improved asset highlighter to better identify which model part a parameter affects
- Added option to freeze the sorting list in the parameter picker
- Minor Code Improvements
- 22.03.2026 - v2.0 Refactored
- Improved Intiface compatibility across different Unity game runtimes
- Added fallback Intiface websocket transport for games where the normal Buttplug websocket path is unsupported
- Fixed
Newtonsoft.Json/ Buttplug dependency conflicts by merging dependencies into the plugin DLL - Cleaned up and simplified the code structure for easier maintenance.
- 22.03.2026 - v1.5 Universal Live2D
- Added dynamic Cubism discovery and fallback parameter reading for better compatibility across Live2D titles
- Reworked UI layout with scaling support, better scrolling, and improved panel sizing
- Cleaned up transport handling, template loading/saving, and general UI behavior
- 21.03.2026 - v1.4 Comm Patch
- Added safer Intiface connection handling
- Improved disconnect flow to avoid freeze-prone stop handling and added live connection status in UI
- Added support for stroker-devices like the Handy
- 21.03.2026 - v1.2 Initial Release











