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

最终效果

在这里插入图片描述

文章目录

  • 最终效果
  • 前言
  • 例子
  • 中文官网
  • 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.xdnf.cn/news/144042.html

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

相关文章

Mistral AI 又又又开源了闭源企业级模型——Mistral-Small-Instruct-2409

就在不久前&#xff0c;Mistral 公司在开源了 Pixtral 12B 视觉多模态大模型之后&#xff0c;又开源了自家的企业级小型模型 Mistral-Small-Instruct-2409 &#xff08;22B&#xff09;&#xff0c;这是 Mistral AI 最新的企业级小型模型&#xff0c;是 Mistral Small v24.02 的…

无人机如何突破高海拔高寒飞行环境?

无人机在突破高海拔高寒飞行环境方面&#xff0c;需要解决一系列技术难题和挑战。以下是一些主要的技术手段和策略&#xff1a; 1. 无人机平台设计与优化 增强机体结构&#xff1a;采用轻质高强度的材料&#xff0c;如碳纤维、复合材料等&#xff0c;减轻机身重量&#xff0c…

HomeAssistant显示节假日

先看效果 步骤&#xff1a; 新建卡片时选择“Markdown 卡片”代码在文章最下方&#xff0c;当然你也可以自己修改 点击保存/完成 ### {% if now().hour > 6 and now().hour < 9 -%} 早上好&#xff0c; {%- elif now().hour > 9 and now().hour < 12 -%} 上午好…

ipython里如何用?快速查阅帮助

1、&#xff1f;用于查询函数帮助文档&#xff0c;??用于查询带源码的帮助文档 ?用于搜索内容&#xff0c;*作为通配符。

javascript-原型和原型链

原型 每个函数都有一个默认的原型对象 - prototype ,通过 prototype 我们可以扩展 js 的内置对象。一个函数和它创建的实例共享这个函数的原型属性和方法。实例对象的 constructor 会指向构造函数 原型链 每个实例对象都会有一个隐式原型属性 __proto__,通过 __proto__ 指…

网络安全-shire写任务计划、反弹shell、写私钥、反序列化

目录 一、环境 二、 介绍 三、开始做题 四、写公钥 一、环境 网上自己找 二、 介绍 我们经过前面文章很清楚知道&#xff0c;shiro是将数据存储在内存当中&#xff0c;内存落盘实现一个数据存储&#xff0c;而当其结合python&#xff0c;python将登录的session存储到shiro里…

【隐私计算篇】不经意传输协议(OT/OTE)的进一步补充

1. 背景介绍 关于不经意传输(OT)和不经意传输扩展(OT Extension), 我们在之前的文章《OT&OT扩展(不经意传输扩展)深入浅出》做了详细的说明。但对于OT/OTE的一些技术或者概念&#xff0c;还有一定的内容欠缺&#xff0c;因此本文根据冯登国院士关于安全多方计算协议…

了解快充协议芯片诱骗取电过程

快充协议芯片诱骗取电的过程主要涉及充电器与设备之间的通信和电压协商&#xff0c;以确保安全、快速和高效的充电。这个过程依赖于快充协议芯片&#xff0c;如XSP08Q快充诱骗芯片&#xff0c;它们内置通信模块&#xff0c;能够与供电端的充电器进行握手通信&#xff0c;从而申…

(黑马点评)七、附近商户系列功能实现

7.1 GEO数据结构的认识及其基本使用演示 7.1.1 GEO的介绍 GEO&#xff0c;代表地理坐标。Redis在3.2版本中加入了对GEO的支持&#xff0c;允许存储地理坐标信息&#xff0c;帮助我们根据经纬度来检索数据。常见的命令有&#xff1a; GEOADD&#xff1a;添加一个地理空间信息&a…

Java创建教程!(*  ̄3)(ε ̄ *)

Java 构造函数 Java面向对象设计 - Java构造函数 构造函数是用于在对象创建后立即初始化对象的代码块。 构造函数的结构看起来类似于一个方法。 声明构造函数 构造函数声明的一般语法是 <Modifiers> <Constructor Name>(<parameters list>) throws <…

