Unity中Avatar换装实现

Unity动态创建Avatar骨骼映射 Unity Avatar骨骼映射动态创建,适配Unity通用动画,无需经过第三方建模软件,可运行时创建 阅读详情
技巧| Unity中Avatar换装实现

技巧| Unity中Avatar换装实现

Avatar换装是MMO游戏不可缺少的一部分,一个人物模型通常可拆分为头、身体、手臂、腿、武器等部分,如何将这些部分组合到一起呢?本文将阐述如何将在Unity中实现人物模型的换装功能。


资源准备

1.每一套装备模型必须使用同一套骨骼,并单独将骨骼数据保存成一个Prefab。红色部分为武器挂节点(也可以把武器做成一个SkinnedMesh,不采用挂接点的形式),骨骼数据在Unity中的展示形式就是Transform。
UWA Tech Doc

2.将模型拆分成多个部分,将每一个部分单独保存成Prefab,武器也单独保存为一个Prefab。
UWA Tech Doc
UWA Tech Doc

每一个Prefab都含有自身的SkinnedMeshRenderer。
UWA Tech Doc


实现过程

1.创建骨骼GameObject,所有装备的蒙皮数据会最终合成到这个Prefab中。

2.创建装备GameObject,用于搜集其中蒙皮数据以生成新的SkinnedMeshRenderer到骨骼Prefab中。

3.public void CombineObject(GameObject skeleton, SkinnedMeshRenderer[] meshes, bool combine = false)传入骨骼的GameObject和蒙皮数据。

4.搜集装备蒙皮数据中的有效信息。

// Collect information from meshes
        for (int i = 0; i < meshes.Length; i ++)
        {
            SkinnedMeshRenderer smr = meshes[i];
            materials.AddRange(smr.materials); // Collect materials
            // Collect meshes
            for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)
            {
                CombineInstance ci = new CombineInstance();
                ci.mesh = smr.sharedMesh;
                ci.subMeshIndex = sub;
                combineInstances.Add(ci);
            }
            // Collect bones
            for (int j = 0 ; j < smr.bones.Length; j ++)
            {
                int tBase = 0;
                for (tBase = 0; tBase < transforms.Count; tBase ++)
                {
                    if (smr.bones[j].name.Equals(transforms[tBase].name))
                    {
                        bones.Add(transforms[tBase]);
                        break;
                    }
                }
            }
        }

5.为骨骼GameObject生成新的SkinnedMeshRenderer。

// Create a new SkinnedMeshRenderer
SkinnedMeshRenderer oldSKinned = skeleton.GetComponent<SkinnedMeshRenderer> ();
    if (oldSKinned != null) {
    GameObject.DestroyImmediate (oldSKinned);
    }
SkinnedMeshRenderer r = skeleton.AddComponent<SkinnedMeshRenderer>();
r.sharedMesh = new Mesh();
r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);// Combine meshes
r.bones = bones.ToArray();// Use new bones

6.挂接武器。

Transform[] transforms = Instance.GetComponentsInChildren<Transform>();
foreach (Transform joint in transforms) {
if (joint.name == "weapon_hand_r") 
{// find the joint (need the support of art designer)
        WeaponInstance.transform.parent = joint.gameObject.transform;
        break;
    }   
    }

其中WeaponInstance为武器实例GameObject,Instance为骨骼实例GameObject。

合成后的效果
UWA Tech Doc


如何优化

UWA Tech Doc
合成之后的模型拥有4个独立材质,加上独立的对象武器,也就是会产生5个Draw Call;如果将在骨骼中的这4个材质合并成一个,那么就能将Draw Call减少到2个。

其中实现过程如下:
优化CombineObject方法,其中Combine为bool类型,用于标识是否合并材质。

// merge materials
if (combine)
{
    newMaterial = new Material (Shader.Find ("Mobile/Diffuse"));
    oldUV = new List<Vector2[]>();
    // merge the texture
    List<Texture2D> Textures = new List<Texture2D>();
    for (int i = 0; i < materials.Count; i++)
    {
        Textures.Add(materials[i].GetTexture(COMBINE_DIFFUSE_TEXTURE) as Texture2D);
    }

    newDiffuseTex = new Texture2D(COMBINE_TEXTURE_MAX, COMBINE_TEXTURE_MAX, TextureFormat.RGBA32, true);
    Rect[] uvs = newDiffuseTex.PackTextures(Textures.ToArray(), 0);
    newMaterial.mainTexture = newDiffuseTex;

// reset uv
    Vector2[] uva, uvb;
    for (int j = 0; j < combineInstances.Count; j++)
    {
        uva = (Vector2[])(combineInstances[j].mesh.uv);
        uvb = new Vector2[uva.Length];
        for (int k = 0; k < uva.Length; k++)
        {
            uvb[k] = new Vector2((uva[k].x * uvs[j].width) + uvs[j].x, (uva[k].y * uvs[j].height) + uvs[j].y);
        }
        oldUV.Add(combineInstances[j].mesh.uv);
        combineInstances[j].mesh.uv = uvb;
    }
    }

