Unity-Live2D
概述:这是我学习Unity中Live2d的相关操作的一个笔记,欢迎各位同好和大牛的指点。(参考siki学院出的视频学的)
头发物理检测类
- 首先我们得知道live2D模型的头发是分块的,通常会分为侧发,前发,后发三种,具体模型具体不同,目前我学习的这个模型是没有前发的,且两侧头发是分开的,所以就分为后发和左侧发,右侧发三种。
- 然后是live2D的头发物理系统类:PhysicsHair;我们需要对不同的头发区块分别定义其的物理系统,范例代码如下:
//先于大类中定义出头发物理系统
private PhysicsHair physicsHairLeft; //左侧方头发物理
private PhysicsHair physicsHairRight; //右侧方头发物理
private PhysicsHair physicsHairBack; //后方头发物理
//再于Start中实例化出来
physicsHairLeft = new PhysicsHair();
physicsHairRight = new PhysicsHair();
physicsHairBack = new PhysicsHair();
- 接着我们需要套用一下物理运算,这里用到一个头发物理系统类内置的API:PhysicsHair.setup();这个API我们用它第二个重载,需要用到三个参数,第一个 是头发的长度,单位是公尺,会影响头发摆动的周期,第二个是头发受到的空气阻力,预设值是0.5f,范围是0到1,影响头发摆动速度的衰减,第三个是头发的重量,单位是千克,
范例代码:
physicsHairLeft.setup(0.2f,0.5f,0.14f);
头发物理之输入参数
- 这部分是对头发输入参数的一个初始化工作,具体由我们提供几个参数给内置的一个API,让其计算并挂载到我们的头发物理系统上(该过程写在Start中)
- 这里我们用到了一个头发物理类的内置枚举类型:PhysicsHair.Src,其中有三种参数,功能如下:
SRC_TO_X:头发横向摇摆
SRC_TO_G_ANGLE:头发下垂
SRC_TO_Y:头发下垂 - 然后我们用到一个新的头发物理类中的方法PhysicsHair.addSrcParam();其中用到四个参数,第一个就是我们实例化出来的相应的枚举类型,第二个是输入参数所来源的区块id(即这个头发参数受什么区块的参数影响),第三个是该参数对头发的影响度,意为当参数改变时,头发受到多少倍的影响度的输入参数(这个参数目前不太会设置,就按照教程中的0.005走吧),第四个为改方法对参数影响的权重;
下面代码举例:
//设置输入参数
//设置那一部分变动时进行哪种物理运算
PhysicsHair.Src srcX = PhysicsHair.Src.SRC_YO_X; //横向摇摆,枚举实例化
physicsHairLeft.addSrcParam(srcX,"PAPAM_ANGLE_X",0.005f,1);
头发物理之输出参数
- 类似于输入参数的设置,我们同样需要在Start中对输出参数进行一个初始化设置,方放也比较类似
- 这里我们用到内置枚举类型PhysicsHair.Target,这里包含两种表现形式,一个是TARGET_FROM_ANGLE代表普通的输出摆动,一个是TARGET_FROM_ANGLE_V代表带有阻力的输出,这个阻力影响貌似还蛮大的 ,具体要用哪个,测试一下就好。
- 然后是PhyscisHair内置的输出参数API,PhyscisHair.addTargetParam();里面用到的参数如下:第一个:是我们之前定义的输出参数所用到的Target变量,第二个:是我们所要影响的区块ID,第三个:依旧是影响度,第四个:也依旧是权重。
演示代码:
//设置输出表现
//表现形式
PhysicsHair.Target targetRight = PhysicsHair.Target.TARGET_FROM_ANGLE
physicsHairSideRight.addTargetParam(targetRight,"PARAM_HAIR_SIDE_R",0.005f,1);
头发实时更新
- 如之前的各种操作,头发的摆动自然也是需要去实时更新模型参数的,这里我们用到了PhyscisHair.update();这个API,里面用到两个参数,第一个是我们需要更新的模型,第二个是更新时间,需要这个时间的原因是因为头发的物理系统内置的计算算法里,需要算一些物理内容,所以诸如加速度速度等东西的计算需要用到时间,这里的时间我们是用到live2d环境架构好以后的计时.
- 这里重点说一下第二个参数,也就是时间,由于我们要使用的live2D架构好以后的时间与unity游戏启动计时存在一定误差,所以我们需要用到一个全新的API去得到这个时间:UtSystem.getUserTimeMSec();
下面代码举例
long time = UtSystem.getUserTimeMSec(); //执行时间
physicsHairSideLeft.update(live2DModel,time);
c#代码折叠
由于这个头发这一部分内容相较有点多,还很乱,所以引进一个新的操作,代码折叠,可以将一部分写成完备功能的代码进行折叠,让代码更条理操作如下
#region 折叠区块所命名
折叠区代码内容
#endregion
//注: 所有的实时更新语句都应该在其设置代码后面,而总体的模型更新应该位于最后