Unity 实现 角色的换装
换装的三个要点 材质 网格 模型
unity中换装 即更改角色部位上的skinnedMeshRender组件的属性
更换mesh
mesh 和骨骼的重新绑定
最后更换材质
一个模型 带有skinnedMeshRender组件 的子节点 和对应坐标信息的骨骼绑定的子节点
face-1 中的root bone 就对应着female_Hips
得到 skinnedMeshRender 中的材质 和mesh 加上骨骼绑定子节点的bones =新的模型
如何实现:
换装的角色带所有信息的模型预制体 (源) 让其只保留带骨骼信息点的子节点的新预制体(新)
保留2个预制体
将源预制体中的skinnedmeshrander信息通过字典的方式保存并传入新预制体中并在新预制体中只会每个部分单独出现。
每个替换存入字典中的mesh信息即达到换装效果。
private GameObject girlSource; // 骨骼模型资源(源)private GameObject girlTarget; // 骨骼信息(新)private Transform girlSourceTrans; // 模型信息Transform[] girlHips; // 骨骼bones信息private Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> girlData = new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>(); //小女孩所有的资源信息 //部位的名字,部位编号,部位对应的skmprivate Dictionary<string,SkinnedMeshRenderer> girlSkm = new Dictionary<string,SkinnedMeshRenderer>();//新骨骼的资源信息 一个部位对应一个meshprivate string[,] grilstr = new string[,] { { "eyes", "1" }, { "hair", "1" }, { "top", "1" }, { "pants", "1" }, { "shoes", "1" },{ "face","1"} };//实例化模型的数组信息
需要用到2个字典 Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> girlData 去遍历存储所有的带skinnendmeshrender组件的子节点
Dictionary<string,SkinnedMeshRenderer> girlSkm 存储新的单一子节点
存入信息方法
void SaveData(Transform SourceTrans,GameObject Target, Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> Data,Dictionary<string, SkinnedMeshRenderer> Skm){ //将模型资源 新预制体对象 2个字典传入Data.Clear();Skm.Clear();if(SourceTrans == null){return;}SkinnedMeshRenderer[] parts = SourceTrans.GetComponentsInChildren<SkinnedMeshRenderer>();//拿到资源下的SkinnedMeshRenderer组件属性sforeach (SkinnedMeshRenderer part in parts){string[] names=part.name.Split('-');//根据子节点命名方式 分割字符 拿到模型人物换装部位 名字 和编号if (!Data.ContainsKey(names[0])) //第一次拿到{GameObject go = new GameObject();go.name = names[0]; //重命名//生成新的skinnedmeshrender子节点go.transform.parent = Target.transform; //设置父物体go.AddComponent<SkinnedMeshRenderer>();Skm.Add(names[0], go.GetComponent<SkinnedMeshRenderer>()); //将可换装mesh信息 存入字典并赋予skimeshren 组件Data.Add(names[0], new Dictionary<string, SkinnedMeshRenderer>());//new 嵌套字典}Data[names[0]].Add(names[1], part); //存入 嵌套字典}}
void Change(string part,string num, Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> Data, Transform[] Hips,Dictionary<string, SkinnedMeshRenderer> Skms, string[,] shuzu){// 对应更改 部位 对应更改的换装编号 2个字典 存储的数组 模型bones 数组SkinnedMeshRenderer skm = Data[part][num]; //拿到嵌套字典中对应的mesh属性List<Transform> bones= new List<Transform>();foreach (var trans in skm.bones) //遍历bones 拿到mesh对应的模型bones数组中的bones{foreach(var bone in Hips){if(bone.name==trans.name){bones.Add(bone);break;}}}//更换mesh 材质 bones 达成换装Skms[part].bones = bones.ToArray();// list to数组Skms[part].materials = skm.materials; Skms[part].sharedMesh = skm.sharedMesh;//保存数据到数组中
换装的逻辑 完成
Unity 实现 角色的换装相关推荐
- 3D游戏中角色的换装原理-落樱之剑实例图文详细剖析(JME3,JMonkeyEngine游戏开发)...
**************************************************************************************************** ...
- 3D游戏中角色的换装原理-落樱之剑实例图文详细剖析(JMonkeyEngine游戏开发)
前言 本文将详细讲解3D游戏中换装的原理及换装中的一些重点问题,先粗略看一下换装的简单原理: 没错,看起来很简单吧!!! 那么接下来,开始讲复杂的地方! 在阅读本文之前如果你能够了解或知道以下一些基础 ...
- unity游戏中的换装换色
游戏中经常遇到给角色换装染色的需求,通过换装换色可以使的资源不增加的基础上在本来的衣服套数翻倍,策划可在这上挖坑,废话不多说,进入正题 主要分为两部分 1.换装 一个角色每个需要更换的部位都是一个单独 ...
- Unity简易实现人物换装功能
人物换装是动作类游戏必不可少的一个功能,本篇就介绍一个简易的换装功能,如要换装,人物身体肯定会拆分成几个部分,如头部,武器,身体等,每个部分都有一个SkinnedMeshRenderer组件,这个组件 ...
- unity之游戏角色换装实现
http://www.cnblogs.com/shamoyuu/p/6505561.html 一.换装原理 游戏角色换装分为以下几步: 1.替换蒙皮网格 2.刷新骨骼 3.替换材质 上面这种是比较简单 ...
- unity 3d换装之 SkinMeshRenderer
http://www.cnblogs.com/shamoyuu/p/6505561.html 关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上~ 一.换装原理 游戏角色 ...
- unity教程:unity中是如何实现游戏人物换装的
现在的游戏,如果没有换装功能的话,可能会让人觉得非常以外:这个游戏连换装都没有?还能玩吗?真的,不知道大家有没有注意过,貌似绝大部分的游戏都设计到换装.比如热门的网络游戏LOL,DNF这些,LOL里面 ...
- Unity3D游戏开发之换装方法
游戏内的角色,能够像纸娃娃换装那样子让玩家可以为自己的角色改变外观,一直是相当受欢迎的功能:一般而言,我们建好的 3D 模型,如果要将其中一个部位换成另外一个形状,最直接的就是将该物件部位的 Mesh ...
- Blender建模与游戏换装(转载文)
本文转载自https://my.oschina.net/huliqing/blog/880113?hmsr=toutiao.io 如果本文涉及侵权行为,请原作者联系博主邮箱,我将及时进行删除处理 博主 ...
- 关于cocos creator换装功能的实践与思考
2019独角兽企业重金招聘Python工程师标准>>> 最近在做一个基于cocos creator的微信小游戏,其中一个主要的功能是给角色进行换装.先来说下开发环境: cocos c ...
最新文章
- Zookeeper源码分析:Leader角色初始化
- Core Animation1-简介
- NodeJS学习之网络操作
- node.js express项目搭建
- python的编程模式-使用简单工厂模式来进行Python的设计模式编程
- Runtime之IMP指针,isa指针
- linux 追加多行文件,linux多行文件信息追加
- calendar获取本周一的日期_Java Calendar 获取本周周一和周日代码
- 【直播回顾】阿里高级开发工程师紫思:闲鱼多业务隔离框架SWAK...
- c mvc html 选中删除,在 MVC htmlAttribute中,如何设置被禁用_CSharp_开发99编程知识库...
- PowerShell SQL Server验证实用程序– DBAChecks
- Oct.31, 2011-减肥第一天
- Excel 数据库函数
- mysql的外文图书_外文数据库
- ❤️ 硬核玩游戏:200行代码给你整个俄罗斯方块 ❤️
- Windows Live SkyDrive 介绍之图片存储:摄影师在线图片展示的新选择
- 创客教育中常见的视觉识别摄像头介绍
- HTTP/HTML/浏览器(一)
- 14位数仿科学真计算机,十四位数仿真计算器
- [转帖]Photoshop制作梦幻效果婚纱照片
热门文章
- microusb贴片 ad封装_diy从pcb到焊接,到程序调试,真正意思上的diy机械键盘pcb由ad绘制...
- Qt实现串口调试工具
- MMORPG游戏服务器技术选型参考
- java7723魂斗罗2_魂斗罗3代-完全版
- linux bond 网卡带宽,Linux网卡绑定实现带宽翻倍
- 为什么相敬如宾是对的?
- 元宵节要到了,给大家猜几个谜语
- java读取libs下文件_Android开发中libs和jinLibs文件夹的作用详解
- 动态规划之《高楼扔鸡蛋》问题详解 LeetCode 887.鸡蛋掉落
- html 中图片显示不了,css中不显示图片怎么办