live2d_Live2D | CubismSdkForUnity4r.1简介(下)

梦  罟

Live2DSdkforUnity

明天就开学了……虽然是上网课但也算是开学吧。总结这个寒假,自己好像也没干什么事= =最后把SDK做完吧。

嘴型变化

相比于SDK2,SDK4框架中内置了根据音频来自动判断嘴巴开合的方法,这极大地提高了live2d的互动性和真实性,而且简单易行。首先我们需要在预制体上挂载Cubism Mouth Controller、Cubism Auido Mouth Input以及Audio Source三个组件;然后在parameters中找到控制嘴巴开合的参数(PARAM_Mouth_OpenY),挂载Cubism Mouth Parameter组件;最后在Audio Source中添加对应的语音片段,点击播放,就可以看见嘴型的变化。

94688474aaa7235f285c412b031c5910.gif

播放动作

前面已经提到,在Live2d模型中通常会有motion.json的动作文件;挂载了SDK后,这些.json文件会被转化为Unity可以识别的.anim文件,即我们所说的AnimationClip。使用Unity的动画控制机打开即可实现动作的播放。

f2cf97f7520d090a830b3b3eede8d255.gif

当然,SDK还提供了另外一种动画播放方式。在预制体上挂载Cubism Motion Controller和Cubism fade Controller,接着只需要在我们编写的脚本中添加 Live2D.Cubism.Framework.Motion的命名空间,就可以在脚本中利用CubismMotionController来实现对动画的管理。这里介绍几个重要的API:

1.PlayAnimation(AnimationClip clip, int layerIndex = 0, int priority = CubismMotionPriority.PriorityNormal, bool isLoop = true, float speed = 1.0f);

这个API实现的是动画播放,其中第一个参数为要播放的动画片段;第二个参数是Cubism动画控制机的层数,一般默认为0;第三个参数是动画的层级,这里我们追溯它的定义,发现框架中这样定义层级:

aca75fe06d4f3173cbf9d7fa2d812258.png

第一层为无优先权,代号为0;第二层是待机动画的层级,即Idle动画,代号为1;第三层是一般的动画;第四层则为强制播放;根据实践经验来看,除了idle动画默认为1,其余情况大多可用默认值2来完成。第四个 参数是是否循环播放,一个布尔类型的变量;最后一个参数是播放速度,不做解释说明。

2.StopAnimation(int animationIndex, int layerIndex = 0)

显然这个API的作用是停止某个动画的播放。第一个参数是停播动画所在的Index;第二个参数是控制机的图层,默认为零。

3.StopAllAnimation()

停止播放所有动画,无参数输入,不做解释。

命中判断

在live2d展示中,往往我们点击模型的不同部位,模型会做出不同的动作;完成此功能的前提条件是对点击进行识别。在SDK4中提供了Cubism Raycaster的组件来实现点击识别。我们可以编辑这样一组脚本来实现对命中部位的查看:

using UnityEngine;

using Live2D.Cubism.Framework.Raycasting;

using Live2D.Cubism.Framework.Motion;

public class CubismHitTest : MonoBehaviour

{

    private void Update()

    {

        // Return early in case of no user interaction.

        if (!Input.GetMouseButtonDown(0))

        {

            return;

        }

        var raycaster = GetComponent();

        // Get up to 4 results of collision detection.

        var results = new CubismRaycastHit[4];

        // Cast ray from pointer position.

        var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        var hitCount = raycaster.Raycast(ray, results);

        // Show results.

        var resultsText = hitCount.ToString();

        for (var i = 0; i < hitCount; i++)

        {

            resultsText += "n" + results[i].Drawable.name;

        }

        Debug.Log(resultsText);

    }

}

该脚本的作用是识别鼠标点击的部分,并将其名称返回到Console中,点击效果如图所示:

0202235bab5732dc0f363b9cd500b9af.png

动作切换

