【推荐100个unity插件之34】在unity中实现和Live2D虚拟人物的交互——Cubism SDK for Unity

news2024/11/24 4:23:49

最终效果

在这里插入图片描述

文章目录

  • 最终效果
  • 前言
  • 例子
  • 中文官网
  • Live2d模型获取
  • 下载Live2D Cubism SDK for Unity
  • 使用文档
  • 限制
  • unity导入并使用Live2D模型
    • 1、将SDK载入到项目
    • 2、载入模型
    • 3、显示模型
    • 4、 播放动画
  • 表情动作修改参数
  • 眼神跟随看向鼠标效果
  • 部位触摸效果
  • 摸头效果
  • 摸头闭眼效果
  • 做成桌宠
  • 参考
  • 完结

前言

Live2D是一款2D建模的软件,常用于游戏,动态壁纸,虚拟主播,游戏公司里面是有专门的ive2D岗位的。

游戏里面还有一个经常使用的软件——spine,他做的也是2d的模型,但是他更适合做一些动作,Live2D更适合人物交互方面。

例子

碧蓝航线、梦幻模拟战、双生世界、虚拟主播、 结合AE软件做的动态壁纸
请添加图片描述

中文官网

https://www.live2d.com/zh-CHS/

Live2d模型获取

官方提供了一些 Live2D实例模型给大家下载使用

地址:https://www.live2d.com/zh-CHS/learn/sample/
在这里插入图片描述

获取其他Live2d模型:https://blog.csdn.net/qq_36303853/article/details/142284330

下载Live2D Cubism SDK for Unity

在这里插入图片描述
地址:https://www.live2d.com/zh-CHS/sdk/download/unity/
在这里插入图片描述
结果
在这里插入图片描述

使用文档

SDK for Unity 教程:https://docs.live2d.com/zh-CHS/cubism-sdk-tutorials/getting-started/
SDK for Unity 手册:https://docs.live2d.com/zh-CHS/cubism-sdk-manual/eyeblink-unity/

限制

Cubism3或更高版本的Cubism SDK for Unity支持的 Unity 版本为2019.x。
如果小于2018.3,SDK内的资产(.mat等)中序列化的信息将被放弃。

unity导入并使用Live2D模型

1、将SDK载入到项目

在这里插入图片描述
在这里插入图片描述

2、载入模型

直接把前面官网下载的案例文件全部拖入
在这里插入图片描述
如果载入成功,SDK中包含的Cubism的Importer会自动生成一个Prefab
在这里插入图片描述

3、显示模型

您可以通过将生成的Prefab追加到Hierarchy视图或Scene视图,注意默认是不会显示模型的,需要运行一次系统才会在场景中置入模型
在这里插入图片描述

4、 播放动画

动画文件在motion下
在这里插入图片描述
播放效果
在这里插入图片描述

表情动作修改参数

这里的cubism parameters inspector组合,修改这里的参数发现模型也会进行相应的变化
这些参数其实就是对应模型各个部位的参数,并且和parameters下面的各个子物体一一对应
在这里插入图片描述

眼神跟随看向鼠标效果

在模型上添加Cubism Look Target和Cubism Look Controller两个组件,并把Cubism Look Target赋值给Cubism Look Controller的Target
在这里插入图片描述

接下来找到头部参数和眼部参数,分别为它们添加Cubism Look Parameter组件,轴系统一般会自动选择合适的轴,比如头部左右移动就是按x轴,上下移动就是按y轴
在这里插入图片描述
效果,按住鼠标左键,人物就会看向我们的鼠标
在这里插入图片描述

如果发现效果不明显,调大这个参数即可,比如这里调大头左右摆动幅度
在这里插入图片描述
在这里插入图片描述

部位触摸效果

动画配置
在这里插入图片描述

为模型添加Cubism Raycaster组合,主要用于live2d的射线检测
在这里插入图片描述然后给人物想要进行射线检测的部位,添加Cubism Raycastable组件,用来表示哪些部位可以进行射线检测
在这里插入图片描述
新增Live2DStaticData定义触摸部位枚举

// 触摸部位
public static class Live2DStaticData
{
    // 左手
    public const string LeftHand = "D_ARM_L_02"; 

    // 右手
    public const string RightHand = "D_ARM_R_02"; 

    // 左腿
    public const string LeftLeg = "D_FOOT_00"; 

    // 右腿
    public const string RightLeg = "D_FOOT_01"; 

