查看: 1916|回复: 0

程序丨如何用Unity3D实现游戏中的角色换装?

[复制链接]
发表于 2022-11-16 08:59:01 | 显示全部楼层 |阅读模式
换装系统是游戏中较为常见的功能,我们给它一个专业词avatar,可以做到装备与人物分离,实现自由换装效果。我们可以将头部、身体、手、脚、武器独立建模、贴图,利用avatar来动态换装,实现各种搭配、实时时装等。

01

换装效果图

02

相关知识点准备

首先我们需要知道模型里涉及到的三个概念,蒙皮网格mesh、骨骼bone、材质material。下面是示例模型在unity里的数据标识详细说明:

程序丨如何用Unity3D实现游戏中的角色换装?-7749

蒙皮网格渲染器用来渲染骨骼动画。

骨骼数据在unity展示形式为Transform,如下图所示:

程序丨如何用Unity3D实现游戏中的角色换装?-1406

当模型在播放中,观察Transform会处于变化中。

我们来看下示例模型里,骨骼数据中左、右手挂装备的节点,这个后面挂接武器会用到,先看如下所示:

程序丨如何用Unity3D实现游戏中的角色换装?-9807

看到上图装备节点,我们可能猜到了给模型换装备的思路了,那就是实例化装备预制后,挂接到这个位置即可。正确,这是其中一种,当然我们也可以把装备直接做成SkinnMesh不用挂接点。

来看一下相关五个部分独立模型,示例模型如下所示:

程序丨如何用Unity3D实现游戏中的角色换装?-5959

需要注意的是,每一套模型都需要使用同一套的骨骼,具体如下所示:

程序丨如何用Unity3D实现游戏中的角色换装?-1879

03

实现原理

经上介绍并了解完模型里的数据、蒙皮网格渲染器与网格、骨骼、材质几个概念后,再来介绍unity3d换装实现原理。

基本原理:替换修改蒙皮网格渲染器的网格、骨骼、材质。

基本步骤:合并网格,刷新骨骼,附加材质。

我们需要将骨骼数据单独保存为一个预制,其他相关独立模型包括武器也一样做成预制,具体如下图所示:

程序丨如何用Unity3D实现游戏中的角色换装?-867

接下来需要代码处理将四个模型里的materials材质数据,meshes数据,bones骨骼数据准备好,其中meshes数据需要进行合并网格的处理。

下面是具体代码片段:

程序丨如何用Unity3D实现游戏中的角色换装?-8920

当数据准备完毕,我们给骨骼预制添加一个蒙皮网格渲染器,并设置其中sharedMesh、bones、materials,这就是我们所说的基本步骤,合并网格,刷新骨骼,附加材质。

具体代码如下:

程序丨如何用Unity3D实现游戏中的角色换装?-9756

经过上面的处理,我们可以看到骨骼预制里最新数据,模型组合最新显示如下:

程序丨如何用Unity3D实现游戏中的角色换装?-9721

以上是较为简单的过程,一般为了达到优化,降低drawcall,需要合并模型网格,重新计算UV,合并贴图材质。新的步骤:合并网格,合并贴图,重新计算UV,刷新骨骼,附加新材质再设置UV。

其中合并材质重新计算UV,主要代码如下:

程序丨如何用Unity3D实现游戏中的角色换装?-9664

经过合并处理,我们再给网格渲染器设置新材质再设置UV:

程序丨如何用Unity3D实现游戏中的角色换装?-9223

优化前后,drawcall消耗有减小,对比如下图:

程序丨如何用Unity3D实现游戏中的角色换装?-8746

04

挂接武器

上面有提到骨骼一个名为weapon_hand_r的节点,我们可在该节点位置挂接武器。具体操作代码如下:

程序丨如何用Unity3D实现游戏中的角色换装?-6464

我们可以这样玩,将武器挂接到左手,或者左右手都挂接武器,动动手吧操作看看效果如下所示:

程序丨如何用Unity3D实现游戏中的角色换装?-4765

05

学习资料

https://github.com/zouchunyi/UnityAvater

http://www.cnblogs.com/shamoyuu/p/6505561.html

https://docs.unity3d.com/Manual/class-SkinnedMeshRenderer.html

以上内容解读与总结,希望能起到对相关知识点有加深理解的作用,感谢阅读指正分享!

今日推荐
·用Unity制作一个好玩但鸡肋的操作回滚功能

·如何用Unity Shader制作类似《炉石传说》卡牌的动态效果?

·大神的日常!资深场景概念设计师绿榴莲作品欣赏及经验分享

程序丨如何用Unity3D实现游戏中的角色换装?-9787

↓↓↓点击阅读原文,了解更多。
您需要登录后才可以回帖 登录 | 加入联盟

本版积分规则

快速回复 返回顶部 返回列表