xiazeyu / live2d-widget.js

Live2D on webpages with out-of-the-box experience.
https://l2dwidget.js.org/
GNU Affero General Public License v3.0
1.55k stars 263 forks source link

"idle" 设置多个动作时每次加载只会执行其中一个动作,不会随机到别的动作 #62

Open Nick-Hopps opened 4 years ago

Nick-Hopps commented 4 years ago

Describe the bug

"idle": [
      {"file": "mtn/idle_01.mtn", "fade_in": 2000, "fade_out": 2000},
      {"file": "mtn/idle_02.mtn", "fade_in": 2000, "fade_out": 2000},
      {"file": "mtn/idle_03.mtn", "fade_in": 2000, "fade_out": 2000},
      {"file": "mtn/idle_04.mtn", "fade_in": 2000, "fade_out": 2000}
    ]

我在 "idle" 中设置了4个动作,使用 Live2D 的 SampleApp 加载时,模型会不断随机这 4 个动作。但是当我用 hexo-helper-live2d 加载到博客中时,每次刷新页面只会随机加载一个,然后再也不会随机到另外三个动作,而是不断重复加载到的这个动作。

@EYHN @xiazeyu

Nick-Hopps commented 4 years ago

顺便请问一下,我设置了 "hit_area",但是无论用 "tap_head" 还是 "flick_head" 都没用,点击头部只会切换表情。

我的 motion 设置如下:

{
  "motions":
  {
    "idle": [
      {"file": "mtn/idle_01.mtn", "fade_in": 2000, "fade_out": 2000},
      {"file": "mtn/idle_02.mtn", "fade_in": 2000, "fade_out": 2000},
      {"file": "mtn/idle_03.mtn", "fade_in": 2000, "fade_out": 2000},
      {"file": "mtn/idle_04.mtn", "fade_in": 2000, "fade_out": 2000}
    ],
    "tap_body": [
      {"file": "mtn/tap_body.mtn"}
    ],
    "flick_head": [
      { "file":"mtn/flick_head.mtn"}
    ]
  }
}
Nick-Hopps commented 4 years ago

看了一天的代码,终于找到问题了。

首先是第一个问题:每次刷新页面只会随机加载一个,然后再也不会随机到另外三个动作,而是不断重复加载到的这个动作。

解决方法

修改 cModel.js 的第 369 行开始的 if 语句:

if (this.motions[name] == null)
{
    this.loadMotion(name, this.modelHomeDir + motionName, function(mtn) {
        motion = mtn;

        thisRef.setFadeInFadeOut(name, no, priority, motion);

    });
}
else
{
    motion = this.motions[name];

    thisRef.setFadeInFadeOut(name, no, priority, motion);
}

改为

if (this.motions[motionName] == null)
{
    this.loadMotion(motionName, this.modelHomeDir + motionName, function(mtn) {
        motion = mtn;

        thisRef.setFadeInFadeOut(name, no, priority, motion);

    });
}
else
{
    motion = this.motions[motionName];

    thisRef.setFadeInFadeOut(name, no, priority, motion);
}

第二个问题:设置 "tap_head" 或 "flick_head" 都没用,点击头部只会切换表情。

解决方法

修改 cManager 的第 89 行:

this.models[i].setRandomExpression();  // 把这个注释掉,改成:
this.models[i].startRandomMotion(cDefine.MOTION_GROUP_FLICK_HEAD,
        cDefine.PRIORITY_NORMAL);

@xiazeyu @EYHN 两位大佬方便的话给我这个 issue 标记一下吧,说不定别人也有类似的问题

GlowZhou commented 4 years ago

你好,我也遇到了和你一样的问题,然后按你的方式改了node_modules\live2d-widget\src里的cModel.js和cManager.js里的部分,可惜我这个问题还是没有修复好,还是只能一次刷新出现一种循环待机动作和一种点击动作

Nick-Hopps commented 4 years ago

你好,我也遇到了和你一样的问题,然后按你的方式改了node_modules\live2d-widget\src里的cModel.js和cManager.js里的部分,可惜我这个问题还是没有修复好,还是只能一次刷新出现一种循环待机动作和一种点击动作

修改之后要重新编译,我没说而已啊

具体是先执行 npm run inst:devnpm run build:prod,之后再 hexo g -f 就可以了

GlowZhou commented 4 years ago

多谢,已经可以正常展示不同的动作,帮大忙了