If you have any questions, reports, suggestions, or requests about Live2D, please send them to this forum.
※We cannot guarantee statements or answers from Live2D staff. Thank you for your understanding in advance.
 
Live2D Cubism
Cubism Products and Downloads
Cubism product manuals and tutorials
Cubism Editor Manual    Cubism Editor Tutorial    Cubism SDK Manual    Cubism SDK Tutorial
[About Cubism Editor / SDK 5.4 Alpha](Updated: July 14, 2026)

You can download the alpha installer from the dedicated forum below.
If you have any feedback regarding the alpha version, including feature requests or bug reports, please use the same forum.

Cubism Editor / SDK 5.4 Alpha Forum
https://creatorsforum.live2d.com/c/cubismeditorsdk54alpha/

[Regarding macOS Tahoe](Updated October 16, 2025)

macOS v26 Tahoe is now supported!
We advise against upgrading your macOS at this time as it may cause Live2D products not to function correctly.
Upgrading macOS can also cause you to lose your Cubism Editor license file.
Please make sure to deactivate your Cubism Editor license before upgrading the macOS.

For more details:
https://help.live2d.com/en/other/other_09/
For inquiries regarding issues with license purchases or license activation errors, please contact us through the email form.

Manipulating L2DEyeBlink.cs

edited December 2023 in Help
Hello,
Using the Simple.cs script, I was trying to create a L2DViewer like parameter list for integrating into Fungus.

The problem is that because the L2DEyeBlink script also uses the parameters of "PARAM_EYE_L_OPEN" and "PARAM_EYE_R_OPEN", only the latest function would only activate, limiting me to either have a nomal blinking or a steady stare.

e.g: this code would only display a blinking character without eye open control, putting the eyeBlink.setParam on top in turn would display a staring character but with eye open control.



I then went into the L2DEyeBlink script and noticed the function for the blink is :

public void updateParam(ALive2DModel model)
{


long time = UtSystem.getUserTimeMSec();
float eyeParamValue;
float t = 0;

switch (this.eyeState)
{
case EYE_STATE.STATE_CLOSING:

t = (time - stateStartTime) / (float)closingMotionMsec;
if (t >= 1)
{
t = 1;
this.eyeState = EYE_STATE.STATE_CLOSED;
this.stateStartTime = time;
}
eyeParamValue = 1 - t;
break;
case EYE_STATE.STATE_CLOSED:
t = (time - stateStartTime) / (float)closedMotionMsec;
if (t >= 1)
{
this.eyeState = EYE_STATE.STATE_OPENING;
this.stateStartTime = time;
}
eyeParamValue = 0;
break;
case EYE_STATE.STATE_OPENING:
t = (time - stateStartTime) / (float)openingMotionMsec;
if (t >= 1)
{
t = 1;
this.eyeState = EYE_STATE.STATE_INTERVAL;
this.nextBlinkTime = calcNextBlink();
}
eyeParamValue = t;
break;
case EYE_STATE.STATE_INTERVAL:
//
if (this.nextBlinkTime < time)
{
this.eyeState = EYE_STATE.STATE_CLOSING;
this.stateStartTime = time;
}
eyeParamValue = 1;
break;
case EYE_STATE.STATE_FIRST:
default:
this.eyeState = EYE_STATE.STATE_INTERVAL;
this.nextBlinkTime = calcNextBlink();
eyeParamValue = 1;
break;
}
The solution here was to change the 1's into the variable that holds the eyeopen value in my original script ( (float) (ea) ) in order to become the upper bound for blinking.
The problem is, the system does not allow me to execute a getComponent within this function so I could not send over the value.
Is there any way I could pass it into the function?

Comments

  • Hey, thanks for your interest in Live2D! I think one easy way to do what you want to achieve is by patching the parameters each frame after eye blinking has run, i.e. after eye blinking has been updated you do something like:
    if (live2DModel.getParamFloat("PARAM_EYE_L_OPEN") > ea)
    {
      live2DModel.setParamFloat("PARAM_EYE_L_OPEN", ea);
    }
    Would that be an option?
  • Thank you for replying, but it seems that I have managed to have the newer LappProxy to work with fungus and just make the expressions in the actual L2D Viewer. So I'll be closing this.
Sign In or Register to comment.