Unity-Live2D实现GalGame中人物随鼠标点击移动

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

}
View Code

 详细见注释。

 

没研究出来怎么发GIF图,动作效果待补充。

 

上一篇:javascript-set_at事件中的Google Map可编辑多边形过滤器拖动事件


下一篇:javascript-在D3中拖动事件的两个“调用”