zoukankan      html  css  js  c++  java
  • 萌舞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,这样理论上效率会更高。

     

     
  • 相关阅读:
    HDU 5313 bitset优化背包
    bzoj 2595 斯坦纳树
    COJ 1287 求匹配串在模式串中出现的次数
    HDU 5381 The sum of gcd
    POJ 1739
    HDU 3377 插头dp
    HDU 1693 二进制表示的简单插头dp
    HDU 5353
    URAL 1519 基础插头DP
    UVA 10294 等价类计数
  • 原文地址:https://www.cnblogs.com/DragonX/p/3426914.html
Copyright © 2011-2022 走看看