生成新的SkinnedMeshRenderer时略有区别:
UWA Tech Doc

最终效果如下:
UWA Tech Doc
可以看出,新的SkinnedMeshRenderer只有一个材质,Draw Call自然也就降低了。


示例工程

本人已将此示例工程分享到了GitHub中:https://github.com/zouchunyi/UnityAvater
感兴趣的朋友可以下载。工程中代码大家可以直接使用,但是美术资源不得用于任何商业用途。
UWA Tech Doc


【Unity】Avatar与AvatarMask系统介绍(TPS.番外篇) 这次也是拖了蛮久,一个是在修动画,一个是别的游戏确实比较能吸引住人。在主要系列进行前,要先为接下来要讲的动画做一些基础知识的补充,这期是Avatar,即替身系统,以及AvatarMask的讲解。 阅读详情

相关推荐

UnityVR--组件8--Avatar骨骼映射&遮罩

使用人形动画映射Avatar,替换场景中的人物;使用Avatar遮罩让动画一部分失效,并使用逆向运动学控制一部分的骨骼

唐小墨同学的博客 4717

unity中的Avatar

2. **蒙皮(Skinning)**:Avatar 与角色模型的蒙皮(Skin)一起工作,蒙皮将骨骼和角色模型的外观关联起来,使骨骼的动作能够影响角色模型的外观。在Unity中,"Avatar" 通常指的是 **Avatar(角色模型)**,特别是在人物角色动画方面。总之,Avatar 在 Unity 中是一个非常重要的组件,用于管理人物角色的骨骼结构和动画。1. **骨骼结构(Skeleton)**:Avatar 包含了人物角色的骨骼结构,这些骨骼通常代表了角色的各个身体部位,如头、手、腿等。

c3872931的博客 2940

⭐Unity中的Avatar换装

换装是将头、身子、腿等多个零部件模型合成一个人物模型,本文章提供代码示例以供参考。

惊鸿醉的博客 4663

unity中Avatar换装实现(三)之美

前言 最近学习了Unity中Avatar换装功能实现,参考了网上的几篇文章,总结了一个Demo。Unity的换装实现参考网上的教程,总体有两种实现,一种是官方Demo给出的合并Mesh实现, 还有一种采用的以前端游的做法,共享骨骼的方式。两种方式各有特点。个人Demo实现了以上两种做法。 准备资源 手头没有换装资源,所以用了官方Demo的资源作为示例,不过官方的Demo把切分的部件打包...

游戏开发、游戏引擎开发、逆向破解爱好者 1730

Unity 2022.3 + RPM Avatar 换装系统:5步实现Mesh与材质动态替换

本文详细介绍了在Unity 2022.3中使用RPM Avatar构建换装系统的5个关键步骤,包括环境准备、骨骼绑定、动态换装实现、配置管理和性能优化。通过代码示例和实用技巧,帮助开发者快速掌握元宇宙中数字人换装系统的核心技术,实现Mesh与材质的动态替换。

chuannaoxuan4674的博客 517

Unity 2022.3 + RPM Avatar 换装系统:5步实现Mesh与Material动态切换

在虚拟角色定制领域,动态换装系统一直是提升用户体验的关键技术。本文将基于Unity 2022.3 LTS版本和Ready Player Me(RPM)Avatar系统,拆解一套高性能的换装解决方案。不同于传统的角色预制体替换方案,我们采用。在实际项目中,这套方案成功将换装性能开销控制在3ms以内,支持单角色同时加载20+套服装配置。关键点在于严格遵循骨骼一致性原则,并通过ScriptableObject实现资源与逻辑的解耦。的技术路线,在保持角色骨骼一致性的前提下,实现服装部件的无缝切换。

weixin_29682503的博客 242

Unity Metaverse(五)、Avatar数字人换装系统的实现方案

Unity 换装系统实现方案

