人物换装是动作类游戏必不可少的一个功能,本篇就介绍一个简易的换装功能,如要换装,人物身体肯定会拆分成几个部分,如头部,武器,身体等,每个部分都有一个SkinnedMeshRenderer组件,这个组件有三个重要元素,分别是bone(骨骼)、material(材质)、mesh(网格信息),根据这些进行蒙皮计算。若要实现换装,将待换部件的SkinnedMeshRenderer组件的信息替换原部件即可。本篇文章中的代码实现的功能为:角色的血量在高于某一个设定值的时候是正常衣服,否则换为破洞衣服。测试时将完整衣服与破洞衣服对应的.FBX拖拽到脚本即可,具体代码如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class ChangeSkin : MonoBehaviour
{[Header("破洞衣服")]public GameObject lousyClothes;//破洞衣服[Header("完整衣服")]public GameObject fullClothes;//完整衣服[Header("换装血量百分比")]public float percent;//换装血量百分比private Player _player;//人物控制脚本,存贮人物血量、ID等信息private GameObject _clothes;//当前人物的衣服private GameObject _flagClothes;//衣服换装标志private List<Transform> _bones;//存储Skin合并后的骨骼引用private GameObject _rootBone;//根骨骼void Start (){_player=transform.GetComponentInParent<Player>();_rootBone = gameObject.transform.FindChildByName ("Bip001 Pelvis").gameObject;//根骨骼名字会不同_bones = new List<Transform> ();_clothes = fullClothes;_flagClothes = _clothes;ChangeSkinnedMesh ();}void Update(){//根据血量来控制人物所穿的衣服if (_player.Life>_player.MaxLife*percent)_clothes = fullClothes;else _clothes = lousyClothes;//为避免每帧都调用ChangeSkinnedMesh()方法重构,仅当检测到衣服变化进行调用if (_clothes.name!=_flagClothes.name) {ChangeSkinnedMesh ();_flagClothes=_clothes;}}public void ChangeSkinnedMesh(){_bones.Clear ();List<CombineInstance> combineInstances = new List<CombineInstance> ();List<Material> materials = new List<Material> ();Transform[] transforms = _rootBone.GetComponentsInChildren<Transform> (true);if (_clothes==null ) return;SkinnedMeshRenderer smr = _clothes.GetComponentInChildren<SkinnedMeshRenderer> ();//将要更换衣服的SkinnedMeshRenderer组件上的信息记录保存下来if (smr!=null) {for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++) {for (int j = 0; j < smr.bones.Length; j++) {for (int index = 0; index < transforms.Length; index++) {if (smr.bones [j].name.Equals (transforms [index].name)) {_bones.Add (transforms [index]);break;}}}CombineInstance ci = new CombineInstance ();ci.mesh = smr.sharedMesh;ci.subMeshIndex = sub;combineInstances.Add (ci);}materials.AddRange (smr.sharedMaterials);}//将原来的SkinnedMeshRenderer删除,将更换信息的添加上去SkinnedMeshRenderer oldSkin = GetComponent<SkinnedMeshRenderer> ();if (oldSkin != null) {GameObject.DestroyImmediate (oldSkin);}SkinnedMeshRenderer newSmr = gameObject.AddComponent<SkinnedMeshRenderer> ();newSmr.sharedMesh = new Mesh ();newSmr.sharedMesh.CombineMeshes (combineInstances.ToArray (), false, false);newSmr.bones = _bones.ToArray ();newSmr.rootBone = _rootBone.transform;newSmr.materials = materials.ToArray ();}
}

本篇博客参考博文:浅谈角色换装功能–Unity简单例子实现,有关更多换装详细介绍可进行查看。

