unity3d 表情动画使用
在游戏制作过程中,我们常常需要使用 Unity 的表情动画。那么,该如何使用表情动画呢?下面将详细介绍 Unity3D 表情动画的使用方法。
3DMax 和 Maya 导出模型的兼容性问题
3DMax 和 Maya 做完 Morpher 动画后导出的模型,Unity3D(U3D)是不支持的,模型导入后会报错。U3D 默认不支持 Morpher 动画,具体原因暂不明确。
实现 Morpher 动画的方法
目前,有两种方法可以实现 Morpher 动画。
方法一:直接将两个模型进行对比,顶点渐变变形
原理
读取两个模型,一个作为目标模型,另一个作为初始模型,根据渐变参数来调用当前变形模型。以下是实现该功能的代码:
function SetComplexMorph (srcIndex : int, dstIndex : int, t : float) {
if (m_SrcMesh == srcIndex && m_DstMesh == dstIndex && Mathf.Approximately(m_Weight, t))
return;
var v0 = m_Meshes[srcIndex].vertices;
var v1 = m_Meshes[dstIndex].vertices;
var vdst = new Vector3[m_Mesh.vertexCount];
for (i = 0; i < m_Mesh.vertexCount; i++) {
vdst[i] = Vector3.Lerp(v0[i], v1[i], t);
}
m_Mesh.vertices = vdst;
m_Mesh.RecalculateBounds();
}
实际例子
可参照 U3D 百科:MeshMorpher
方法二:使用插件 Mega-Fiers
Mega-Fiers 插件是目前 U3D 中功能最全、效果最好的变形插件。不过,其代码量较大,若仅直接使用,较为方便;若需要对其进行修改,则需要花费一定时间进行研究。
插件的 Morph 功能原理
Mega-Fiers 里的 morph 功能需要配合附属插件使用,附属插件需要向作者获取。相当于作者编写了一个程序,将其导出为一个 morph 格式,然后在 U3D 中读取该格式以实现 MORPH 功能。
插件来源
- 直接购买正版:可直接上官网购买正版,并通过邮件向作者索要附属插件。
- U3D 圣典论坛团购:通过 U3D 圣典论坛组织的团购活动获取插件。
具体用法
可参考官网教程:
注意问题
- 模型引用问题:由于模型的渲染是引用而不是复制的,所以实例化的模型都引用同一个地址的数据。当 morph 修改当前模型时,其他引用该模型的实例也会相应变化。因此,若只使用单个模型,使用 mega-fiers 没有问题;但如果场景中有多个同样的实例化模型,所有模型都会播放同样的 morph 动画。
- 不同实例播放不同动画的解决方法:若需要不同的实例化模型播放不同的 morph 动画,则需要修改 mega-fiers 的源代码。原理是复制一份模型,并将渲染的引用指向复制的模型。具体操作是找到
MegaModifyObject.cs
文件,在FindMesh
方法的返回渲染引用之前添加以下代码:if (Application.isPlaying) { Mesh temp = Mesh.Instantiate(skins[0].sharedMesh) as Mesh; skins[0].sharedMesh = temp; mesh = skins[0].sharedMesh; }
多动画的切换动画
在项目中,没有直接使用插件的动画播放方式,而是自己编写了一个储存、读取和播放的代码脚本。
- 原理
- 记录动画信息:编写 Editor 编辑器,将所需的动画播放信息记录到一个 json 或者 xml 文件中。实际上,只需要记录使用的通道、每个通道的开始百分比和结束百分比即可。
- 读取并播放动画:读取文件信息,将其反解析成类,然后根据相关信息调用编辑好的动画。