当代野生程序猿 6987

生物信息学避坑指南:Scissor算法参数alpha和cutoff的黄金设置法则

本文深入解析了生物信息学中Scissor算法的关键参数alpha和cutoff的黄金设置法则,帮助研究者有效整合bulk RNA与单细胞数据,识别单细胞亚群。通过实战验证的调参策略,避开常见陷阱,获得可靠的生物学发现,特别适用于肿瘤异质性研究和免疫细胞分型等场景。

weixin_33734785的博客 452

unity中Avatar换装实现(一)之美

Avatar换装是MMO游戏不可缺少的一部分,一个人物模型通常可拆分为头、身体、手臂、腿、武器等部分,如何将这些部分组合到一起呢?本文将阐述如何将在Unity中实现人物模型的换装功能。 资源准备 1.每一套装备模型必须使用同一套骨骼,并单独将骨骼数据保存成一个Prefab。红色部分为武器挂节点(也可以把武器做成一个SkinnedMesh,不采用挂接点的形式),骨骼数据在Unity中的展示形...

游戏开发、游戏引擎开发、逆向破解爱好者 1174

Jenkins中文显示不全?三步搞定Locale插件+汉化包的正确安装姿势

本文针对Jenkins界面中文显示不全问题,提供从原理到实战的深度解决方案。文章详细解析了Locale插件与中文语言包的核心机制,并分步指导如何通过配置JVM环境、正确安装插件及执行深度排查,彻底解决汉化顽疾,实现Jenkins界面的完美中文显示。

weixin_42611310的博客 260

开关电源PCB安规设计避坑指南:从光耦开槽到变压器挡墙,这些细节决定认证成败

本文深入解析开关电源PCB安规设计中的关键细节,包括光耦开槽、变压器挡墙工艺等12个致命要点。通过实际案例和工艺参数表,揭示如何避免认证失败,特别强调爬电距离和电气间隙的精确控制,助力工程师提升产品安全性和认证通过率。

weixin_42548893的博客 205

unity中Avatar换装实现(二)之美

在前置篇中,基本上梳理了一下换装功能背后涉及到的美术工作流。但程序员嘛,功能终归是要落到代码上的。本文中会结合Unity提供的API及之前提到的内容来实现一个简单的换装功能。效果如下:  (图1:最终效果展示) 资源导出规则 所有的换装实现都是和导出规则相对应的。先说一下我这个小...

游戏开发、游戏引擎开发、逆向破解爱好者 1327

#智慧文旅#文创商城管理系统,一站式文旅商品营销管理平台

#智慧文旅#文创商城管理系统满足景区、运营公司或者全域文旅对文创店铺、商品的全流程管理需求,提供文创商品的线上线下产品销售、会员管理、促销管理等服务。包括文创店铺的基本信息管理、文创商品的分类管理、标签管理、上下架管理、库存案例、配送管理等功能。

数字赋能,开启智慧文旅新时代 1177

技巧| Unity中Avatar换装实现

转自: http://blog.uwa4d.com/archives/avartar.html Avatar换装是MMO游戏不可缺少的一部分,一个人物模型通常可拆分为头、身体、手臂、腿、武器等部分,如何将这些部分组合到一起呢?本文将阐述如何将在Unity中实现人物模型的换装功能。 这是侑虎科技第65篇原创文章,感谢作者邹春毅(QQ:442319386)供稿。欢迎转发分享,未

yuliying的专栏 3181

在cadence中进行sdf文件的反标及并进行数模混仿

3.在Main-Include Option Settings-Libraries Files/Directories下面加载上面说到的两个.v文件(综合文件和工艺库器件文件),其他默认点击OK;最近在做一个数模混合电路的流片工作,数字部分综合后会生成一个.sdf(标准延时格式)文件,正常来说应该是要在vcs软件上进行电路延时的反标,但由于我的电路需要信号在数字模块和模拟模块中来回循环多次,因此,打算在cadence中完成sdf文件反标,进行数模混合仿真。1.综合生成的电路网表的.v文件;

WSBHX的博客 3280

【Claude】Auto Mode 触发安全分类器拦截的三种错误变体及对应处理 bug报错已解决

深度解析Claude Auto Mode安全分类器拦截的三种变体:内容拒绝、操作中断、累积触发,含完整排查流程与绕过策略。

博客 7604
上一篇: Unity手游性能测评报告——MOBA篇
下一篇: NGUI开发优化技巧(上)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值