Unity简易实现人物换装功能相关推荐

  1. unity之游戏角色换装实现

    http://www.cnblogs.com/shamoyuu/p/6505561.html 一.换装原理 游戏角色换装分为以下几步: 1.替换蒙皮网格 2.刷新骨骼 3.替换材质 上面这种是比较简单 ...

  2. 浅谈角色换装功能--前置篇【骨骼,蒙皮,动作】

    无论是AAA级的主机游戏,还是层出不穷的移动端游戏,角色换装几乎都是必不可少的功能,有的甚至是核心功能,像暗黑3和魔兽世界的幻化系统(如图1).这个功能没什么新鲜点.网上关于Unity换装的文章不胜枚 ...

  3. 3D游戏中人物换装解决方案

    换装基本上是每个网游都必须有的一个功能,每种网游的做法都各有不同,有些是换掉整个模型,有些则是通过可以换掉模型的一个部分完成.前者属于整体换,相对简单些:后者则是通过部分替换实现,目前用的比较多,本文 ...

  4. 关于cocos creator换装功能的实践与思考

    2019独角兽企业重金招聘Python工程师标准>>> 最近在做一个基于cocos creator的微信小游戏,其中一个主要的功能是给角色进行换装.先来说下开发环境: cocos c ...

  5. android 试衣间源码,AR开发实战EasyAR项目之AR试衣间(人物换装)

    一.主要框架视图 二.关键代码 AvatarButton using System.Collections; using System.Collections.Generic; using Unity ...

  6. Unity3D人物换装

    这个Demo主要是基于SkinnedMeshRenderer,对其中元素做修改达到改变模型外形与装饰的效果. //换贴图,直接把这段代码加在要换贴图的模型上即可; private var eyeind ...

  7. unity游戏中的换装换色

    游戏中经常遇到给角色换装染色的需求,通过换装换色可以使的资源不增加的基础上在本来的衣服套数翻倍,策划可在这上挖坑,废话不多说,进入正题 主要分为两部分 1.换装 一个角色每个需要更换的部位都是一个单独 ...

  8. unity2d 换装功能实现

    相关文档 https://docs.unity3d.com/Packages/com.unity.2d.animation@3.1/manual/FFanimation.html 1 导入图片,点击S ...

  9. 纯前端实现登记照压缩宽高体积大小和换装功能

    感觉目前绝大部分的登记照制作网站和APP们,都是通过把图片传输到后台来进行图片的各种处理的.但实际上这样非常消耗服务端的各种资源,并且对于服务端的网络带宽也带来很大压力.其实在前端使用canvas实现 ...

最新文章

  1. 读后感与机翻《整体的三维场景解析和重建从单一的RGB图像》
  2. 阿里腾讯裁员冲上热搜,消息称最高涉及30%,官方未回应
  3. YOLO之父退出CV界表达抗议,拒绝AI算法用于军事和隐私窥探
  4. layui时间怎么设置年月日时分秒_安卓手机便签敬业签到时间提醒后怎么设置延时30分钟再提醒?...
  5. 简单的session共享的封装
  6. P1199 三国游戏
  7. 打破冷漠僵局文章_研究僵局–第2部分
  8. java 最优化_java-多维度求最优解
  9. kryoserializer java_使用Kryo序列化任意Java对象(获取IllegalAccess...
  10. 如何使用putExtra()和getExtra()来表示字符串数据
  11. 维护删除订单后,清空安装和售后信息;条码打印软件补充打印问题
  12. 超宽带 DWM1000模块 电气规格
  13. <毕业设计>最适合大学生的12个Java系统项目(附源码)
  14. c语言注释中文,Comments(注释符)
  15. Pine脚本 | 如何编写移动平均线?(附案例)
  16. [渝粤教育] 西南科技大学 语文教材教法 在线考试复习资料2021版
  17. Could not initialize proxy - the owning Session was closed ---Hibernate与延迟加载:
  18. 猫眼爬取专业评分的python技术
  19. 济南江苏商会成立 全国工商联·万祥军:商协社团厚德聚苏商
  20. PostgreSQL AUTO INCREMENT

热门文章

  1. 内核编译图文教程,usb键盘鼠标篇
  2. java面试……面霸养成记
  3. 渗透测试完全初学者指南pdf_Google Analytics初学者完全指南
  4. 自动点名用matlab怎么做,一种自动点名方法与流程
  5. 360每日趣玩弹窗怎么彻底删除?
  6. 从键盘任意输入一个年份,和一个月份,输出该年这个月份有多少天,用程序实现 比如: 输入年份: 2021 输入月份: 12 输出:2021年12月份共
  7. 路由虚拟化之梦--准备
  8. 中科爱讯WiFi探针的功能用途与应用领域
  9. vertx zookeeper集群
  10. 怎样配置Java开发环境?步骤详解