    // 头部
    public const string Head = "D_HAIR_BACK_002_00"; 

    // 胸部
    public const string Chest = "D_BODY_00"; 
}

新增Epsilon ,实现触摸不同位置播放不同动画

using Live2D.Cubism.Framework;
using Live2D.Cubism.Framework.Raycasting;
using UnityEngine;

public class Epsilon : MonoBehaviour
{
    Animator animator;
    CubismRaycaster cubismRaycaster; // Cubism 射线检测器
    int count; // 射线检测结果计数
    CubismRaycastHit[] hits = new CubismRaycastHit[1]; // 射线检测命中数组
    
    public static Epsilon Instance;

    private void Awake()
    {
        Instance = this;
        animator = this.GetComponent<Animator>();
        cubismRaycaster = this.GetComponent<CubismRaycaster>();
    }

    // 设置 Live2D 动作
    public void SetLive2dAction(string hitPart)
    {
        switch (hitPart)
        {
            case Live2DStaticData.Head:
                animator.SetTrigger("Curious"); // 头部触摸时,设置好奇触发
                break;
            case Live2DStaticData.Chest:
                animator.SetTrigger("UnHappy"); // 胸部触摸时,设置不开心触发
                break;
            case Live2DStaticData.LeftHand:
            case Live2DStaticData.RightHand:
                animator.SetTrigger("Wink"); // 左右手触摸时,设置眨眼触发
                break;
            case Live2DStaticData.RightLeg:
            case Live2DStaticData.LeftLeg:
                animator.SetTrigger("Hate"); // 左右腿触摸时,设置厌恶触发
                break;
            default:
                break; // 其他情况不处理
        }
    }

    void Update()
    {
        // 检测鼠标左键按下
        if (Input.GetMouseButtonDown(0))
        {
            count = cubismRaycaster.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), hits); // 执行射线检测
        }

        if (Input.GetMouseButtonUp(0))
        {
            // 如果没有检测到命中,直接返回
            if (count == 0) return;
            SetLive2dAction(hits[0].Drawable.Id); // 设置 Live2D 动作
        }
    }
}

挂载脚本
在这里插入图片描述
效果
在这里插入图片描述

摸头效果

首先我们来制作进度条,这里我直接放一个滑动条
在这里插入图片描述
修改Live2DStaticData,定义摸头结束枚举

//摸头结束命令
public const string EndTouchCommand = "EndTouchCommand";

修改Epsilon

public bool isTouching;

public void SetLive2dAction(string hitPart)
{
    switch (hitPart)
    {
        //...
        case Live2DStaticData.EndTouchCommand:
            animator.SetTrigger("Shy");
            count = 0;//清除当前的触摸信息
            break;
        default:
            break; // 其他情况不处理
    }
}

void Update()
{
    // ...      

    if (Input.GetMouseButton(0) && Input.GetAxisRaw("Mouse Y") != 0)
    {
        if (count == 0) return;
        if (isTouching == false && hits[0].Drawable.Id == Live2DStaticData.Head)
        {
            TouchHeadPanel.Instance.Show();
        }
    }
}

新增TouchHeadPanel,控制进度条变化

public class TouchHeadPanel : MonoBehaviour
{
    public static TouchHeadPanel Instance;
    Slider slider;

    private void Awake()
    {
        // 初始化单例
        Instance = this;
        Hide(); // 在初始化时隐藏面板
    }

    private void OnEnable()
    {
        slider = GetComponent<Slider>();
        slider.value = 0;
    }

    void Update()
    {
        if (slider.value >= 1)
        {
            // 摸头结束
            Epsilon.Instance.SetLive2dAction(Live2DStaticData.EndTouchCommand);
            // 设置动画并隐藏自己
            Hide();
            return;
        }

        // 逐帧更新位置
        slider.value += Time.deltaTime; // 逐渐向上移动
    }

    // 隐藏面板
    public void Hide()
    {
        this.gameObject.SetActive(false); // 将游戏对象设为不活动
        if (Epsilon.Instance)
        {
            Epsilon.Instance.isTouching = false;
        }
    }

    // 显示面板
    public void Show()
    {
        this.gameObject.SetActive(true); // 将游戏对象设为活动
        if (Epsilon.Instance)
        {
            Epsilon.Instance.isTouching = true;
        }
    }
}

挂载脚本
在这里插入图片描述

效果
在这里插入图片描述

摸头闭眼效果

