CubiLink – Unity Live2D Motion Mapper for Multi-Axis (v2.6.2)

Hey everyone,

I’m sharing my forked version of Gohyrt’s Live2D-to-SR6-Motion plugin.

This release is based on the original plugin, but adds a UI overhaul and a few extra features I initially made for myself, but figured others might also find useful.

Since the original EroScripts post seems to have been deleted by OP for some reason, I’m posting this build in a new topic it remains available to anyone interested.

The creator said that they wanted to keep their version simple and lightweight, so rather than treating this as an update to the original project, I’m releasing it separately as a more feature-rich fork.

Current additions in this version

  • Parameter highlighter to quickly identify which model element a parameter affects
  • Live parameter graph / scope to visualize value changes over time and help find the right parameters
  • Additional output modes, including UDP and Intiface support
  • Dynamic Live2D/Cubism detection for much broader game compatibility
  • UI overhaul
    • Enable/disable individual axes
    • Collapsible sections for better organization
    • Improved preview bar
    • More flexible input fields
    • Scalable UI size
    • Improved transparency handling
    • Show unsaved changes
  • Profile / template import & export
    Easily share mappings between games and scenes
    (Default: \BepInEx\config\CubiLink)
    • Stable local config file (CubiLink.cfg) instead of registry
    • Better cross-game compatibility
  • Recording support
    Exports each individual axis movement as funscripts
    (Default: \BepInEx\config\CubiLink\Recordings)
  • Expression-based inputs
    Use formulas and cross-parameter references to dynamically control axis behavior
  • Global axis output range control
    Adjust per-axis output limits independent from templates
  • Better runtime stability
    • Reduced error spam in unsupported environments
    • Safer initialization across different Unity runtimes

Example: Griffith’s Paizuri Simulator

Notes

  • I haven’t been able to fully test device-side output myself yet.
  • The plugin currently only supports Mono Unity games using the standard Live2D Cubism SDK.

How to use

  1. Install BepInEx for the game you want to use this with.
    Usually this means extracting BepInEx into the game folder where the .exe is located.

  2. Start the game once after installing BepInEx.
    This should create the required BepInEx\.. folders and config structure.

  3. Copy the plugin .dll file into: BepInEx\plugins

  4. The plugin UI should now show up on game start.

  5. In the Options section, select the output mode you want and Connect:

  • Serial: COM port, for example COM4
  • UDP: host and port
  • Intiface: websocket address, for example ws://127.0.0.1:12345
  1. 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

  2. In the Axis Mapping section, click the parameter button for an axis you want to bind.

  3. A parameter picker will open. From there you can:

  • 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
  1. 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.
  1. 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
  1. Adjust Global Smoothing and Target Hz to your preference.

  2. Save Current Configuration when you are happy with the setup.


Changelog

  • 16.04.2026 - v2.6.2 UI fix
    • 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

  • 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

  • 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

  • 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

  • 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])

  • 29.03.2026 - v2.4 Compatibility Fix
    • Fixed plugin being unloaded immediately in certain Unity games
    • Refactored initialization: runtime now loads on a persistent DontDestroyOnLoad object 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.

  • 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

  • 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
26 Likes

I did alot of testing with the older version and I just wanted to add my two cents.

Should be noted that not ALL Mono games with L2D assets. Next we are going to need a list of working games lol. I’ve burned through like 50 and only 3 worked, (the example being one)

These work: (I wont be updating this list lol I’ve done my part)
RJ01313038 がんばれうめちゃん おくちで奉仕
RJ01319890 東京物語:制服の誘惑
RJ01447280 合成×爆乳進化!バニーガールVIPパイズリ! [LAYO]
RJ01308696 羞恥!清楚なお姉さんに健康診断

2 Likes

I assume you tested with an SR6 or another OSR device ?

I tried with The Handy via Intiface but even though it connected it doesn’t seem to work for now. I unfortunately don’t own a multi axis device.

@ZeroScripts Thanks again for this fork and to Gohyrt for the original plugin :+1:
I hope this plugin will make it work with single axis devices if only the l0 axis is bind down the line

Yeah I primary use the SR6 for testing/creating stuff

Thanks for the feedback. Nice to have some other games confirmed working already. The original plugin creator might have plans to improve compatibility with more games too.

The latest version improves the Intiface communication and should also be able to work with The Handy. Though I imagine the movement will be very jittery, since the plugin’s real-time output wasn’t really made with The Handy in mind.

