Unity-Live2d(头发物理系统,⼩操作~c#代码折叠)
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,第三个:依旧是影响度,第四个:也依旧是权重。
unity 教程演⽰代码:
//设置输出表现
//表现形式
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去得到这个时间:UserTimeMSec();
下⾯代码举例
long time = UserTimeMSec();    //执⾏时间
physicsHairSideLeft.update(live2DModel,time);
c#代码折叠
由于这个头发这⼀部分内容相较有点多,还很乱,所以引进⼀个新的操作,代码折叠,可以将⼀部分写成完备功能的代码进⾏折叠,让代码更条理操作如下
#region 折叠区块所命名
折叠区代码内容
#endregion
//注: 所有的实时更新语句都应该在其设置代码后⾯,⽽总体的模型更新应该位于最后

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。