CubiLink - Unity Animation to Multi-Axis (v3.3.2 - AIO Edition)

Game Title/Link: [Live2D x ASMR] Come on in! Succubus-san ~Hungry Mere Squeezes Out Your Semen Tonight~

Game Version: V1.0
Plugin Version: V2.6.2
Status: :white_check_mark: Working

Notes: Tested and confirmed to work in SR6.

Template File:
cowgirl.cubilink.json (2.6 KB)

4 Likes

This was previously scripted here: https://discuss.eroscripts.com/t/summon-succubus-san-ill-take-your-semen-tonight-too/132594/
A game mod is much better, since the game runs at a higher frame rate than the video.

2 Likes

An upgrade to the CubiMulti-link plugin:

The previous version did not allow min and max values to be migrated. This version now allows it, and features such as copy and pasting are available too.

3 Likes

Hi, I tried your version and I’m amazed by them. The device is almost perfectly aligns to the animation.
I’m very curious how you put those custom expressions together. I could never decode them.

1 Like

The expressions are basically small formulas I added to mix multiple animation parameters together and add conditions / more dynamic values. I tried to make the system relatively simple when integrating it into CubiLink, but I agree it still needs better explanations. I’m planning to add more built-in help/tooltips and examples in future versions.

@akiyama made very clever use of those expressions and game parameters by combining them for different animation states. Maybe he can also share his work and thought process.

Some examples from this game’s template:

(p_ParamBodyForward==0)*(p_ParamPiston/2*1.1-p_ParamLowerBodyAngleY/20*0.15)
Means only use this part when ParamBodyForward is 0 (condition is True → output = 1). Then it follows the piston movement, with a small correction from lower body angle.

(p_ParamMouthScale!=0)*(p_ParamBodyAngleZ!=0)*(p_ParamAngleY/41*0.8+0.1)
Only activates the motion when the mouth is open and the body angle is active. Then use ParamAngleY to drive the output.
The ==0 / !=0 parts are like switches. If true, they become 1; Otherwise 0. So Multiplying by them turns parts of the formula on and off depending on the scene/animation state.

For example, in the Cowgirl template:
0.5 +(p_ParamBodyForward==0)*(p_ParamPiston/2*1.1 ...)
starts from the center 0.5, then adds piston-based movement only during the matching animation state.

So most expressions mainly do three things: detect the current animation state, pick the useful parameter, then scale/offset it so the device motion lines up better.

In next big updated, I’m also adding helper functions to make them easier to read and use, like if(condition, trueValue, falseValue).

2 Likes

Hello Falafel,

I’m honored that you liked the template I created.
ZeroScripts has already provided an explanation, but I thought it would be helpful to also share my own process and approach to creating it.

First, regarding how to make it work, as already mentioned, control is achieved by combining condition expressions and operation expressions. I will explain this separately for each.


• Condition Expressions

In most cases, as long as the Live2D itself does not change, it is often possible to consolidate all behaviors into a single template.
This is because many of the parameters are shared, and even when not actively used, they still exist while holding some value.

For condition expressions, you should look for parameters that always have some value, but whose behavior changes when you want to differentiate actions.

For example:

  1. A parameter is fixed in scene A but changes in scene B
  2. A parameter is fixed in both scene A and B, but with different values

You should look for parameters like these.

A recommended approach is:

  • Display the list during scene A and enable Freeze
  • Scroll to the bottom of the item list
  • Then switch to scene B

Items near the bottom are those that were not changing before, so if any of them become highlighted, they can often be used to create condition expressions.

Of course, this method is not perfect. In practice, you may need to note down fixed values or apply more flexible thinking.

As for writing condition expressions, they are typically in forms like:
(ParamA == N) * or (ParamA != N) *

You can also use operators like <= or >= for more flexibility.
Although I haven’t tested it, something like
((p_ParamA == N + p_ParamB == N) >= 1) *
could potentially work as a switch that activates when either condition is true.