我们可以通过这里的Cubism Eye Blink Controller组件,设置这个Eye Opening参数实现闭眼效果
Eye Opening = 0表示完全闭眼
在这里插入图片描述

修改TouchHeadPanel

// 隐藏面板
public void Hide()
{
    this.gameObject.SetActive(false); // 将游戏对象设为不活动
    if (Epsilon.Instance)
    {
        Epsilon.Instance.isTouching = false;
        Epsilon.Instance.cubismEyeBlinkController.EyeOpening = 1;//睁眼
    }
}

// 显示面板
public void Show()
{
    this.gameObject.SetActive(true); // 将游戏对象设为活动
    if (Epsilon.Instance)
    {
        Epsilon.Instance.isTouching = true;
        Epsilon.Instance.cubismEyeBlinkController.EyeOpening = 0;//闭眼
    }
}

效果
在这里插入图片描述

做成桌宠

如果你想把她做出桌面宠物,可以参数我这篇文章:
【制作100个unity游戏之32】unity开发属于自己的一个2d/3d桌面宠物,可以实时计算已经获取的工资

参考

https://www.bilibili.com/video/BV11y4y1r7W5
https://www.bilibili.com/video/BV1fT4y1173h
https://www.bilibili.com/video/BV1dS4y177F8

完结

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!

好了,我是向宇,https://xiangyu.blog.csdn.net

一位在小公司默默奋斗的开发者,闲暇之余,边学习边记录分享,站在巨人的肩膀上,通过学习前辈们的经验总是会给我很多帮助和启发!如果你遇到任何问题,也欢迎你评论私信或者加群找我, 虽然有些问题我也不一定会,但是我会查阅各方资料,争取给出最好的建议,希望可以帮助更多想学编程的人,共勉~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2164278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

企业如何通过ETL工具实现主数据的同步

1、 主数据的定义与重要性 主数据&#xff0c;作为企业的核心数据资产&#xff0c;涵盖了客户、产品、供应商、员工等关键业务实体信息。这些数据的稳定性、共享性和对决策的影响力&#xff0c;使其成为企业运营和战略决策不可或缺的基础。主数据的质量与一致性直接关系到企业…

数据结构-4.栈与队列

本篇博客给大家带来的是栈和队列的知识点, 其中包括两道面试OJ题 用队列实现栈 和 用栈实现队列. 文章专栏: Java-数据结构 若有问题 评论区见 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条, 如果分享不成功, 那我就会回你一下,那样你就分享成功啦. 你们的…

在Unity编辑器中实现组件的复制与粘贴:完整指南

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! 在Unity编辑器中实现组件的复制与粘贴&#xff1a;完整指南 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心…

低空经济——载具

低空经济的政策大家都知道&#xff0c;开放低空&#xff0c;是经济和社会发展的需要&#xff0c;但是步子肯定不会太大&#xff0c;先刺激资本进行投入&#xff0c;之后看看再说&#xff0c;一定是这样模式。 我们知道&#xff0c;新能源车&#xff0c;基本实现了弯道超车&…

基于springboot vue网上摄影工作室系统设计与实现

博主介绍&#xff1a;专注于Java vue .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的…

jni动态库“%1 不是有效的win32应用程序”问题的解决以及一些windows下dll有关命令的记录

一、前因 在windows下用cmakeVS编译了一个jni动态库&#xff0c;再使用java测试程序调用这个动态库的时候报错&#xff1a;“%1 不是有效的win32应用程序” 对于这类问题&#xff0c;一般从以下几个方面考虑&#xff1a; 动态库文件损坏动态库或者其依赖库文件路径错误导致找…

高效职场助手

在现代职场中&#xff0c;高效的工作软件是提升生产力的关键。以下是我为您精选的五款高效工作软件&#xff0c;它们各具特色&#xff0c;能够满足不同工作场景的需求&#xff1a; 1 亿可达 亿可达作为一款自动化工具&#xff0c;亿可达被誉为国内版的免费Zaiper。它允许用…

一个Windows管道的简单示例

今天为大家带来一个Windows管道通信的演示实例,服务端以单线程、同步方式与客户端通信,在某一时刻只能服务于一个客户端,可用于简单的进程间通信的场景。 服务端(SingleInstancePipeSvr)和客户端(NamedPipeClient)都是用Visual Studio 2022 Community创建,分别…

抖音上下边框中间视频效果怎么做