【Binlog实战】:基于Spring监听Binlog日志

【Binlog实战】&#xff1a;基于Spring监听Binlog日志 binlog的三种模式 MySQL 的二进制日志&#xff08;binlog&#xff09;有三种不同的格式&#xff0c;通常被称为 binlog 模式。这三种模式分别是 Statement 模式、Row 模式和Mixed 模式。 Statement 模式&#xff1a; 在 …

JavaWEB概述

JavaWEB概述 一、什么是JavaWEB 用Java技术解决web互联网领域的技术栈。要学习JavaWEB首先得知道什么是客户端和服务端 客户端&#xff1a;简而言之&#xff0c;这就是使用方&#xff0c;比如我们下载一个软件去使用&#xff0c;里面有很多我们可以使用的功能&#xff0c;那…

Flutter问题记录 - 适配Xcode 16和iOS 18

文章目录 前言开发环境问题及解决方案1. Upload Symbols Failed2. type UIApplication does not conform to protocol Launcher3. method does not override any method from its superclass 最后 前言 为了新的镜像功能升级了macOS 15和iOS 18&#xff0c;Xcode也不可避免的需…

传输层协议——udp/tcp

目录 再谈端口号 udp 协议 理解报头 udp特点 缓冲区 udp使用的注意事项 tcp协议 TCP的可靠性与提高效率的策略 序号/确认序号 窗口大小 ACK&#xff1a; PSH URG RST 保活机制 重传 三次握手(SYN) 四次挥手(FIN) 流量控制 滑动窗口 拥塞控制 延迟应答 捎带应答 面…

面向切面:单元测试、事务、资源操作

目录 一、单元测试二、事务2.1、概述2.1.1、编程式事务2.1.2、声明式事务 2.2、JdbcTemplate2.3、基于注解的声明式事务2.3.1、基本用例-实现注解式的声明事务2.3.2、事务属性&#xff1a;只读2.3.3、事务属性&#xff1a;超时2.3.4、事务属性&#xff1a;回滚策略2.3.5、事务属…

八戒农场小程序V2最新源码

一.介绍 八戒农场V2小程序源码&#xff0c;前端工具上传&#xff0c;包更新、这个是源码&#xff0c;覆盖即可升级版&#xff08;修复很多问题&#xff09;&#xff1b;

基于UKF(无迹卡尔曼滤波)的SINS/GPS集成导航仿真程序【需要PSINS工具箱支持】

文章目录 主要特点内容包括运行截图 基于UKF&#xff08;无迹卡尔曼滤波&#xff09;的SINS/GPS集成导航仿真程序&#xff08;需要基于PSINS工具箱&#xff0c;工具箱是开源的&#xff0c;如果需要&#xff0c;可以确认收货后找我要链接&#xff09;。该程序能够高效地模拟导航…

Python VS Golng 谁更胜一筹?

今天我们聊聊Python和Golang这俩到底谁更胜一筹。 这个话题我已经在各种技术论坛上看到无数次了&#xff0c;每次都能引起一波热烈的讨论。作为一个多年写代码的老程序员&#xff0c;今天就站在我的角度&#xff0c;和大家掰扯掰扯这两个语言各自的优缺点。 1. 性能与并发模型…

软件测试技术之 GPU 单元测试是什么!

1 背景 测试是开发的一个非常重要的方面&#xff0c;可以在很大程度上决定一个应用程序的命运。良好的测试可以在早期捕获导致应用程序崩溃的问题&#xff0c;但较差的测试往往总是导致故障和停机。 单元测试用于测试各个代码组件&#xff0c;并确保代码按照预期的方式工作。单…

力扣(LeetCode)每日一题 1184. 公交站间的距离

题目链接https://leetcode.cn/problems/distance-between-bus-stops/description/?envTypedaily-question&envId2024-09-16 环形公交路线上有 n 个站&#xff0c;按次序从 0 到 n - 1 进行编号。我们已知每一对相邻公交站之间的距离&#xff0c;distance[i] 表示编号为 i …