• Operation Expressions

Basically, this is just selecting parameters and converting their behavior into expressions to input into Offset.

When controlling via Offset, make sure to always set Multiplier to 0.
The controllable range of Offset is proportional to the Multiplier value.

Except for Twist, I recommend starting from 0.5.
This helps avoid situations where, due to missing parameters or when selecting templates, values default to 0 and cause undesirable movements.

One advantage is that when directly modifying Multiplier, the result may shift relative to the Offset position depending on the scale.
However, when controlling via Offset, this shift does not occur.

It also allows you to:

  • Combine multiple parameters into one motion
  • Correct mismatches between parameter values and animation behavior

Actual Expression Format

In my templates, I generally use the following format:

([Invert]p_ParamN / [max - min] * Multiplier + Offset)

  • If Invert is enabled, a - is added before the parameter
  • / [max - min] normalizes the value to a 0–1 range
  • * Multiplier adjusts the intensity
  • + Offset determines the center point of motion

Offset is also useful when values do not center around 0 (e.g., 0–1 ranges).

When combining multiple movements, simply add two or more of these expressions together.


• Thought Process

Basically, I first go through all the mechanics in a scene and note how I want each axis to behave when changes occur.

Then I:

  1. Create condition expressions that detect those changes
  2. Combine them with operation expressions

In my opinion, the greatest strength of this plugin is that it allows anyone to easily create game-linked mods without requiring specialized knowledge.

As you can probably tell from how often I post, templates can be created very quickly and easily.

At first, things may not go as expected, but after some trial and error, you’ll quickly get used to it.

I’ve been creating templates for SR6, but not for Liner. I believe there are many people who can create even better multi-axis templates than I can.

If you’re reading this, I highly encourage you to give it a try yourself.


Sorry for the long explanation, and thank you for reading.

4 Likes

Thank you for sharing your thought process.

I was trying to recreate the template for this game, but I ran into a problem: during the battle, there are often two or three changing actions within one template. When they change the action, the CubiLink tends to freeze and causes a delay of about 5-10 seconds before it moves again.

I wonder if you also encountered this problem. I can confirm it’s not a template issue; I have tried running the CubiLink without a template, and the parameters still didn’t move for 5-10 seconds when each action changed during the battles. This only happens during battles.

1 Like

I think this needs to be checked more carefully, but could this be a side effect of creating the template in Gallery mode rather than during battle?

For example, could it be that the behavior only works when specifying parameters that are shared between both Gallery mode and Battle mode, and does not work in sections where the parameters I specified do not exist?

Also, if by “CubiLink freezing” you mean that after switching Live2D, there is a period where parameters are not loaded and no items appear in the parameter list, I have experienced that as well.

There was also a game called Succubus Reborn, for which I previously created a template, that had an issue where parameter retrieval was extremely slow.

Additional note: After trying various things, I realized that the version I’m using is 2.6.0, so please keep that in mind.

To get straight to the point, I did not encounter any issues during battle in my environment.

However, in the Gallery, when switching small animations, there is a delay of about 5 seconds where nothing responds. That said, the delay seems to be consistent—around 4–5 seconds—and I was not able to reproduce the ~10-second delay mentioned in the report.

Also, the ~5-second delay I observed seems to occur under specific conditions: when switching to another Live2D while one is already being displayed.

If the Live2D detection is lost once before switching to another Live2D, it loads very smoothly.

I believe this condition may also be related to the delay observed in Succubus Reborn.

Thank you both for sharing, these are very helpful advices! I noticed that in some games you bind certain nodes to twist and make it only move during orgasm. It was very creative.

I guess I was just bewildered by the operators, l these would be much appreciated.

3 Likes

I was wondering if this plugin can be used with adult visual novels and similar GAL games. Has anyone tested it?

Based on the files extracted from the game, the animations in this installment do indeed use Live2D. The question is whether anyone will develop a plugin for this game engine.