在抖音这个以短视频为主要内容的平台上&#xff0c;创作出既美观又富有信息量的视频至关重要。尤其是当我们手中的素材多为横屏拍摄&#xff0c;而抖音则以竖屏展示为主时&#xff0c;如何巧妙地处理这些素材&#xff0c;使它们更好地适应平台需求&#xff0c;成为了许多创作者…

Django之Haystack对接搜索引擎框架Elasticsearch

Django之Haystack对接Elasticsearch Haystack概述安装依赖环境准备Haystack配置 Haystack建立数据索引创建模型对象创建搜索索引类创建模板文件执行数据库迁移生成索引渲染模板执行测试 搜索请求和结果渲染的自定义处理概述创建搜索视图配置URL创建搜索模板自定义结果渲染执行测…

电脑数据怎么恢复?这10种数据恢复方法你一定要知道!

在如今这个数字化时代&#xff0c;电脑已经成为我们生活和工作中不可或缺的一部分。我们在电脑中存储着大量重要的数据&#xff0c;如照片、文档、视频、音乐等。然而&#xff0c;有时候意外总是不可避免&#xff0c;电脑数据可能会因为各种原因丢失&#xff0c;比如误删除、格…

父母血型与子女血型对照表

人类的血型是有遗传性的&#xff0c;父母的血型直接影响孩子的血型&#xff0c;我们可以根据父母血型推测孩子血型&#xff0c;排除不可能血型&#xff0c;那么下面就由血型分析为大家揭晓下父母血型与孩子血型对照表&#xff08;排除基因突变&#xff09; 血型遗传规律表又称血…

IMS注册流程中的基本路由寻址过程

目录 1. SIP 协议栈在 TCP/IP 中的位置 2. 看看 SIP 协议栈各层的寻址功能 本课程,以 IMS 注册流程为例,讲解 IP 网络网元是如何完成 IP 层寻址的 第一跳:UE->P-CSCF 第二跳:P-CSCF->DNS 第三跳:P-CSCF->I-CSCF 第四跳:I-CSCF->HSS 第五跳:I-CSCF-&…

深入解析Debian与Ubuntu:技术特点与用户使用指南

深入解析Debian与Ubuntu&#xff1a;技术特点与用户使用指南 引言 Debian和Ubuntu作为两大知名的Linux发行版&#xff0c;不仅在历史和理念上有所不同&#xff0c;在技术特点和用户使用方法上也各具特色。本文将深入解析它们的技术特点&#xff0c;并提供用户使用指南&#x…

SSM+Vue大学生社团管理系统

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 spring-mybatis.xml3.5 spring-mvc.xml3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质创作…

东华大学《2020年+2022年824自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《25届东华大学824自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2020年真题 2022年真题 Part1&#xff1a;2020年2022年完整版真题 2020年真题 2022年…

惊艳桌面时钟软件 为你的桌面打造专属时间管理!

在快节奏的现代生活中&#xff0c;时间是最宝贵的资源之一。无论是在工作还是生活中&#xff0c;我们都需要时刻关注时间&#xff0c;在桌面显示一个时钟&#xff0c;可以让你更方便的掌握时间。芝麻时钟 &#xff08;下载地址&#xff1a;https://clock.zhimasoft.cn/?bili&a…

Jmeter——参数化的9种方法

jmeter工具无论做接口测试还是性能测试&#xff0c;参数化都是一个必须掌握且非常有用的知识点。参数化的使用场景: 1&#xff09;多个请求都是同一个ip地址&#xff0c;若服务器地址更换了&#xff0c;则脚本需要更改每个请求的ip 2&#xff09;注册账号&#xff0c;不允许账…

【图形学】数学基础

行矩阵和列矩阵 在图形处理中&#xff0c;矩阵操作时最基本的操作&#xff0c;但是不同的系统中对矩阵的存储是不同&#xff0c;比如OpenGL和Cg中就是不一样的&#xff1a; 比如一个4x4矩阵 [m11,m12,m13,m14m21,m22,m23,m24m31,m32,m33,m34m41,m42,m43,m44]在实现中通常将其…

海康威视网络摄像头校时、修改分辨率等操作汇总!

目录 操作环境&#xff1a; 操作原因&#xff1a; 解决办法&#xff1a; 手动校准时间&#xff0c;随着时间推移&#xff0c;可能再次出现偏差&#xff0c;操作简单&#xff1a; 【IVMS-4200】对设备批量校时操作指导&#xff1a;操作之前先把本地服务器的时间改对&#x…