当然,命中判断不是最目的,最终目的是实现动作切换,完成live2d整个互动系统的组装。由于官方没有提供对应的组件,所以我考虑将命中判断和动画组件的两个功能结合,通过命中判断来控制动画的播放。在动作切换中药一定要注意对动画的层级设置。本文提供自制的脚本供大家来参考:

using Live2D.Cubism.Framework.Motion;

using UnityEngine;

using Live2D.Cubism.Framework.Raycasting;

public class Touchmotion: MonoBehaviour

{

    CubismMotionController _motionController;

    public AnimationClip[] animationclip;

    private void Start()

    {

        _motionController = GetComponent();

    }

    public void PlayMotion(AnimationClip animation)

    {

        if ((_motionController == null) || (animation == null))

        {

            return;

        }

        _motionController.PlayAnimation(animation, isLoop: false);

    }

    private void Update()

    {

        _motionController.PlayAnimation(animationclip[3], 0, 1, isLoop: true);

        // Return early in case of no user interaction.      

        if (!Input.GetMouseButtonDown(0))

        {

            return;

        }

        var raycaster = GetComponent();

        // Get up to 4 results of collision detection.

        var results = new CubismRaycastHit[4];

        // Cast ray from pointer position.

        var ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        var hitCount = raycaster.Raycast(ray, results);

        // Show results.

        var resultsText = hitCount.ToString();

        for (var i = 0; i < hitCount; i++)

        {

            resultsText += "n" + results[i].Drawable.name;

        }

        if (resultsText == "2nTouchSpecialnTouchBody")

        {

            _motionController.PlayAnimation(animationclip[0], isLoop: false);

        }

        else if (resultsText=="1nTouchBody")

        {

            _motionController.PlayAnimation(animationclip[1], isLoop: false);

        }

        else if (resultsText == "1nTouchHead")

        {

            _motionController.PlayAnimation(animationclip[2], isLoop: false);

        }

    }

}

f213c29cdc834a3c21d9c2497e8adf66.gif 98c8604f8257a1b84baa8922103855d4.png

至此,一个live2d模型的基本功能已经实现完毕,该有的互动系统也已经完成。至于如何利用live2d模型来完成一些游戏、动画的制作,还需要读者的自行理解考虑。当然,也欢迎在公众号后台中交流~

文/lost_Ink

df52cfee5d1f3c342bb1c730e03c74cd.png

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在网页上添加Live2D,需要先准备好以下文件: 1. Live2D Core SDK:下载地址为 https://live2d.github.io/#js-core。 2. Live2D 模型文件:可以在网络上搜索到各种免费和付费的Live2D模型,下载后需要将其解压缩到本地。 3. jQuery 库:如果网页中已经用到了jQuery,可以省略这一步。 接下来,按照以下步骤逐步操作: 1. 创建一个 HTML 文件,引入 jQuery 和 Live2D Core SDK: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Live2D Demo</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/@live2d/[email protected]/dist/Live2DCubismCore.min.js"></script> </head> <body> </body> </html> ``` 2. 在 `body` 中添加一个 `canvas` 元素: ``` <canvas id="live2d" width="300" height="400"></canvas> ``` 3. 在 JavaScript 中加载模型文件: ``` var model; function loadModel() { var modelJson = "模型文件的路径/model.json"; var modelDir = "模型文件的路径/"; Live2D.core.readModel(modelJson, function (buf) { model = Live2D.core.createModel(buf); model.loadTextures(modelDir, function () { draw(); }); }); } ``` 4. 在 `draw` 函数中绘制模型: ``` function draw() { var canvas = document.getElementById("live2d"); if (canvas.getContext) { var gl = canvas.getContext("webgl"); model.setGL(gl); gl.clearColor(0.0, 0.0, 0.0, 0.0); gl.clear(gl.COLOR_BUFFER_BIT); model.draw(); } } ``` 5. 最后调用 `loadModel` 函数即可加载模型并在网页中显示Live2D。 ``` $(document).ready(function () { loadModel(); }); ``` 以上就是给网页添加Live2D的基本步骤,具体实现还需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值