萌舞Android版Unity笔记整理

(一)表情Morph

 

即使你把ModelImporter.optimizeMesh设为false,Unity还是会尝试合并相同的顶点并破坏你模型的拓扑,这使得顶点动画无法正常工作,唯一的办法就是实现自定义模型格式的导出和导入。

计算顶点动画时,用MeshFilter.sharedMesh的顶点作为源顶点,加上Morph的偏移最终保存到MeshFilter.mesh的顶点中去即可。

 

 

(二)透明排序

 

 

这个有点老生常谈了。上图从左到右依次为:

1.AlphaTest

2.AlphaBlend ZWrite Off

3.AlphaBlend ZWrite On

4.AlphaBlend排序

可以看出只有经过排序的效果才是最理想的。

在建模时需要美工对模型进行分层处理,要制定好命名规范以便程序员识别。画的时候先从外到内画所有背面,再从内到外画所有正面。正反两面的模型要分开各自存放,否则用Cull Front|Back来回切换会很麻烦。Unity控制渲染顺序最简单的方法就是修改Material.renderQueue,好在Material的大量实例化并不会明显增加内存的负担。

 

(三)ConfigurableJoint和SkinnedCloth

萌舞使用ConfigurableJoint来模拟头发和胸部。首先要把位移(xyzMotion)锁死,然后选择两个轴打开旋转(三个都打开会有错误),只有X轴可以双向设置参数(lowAngularXLimit是负角度时的参数,highAngularXLimit是正角度时的参数),利用这个特性可以限制披肩的长发只能向后飘而不会向前穿过身体,通过设置Joint.axis和Joint.secondaryAxis来确定Joint内部的轴向。

所有Joint所在的GameObject都要放在根节点上,通过Joint.connectedBody连接到它原来的父节点。

用SkinnedCloth实现裙子的效果很容易,建模时把顶点绑在腿上就行,进Unity以后再拿笔刷画顶点的系数,犯懒的话直接根据顶点的Y坐标推算也可以。

 

 

(四)动作

MMD的舞蹈动作使用了IK,可以转BVH再转FBX,拿MotionBuilder过了一遍发现两分多钟的舞蹈居然有7M,萌舞有20多个舞蹈,加上音乐模型贴图APK会超过200M,这是无法容忍的。于是开始找原因,发现Unity的动画系统不能直接对Quaternion做Slerp,只能一个个分量分别插值,还要记录每个关键帧的inTangent和outTangent,不仅如此,由于这样插值有误差,Unity还会自动加帧。其他类型的游戏由于动作都比较短所以这个问题并不明显,对于萌舞来说却是致命的。

于是只好自己写动画系统,顺便把IK实现了,这样会进一步压缩动作,对IK感兴趣的同学可以参考这个古老的网站,感觉网上绝大多数的代码都是照它写的。
接下来是骨骼映射和轴向转换,也就是实现MotionBuilder的核心功能。骨骼映射把名字对上就行了,轴向的话由于MMD采用的是世界0旋转而我们的人物是局部0旋转所以动画数据每个骨骼的旋转要左乘一个ReferencePose时它自身的世界旋转。

(五)防作弊与破解
单机游戏最怕的就是作弊,主要包括内存修改和存档修改。我写了一个AES-256加密版的PlayerPrefs,存档中的所有数据都是用的时候解出来改完立刻存回去,全局变量里不留痕迹。key是基于DeviceID生成的,所以存档也不能共享。
为了防止APK被人重新签名发布,需要在程序内部验证当前APK的签名,显然这件事不应该在Java里做,反正我是能看懂混淆后的Java代码,况且Unity项目Java代码就那么一丁点。利用AndroidJavaClass和AndroidJavaObject很容易实现在Unity中验证APK的签名,你可以在多个地方粘贴验证的代码,IL汇编比混淆后的Java难读一些,不过诚心想破解的人终有一天还是会成功的。

(六)图片背景

在OnPreCull里用Graphics.DrawTexture画背景图应该是最简单的方法,而且如果有了背景图,就可以把Camera的clearFlags改为DepthOnly,这样理论上效率会更高。

 

 
原文地址:https://www.cnblogs.com/DragonX/p/3426914.html