Im still using the previous creators as well as yours, no change since they updated their pateron/github about 15 hours ago.

Between the two compatibility is the same but not everything works. Eh, good enough for patch work.

The Handy is now working after updating/replacing files from the MEGA folder!

It connects via Intiface and responds to Live2D parameters.
Thanks for the great tool—I’ll report back if anything comes up.

1 Like

There’s definitely some issues with the plugin in some games as mentioned. Would be good if there was a way to manually open the overlay or if there was a companion program that could output some debug info if it fails. As it stands most games I tried it fails to even display despite loading in the bepinex logs.

The issue depends on how the game was compiled. In games where the plugin works perfectly, like RJ01323215 , “Live2D.Cubism.dll” is kept as an independent file. However, in games where the plugin fails to load, like RJ345267 , the developers merged the whole Live2D Cubism library directly into “Assembly-CSharp.dll”.

I managed to fix this on my end using dnSpy. I modified the CubiLink.dll plugin by swapping its assembly reference from Live2D.Cubism to Assembly-CSharp. After doing that, the plugin worked on RJ345267.

Modded “CubiLink.dll” 51 KB folder on MEGA

Maybe to @ZeroScripts makes more sense.

Yeah I’m pretty sure in most cases it just comes down to how the game was built and where the Cubism classes ended up.

I’ll try to rework the plugin so it doesn’t hard-reference Live2D.Cubism.dll anymore and instead try to resolve the Cubism types at runtime, so it can hook into whichever assembly the game is actually using.
That should make it a lot more universal and hopefully let one build work across most Live2D games without needing manual patching each time.

2 Likes

For games where the plugin didn’t boot, I tried your modded dll and it did make it boot and able to edit the values, but it’s completely unable to connect to Intiface:
image

Eagerly awaiting for a dynamic resolver because this is likely due to some mismatch from the base CubiLink.

I can confirm it’s working with The Handy, though things will be stuttery.

Not sure that’s entirely the case. There’s some at least where the DLL is present but there’s still no output from the plugin despite it loading. An example is RJ01169637 as I’ve just been looking at that.

I’ve updated the plugin to detect Cubism at runtime instead of hard-referencing Live2D.Cubism.dll, so it should now be compatible with most Live2D Unity games out there.
HOUSHOU PLAYER (RJ345267)Succubus Casino ~Succubus Castle~ (RJ01169637)
Give it a try and let me know how it goes.

3 Likes

It looks like for some cases it still reproduces the error I talked about earlier

Intiface is indeed running in that instance

Perfect, I’ll do some testing and see what works. 1st thing I went into was RJ01055507 - Pinsaro Over The Wall since i did try to do this one for EDI but lost focus

Currently its still a no-go in either version.

Perhaps this one isnt Live2D like i thought it was xD

Each game handles the required connection libraries differently, which can break Intiface depending on the game.

I made the Intiface connection more self-contained in the latest version and added a fallback connection method for runtimes that don’t support the normal one.
May still fail in some games, but compatibility should now be much better overall.

This game does not appear to use the standard Live2D Cubism Unity components, so the plugin can’t detect model parameters here without a custom separate detection.

I can confirm connection is now working for a few of my examples :+1:

I see we now reached v2 already, thanks for the quick fixes !

1 Like

I gotta learn how to code… So one thing I found that i want to figure out is that some games use the same parameters (aka Parm 25 when you search has 3) but when you select it, it doesnt… read it right. Cant go around it so makes it unrecordable.

1 Like

With the latest update, you can now easily import/export templates.

If you test the plugin with a game, feel free to share your results and upload your templates so others can use them.
I might compile them all into a proper list at some point.


:pushpin:Example Format:

Game Title/Link: Griffith’s Paizuri Simulator - Special Services at Mermaid Tavern


Game Version: V0.10
Plugin Version: V2.3
Status: :white_check_mark: Working (or :record_button: Partial, :cross_mark: Not Working)

Notes: Not tested with actual SR6 device yet.

Template File:
Paizuri.cubilink.json


for Copy/Paste:
**Game Title/Link:** [GameName](GameLink)  
[preview image]
**Game Version:** Vxx  
**Plugin Version:** Vxx  
**Status:**  :white_check_mark: Working / :record_button: Partial / :cross_mark: Not Working

**Notes:**  

**Template File:**  
[file.json]
8 Likes