基于共享骨骼简单高效的换装方案

本文介绍Unity中实现角色换装的技术细节,重点讲解共享骨骼方法。通过将部件模型的骨骼共享给主模型,实现部件随主模型动画同步运动的效果。文章提供了具体的C#代码示例,帮助开发者理解如何实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

游戏的换装,一般分为3种.换材质,骨骼挂接,共享骨骼.用的比较多的是骨骼挂接和共享骨骼.

1.骨骼挂接

没有动作的骨骼挂接,适合武器.

有动作的骨骼挂接,适合坐骑.

2.共享骨骼

共享骨骼,适合身体部件.主模型(身体)包含整个骨骼,部件模型只包含自己部分的骨骼,应用的时候,部件模型的骨骼共享主模型的骨骼.这样的话,只需要播放主模型的动画,部件会跟着动.

Unity的换装呢,你要百度一下,能搜出一堆文章,方法也是多种多样.有参考价值的却不多.

比如主流推荐的官方demo提供的换装方式.合并mesh,多此一举又麻烦.

比如avatar的方式 ...不适合Legacy动画

其实用以前端游的方式,共享骨骼就行了,Ogre引擎直接提供函数OGRE::shareSkeletonInstanceWith()来实现.而Unity引擎没有这个函数,怎么办呢,自己写一个呗.命名我也取一样的,表示对Unity自己不封装这个函数的鄙视.

[csharp]  view plain  copy
  1. // 共享骨骼  
  2. public static void ShareSkeletonInstanceWith(SkinnedMeshRenderer selfSkin, GameObject target)  
  3. {  
  4.     Transform[] newBones = new Transform[selfSkin.bones.Length];  
  5.     for (int i = 0; i < selfSkin.bones.GetLength(0); ++i)  
  6.     {  
  7.         GameObject bone = selfSkin.bones[i].gameObject;  
  8.         // 目标的SkinnedMeshRenderer.bones保存的只是目标mesh相关的骨骼,要获得目标全部骨骼,可以通过查找的方式.  
  9.         newBones[i] = FindChildRecursion(target.transform, bone.name);  
  10.     }  
  11.     selfSkin.bones = newBones;     
  12. }  
  13.   
  14. // 递归查找  
  15. public static Transform FindChildRecursion(Transform t, string name)  
  16. {  
  17.     foreach (Transform child in t)  
  18.     {  
  19.         if (child.name == name)  
  20.         {  
  21.             return child;  
  22.         }  
  23.         else  
  24.         {  
  25.             Transform ret = FindChildRecursion(child, name);  
  26.             if (ret != null)  
  27.                 return ret;  
  28.         }  
  29.     }  
  30.     return null;  
  31. }  

代码很简单,原理我再结合Unity仔细分析下.

第一步 :

假设整个模型分两部分,身体和翅膀,身体作为主模型,翅膀作为部件模型,身体30根骨骼,翅膀6根骨骼,总数量36根骨骼.

1.导出身体模型的时候,选中身体和整个骨骼(注意是整个骨骼),这样身体也包含了翅膀的骨骼.

2.导出翅膀模型的时候,选中翅膀和翅膀骨骼(翅膀不用导整个骨骼).

第二步:

模型有哪些骨骼,可以放入Unity查看root下面的节点 ,这里有个注意的地方,通过SkinnedMeshRenderer.bones查看的骨骼数量总是比通过root节点查看的数个数量少,因为SkinnedMeshRenderer.bones保存的模型真正用到的骨骼,而不是整个骨骼,比如身体模型的SkinnedMeshRenderer.bones只有30,而不是36.

第三步:

平级挂接2个模型到同一个父节点下测试,播放身体模型的动画,身体会动,翅膀不会,很正常,因为动的是身体模型的骨骼,翅膀模型的骨骼根本就没动.接下来把翅膀模型的6个骨骼设置成身体模型对应的那6个骨骼的transform,再播放,就发现翅膀也跟着动了,所谓共享,就是对应的把自己的骨骼设置成目标的骨骼.

函数调用很简单 ShareSkeletonInstanceWith(翅膀, 身体)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值