BepInEx does not generate a plugins file.That’s too bad; I actually really like this series.

The plugin (and BepInEx in general) only works with Unity games.

You can usually identify Unity games pretty reliably by their file structure. Typical indicators are:

  • A folder named something like: *GameName*_Data
    • Inside that: files like globalgamemanagers, resources.assets, sharedassets*.assets, etc.
  • In the root folder: UnityPlayer.dll and often UnityCrashHandler.exe
1 Like

Game Title/Link: (Natsu’s) Milk Time Booth DLSite
pr2
pr1

Game Version: v1.0.0
Plugin Version: v2.6.2
Status: :white_check_mark: Working

Notes:
Tested with a FunSR. Single-axis only.
This is a very rough template that’s barely working. I hope someone that’s better at this could improve it.

Template File:
milk_time_v1.00 - All Templates.cubilinkpack.json (42.6 KB)

4 Likes

I guess since it was mentioned on another comment I’d bring it up for this one (and I think others you made for this brand), but this was made with story mode right? Because during story mode it’s perfect, but during free mode I don’t know if it’s just me (using the Handy with Intiface) it seems to desync pretty consistently and it stutters, manually editing the template to raise the speed modifier kinda helps but yeah, seems like a difference between modes here as well.

CubiLink v3 is out!

thumb3_cubilink_cover_3200x1800

This update expands CubiLink beyond Live2D and adds support for pretty much all Unity Transform and Spine animation games as well.
Detection is automatic, and each supported runtime now has its own parameter interception and asset highlighter to help find useful animation values more easily.
With that, even games like White Knight Training & The Arrogant Kaiju Princess can now be used with the plugin:

Preview



The update also adds several new advanced features:

  • Native Multi-Bind
    • bind multiple parameters to one axis
    • use priorities and conditions to pick the best active value
  • Auto-Load
    • automatically switch templates based on scene names or log messages
  • Improved expression system
    • added helper functions for more flexible formulas
    • usable in axis settings and Multi-Bind rules

There are a bunch of other new features and improvements as well.

Big thanks to @akiyama for testing and providing feedback/feature ideas.
Because this update changes quite a lot of the plugin structure, there may still be some bugs and some of the new features are still experimental. Please let me know if you run into issues or have suggestions.

13 Likes

This is huge.

BIG props to your work on this. The increased compatibility will be something I’ll play around with ! Glad to see one of the Kaiju games is supported. Since I checked the internals of 2, I’m pretty sure it’ll work as well. I’ll report back if that’s the case.

Thanks again for your work and to Akiyama for his help on this release :clap:

Another thing to mention: great that you added a folder to archive some other versions of Cubilink. Since I tested a bunch, this’ll help going forward in case we need a specific version.

EDIT: It does work for Kaiju Princess 2, as well !

2 Likes

Hey man,

I’m using your CubiLink-Legacy.dll with an older Unity game, but I’m running into a bug. As soon as I connect the device, the entire plugin UI goes completely blank/empty.

The game I’m working with is Yuen-Zoku.

Do you have time to look into this bug? If yes, how would you like me to provide logs or other information to help you debug it? (BepInEx log, screenshots, etc.)

Thanks a lot!

I assume this happens when connecting through the Intiface websocket? The issue is most likely caused by the legacy build still depending on external Newtonsoft.Json.dll / websocket-sharp.dll files in older Unity/.NET runtimes. In some games that could break the UI.

I updated the legacy build and bundled those dependencies directly into it as a fallback, and also added a safer Intiface path. Give it another try with that.

If it still happens, a BepInEx/LogOutput.log from right after the UI goes blank would be helpful.

Is Il2cpp support planned? And if so is it gonna have to wait until bepinex supports it? Just curious since there’s a specific Il2cpp game I’ve really been wanting to use something like this on but alas, nothing works with Il2cpp.