-
Unity-Live2D实现GalGame中人物随鼠标点击移动
人物模型是从live2d下载下来的,这么可爱的二次元不可能是我画的。
live2d本身有对鼠标监测的封装方法(见对象L2DTargetPoint),鼠标在live2d的拖拽管理坐标系内会反馈一个鼠标的影响度,可看成一个在-1到1之间的比例值;
这里的方法是:
1.先获取鼠标当前在屏幕的位置
2.利用已有公式将当前鼠标物理位置x转换成live2d内的世界坐标值y
3.通过y值去设置人物本身在unity中的动作幅度转动从而实现跟随鼠标发生相应肢体变化的效果
先贴码源

using System.Collections; using System.Collections.Generic; using UnityEngine; using live2d; using live2d.framework; public class Live2dModel : MonoBehaviour { public TextAsset modelFile; public Texture2D[] textures; public TextAsset[] motionFiles; //加载模型动画数组 private Live2DMotion[] motions; //动作数组 private L2DMotionManager l2DMotionManager; //优先级的设置标准 //1.动作未进行的状态,优先级为0 //2.待机动作发生时,优先级为1 //3.其他动作进行时,优先级为2 //4.无视优先级,强制发生的动作 private Live2DModelUnity live2dModel; private Matrix4x4 live2DCanvasPos; private MotionQueueManager motionQueueManager; //动作的管理 private MotionQueueManager motionQueueManagerA; private EyeBlinkMotion eyeBlinkMotion; //鼠标拖拽引起的动作变化 private L2DTargetPoint drag; public int motionIndex; public float a; // Start is called before the first frame update void Start() { //初始化 Live2D.init(); for (int i = 0; i < textures.Length; i++) { live2dModel.setTexture(i, textures[i]); } //指定显示位置和尺寸(使用正交矩阵与相关API显示图像,再由游戏物体) float modelWidth = live2dModel.getCanvasWidth(); live2DCanvasPos = Matrix4x4.Ortho(0, modelWidth, modelWidth, 0, -50, 50); //播放动作 //实例化动作对象 //1.直接获取路径赋值来获取动画播放 //live2DMotionIdle = Live2DMotion.loadMotion(Application.dataPath + ""); //2.用textasset来加载动画播放资源 //TextAsset mtnFile = Resources.Load<TextAsset>(""); //live2DMotionIdle = Live2DMotion.loadMotion(mtnFile.bytes); motions = new Live2DMotion[motionFiles.Length]; for (int i = 0; i < motionFiles.Length; i++) { motions[i] = Live2DMotion.loadMotion(motionFiles[i].bytes); //遍历完成所有动作的加载 } //设置某一个动画的一些属性 //setLoopFadeIn方法:重复播放的时候是否加上动作渐变淡入(即当前动作帧数较多 False是不淡入 //setFadeOut方法:如果不设置那么默认淡出时间是1000ms 动作播放时长 motions[0].setLoopFadeIn(false); motions[0].setFadeOut(1000); //动作的优先级使用 l2DMotionManager = new L2DMotionManager(); //眨眼 eyeBlinkMotion = new EyeBlinkMotion(); //鼠标拖拽 drag = new L2DTargetPoint(); } // Update is called once per frame void Update() { //具体是为了让camera把人物显示出来 live2dModel.setMatrix(transform.localToWorldMatrix * live2DCanvasPos); //模型跟随鼠标转向与看向 //得到的live2d鼠标监测点的比例值是-1到1(对应一个live2d的拖拽管理坐标系,或者说叫影响度) //然后我们通过这个值去设置我们的参数 比如选择30°*当前得到的值 //就会按照这个值所带来的影响度去影响我们的模型 //从而达到看向鼠标点位置的效果 Vector3 pos = Input.mousePosition; if (Input.GetMouseButton(0)) //0按下鼠标左键 1按下鼠标右键 { //把当前的屏幕鼠标坐标转化成l2d内的鼠标监测坐标 drag.Set(pos.x/Screen.width*2-1,pos.y/Screen.height*2-1); }else if (Input.GetMouseButtonUp(0)) { drag.Set(0, 0); } //参数及时更新,考虑加速度等自然因素,计算坐标,进行逐帧更新 drag.update(); //模型转向 if (drag.getX() != 0) { live2dModel.setParamFloat("PARAM_ANGLE_X", 30 * drag.getX()); live2dModel.setParamFloat("PARAM_ANGLE_Y", 30 * drag.getY()); live2dModel.setParamFloat("PARAM_BODY_ANGLE_X", 10 * drag.getX()); live2dModel.setParamFloat("PARAM_EYE_BALL_X", -drag.getX()); live2dModel.setParamFloat("PARAM_EYE_BALL_Y", -drag.getY()); } //眨眼 eyeBlinkMotion.setParam(live2dModel); //更新模型定点、参数、贴图 live2dModel.update(); } //绘图 private void OnRenderObject() { live2dModel.draw(); } private void StartMotion(int motionIndex, int priority) { //当前播放的动画优先级比传进来的高 返回 if (l2DMotionManager.getCurrentPriority() >= priority) { return; } l2DMotionManager.startMotion(motions[motionIndex]); } }
详细见注释。
栏目列表
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
SQL Server -- 解决存储过程传入参数作为s
关于JS定时器的整理
JS中使用Promise.all控制所有的异步请求都完
js中字符串的方法
import-local执行流程与node模块路径解析流程
检测数据类型的四种方法
js中数组的方法,32种方法
前端操作方法
数据类型
window.localStorage.setItem 和 localStorage.setIte
如何完美解决前端数字计算精度丢失与数