根据Siki学院的换装教程,有需要可以自行去学习,完整项目我上传了

在这:https://download.csdn.net/download/qq_34421469/12251517

主要代码贴在下面

using UnityEngine;
using System.Collections;
using System.Collections.Generic;public class AvatarSys : MonoBehaviour
{public static AvatarSys instance;//来源模型private Transform source;//目标骨架private Transform target;//存放来源模型的信息,分别为部位名字,部位编号,部位的SkinnedMeshRenderer组件//根据部位名字,部位编号取得想要的部位private Dictionary<string, Dictionary<string, SkinnedMeshRenderer>> sourceData =new Dictionary<string, Dictionary<string, SkinnedMeshRenderer>>();//存放目标骨架的信息,分别为部位名字,部位上的SkinnedMeshRenderer组件//没有编号是因为target上只有一套private Dictionary<string, SkinnedMeshRenderer> targetSmr =new Dictionary<string, SkinnedMeshRenderer>();//存放目标骨架的骨架信息,用于mesh绑定骨架private Transform[] hips;//部位信息,目标骨架初始化为模型时需要的部位,注意命名是依据来源模型上的部位命名的string[,] avatarStr = new string[,]{{"face","1"},{"hair","1"},{"pants","1"},{"shoes","1"},{"top","1"},{"eyes","1" } };// Use this for initializationvoid Start(){instance = this;InstantiateSource();//实例化来源模型InstantiateTarget();//实例化目标骨架SaveData();//存储来源模型和目标骨架的信息InitAvatar();//将目标骨架初始化为模型}private void Update(){if (Input.GetMouseButtonDown(0)){int i = Random.Range(1, 5);ChangeMesh("hair", i.ToString());}}/// <summary>/// 加载模型资源/// </summary>void InstantiateSource(){GameObject sourceObj = Instantiate(Resources.Load("FemaleModel")) as GameObject;source = sourceObj.transform;sourceObj.SetActive(false);}/// <summary>/// 加载目标显示物体/// </summary>void InstantiateTarget(){GameObject targetObj = Instantiate(Resources.Load("FemaleTarget")) as GameObject;target = targetObj.transform;hips = target.GetComponentsInChildren<Transform>();}/// <summary>/// 保存数据/// </summary>void SaveData(){if ((source == null) || (target == null))return;SkinnedMeshRenderer[] parts = source.GetComponentsInChildren<SkinnedMeshRenderer>(true);//true表示把隐藏部位的组件也获得foreach (SkinnedMeshRenderer part in parts){string[] partName = part.name.Split('-');if (!sourceData.ContainsKey(partName[0]))//每有一种新类型的部位{//每有一种新类型的部位就在骨架下生成一个空GameObjectGameObject partobj = new GameObject();partobj.name = partName[0];partobj.transform.parent = target;//部位类型只记录一次sourceData.Add(partName[0], new Dictionary<string, SkinnedMeshRenderer>());//targetSmr只记录一套部位的信息,例如裤子有两套模型,只记录一套的//因为target是用来展示的,各种部位只要一套即可targetSmr.Add(partName[0], partobj.AddComponent<SkinnedMeshRenderer>());}//sourceData记录所有部位信息sourceData[partName[0]].Add(partName[1], part);}}/// <summary>/// 换装(Mesh,骨骼,材质)/// </summary>/// <param name="part"></param>/// <param name="num"></param>public void ChangeMesh(string part, string num)//传入部位名字,编号{//因为sourceData记录所有部位信息,所以可以查找到所要的新的部位SkinnedMeshRenderer smr = sourceData[part][num];List<Transform> bones = new List<Transform>();//根据新的部位绑定的骨架信息,在target的骨架上找到相应的位置//例如头发mesh,在source中它绑定在脑袋上,那么我们在target上也要找到脑袋这个位置foreach (Transform bone in smr.bones){foreach (Transform hip in hips){if (hip.name == bone.name){bones.Add(hip);break;}}}targetSmr[part].materials = smr.materials;//更换材质targetSmr[part].sharedMesh = smr.sharedMesh;//更换meshtargetSmr[part].bones = bones.ToArray();//将mesh绑定到合适的骨架中}/// <summary>/// 初始化模型/// </summary>void InitAvatar(){int length = avatarStr.GetLength(0);for (int i = 0; i < length; i++){ChangeMesh(avatarStr[i, 0], avatarStr[i, 1]);}}}

场景界面如下

Unity3D简单换装系统相关推荐

  1. Unity3D简单的打飞机游戏

    Unity3D简单的打飞机游戏 这是下载地址,请自行下载 这是下载地址,请自行下载

  2. [unity3D]简单实现FPS中的射击功能

    [Unity3D]最简单最详细的第一人称射击教程 自学Unity3D一段时间,看到在网上有很多有关于Unity3D第一人称射击教程,但是大多数教程都比较复杂难懂,在这里我介绍一个比较简单实用的方法供大 ...

  3. Unity3D简单电影视图编辑

    转载自:http://www.cnblogs.com/twjcnblog/archive/2012/03/21/2409749.html 游戏中,经常会有这样的需求,即播放一段电影,给玩家更好的体验. ...

  4. Unity3D简单的UI系统

    Unity3d的ugui如果用得不好,非常的影响性能,可能很多人都不知道,其实ugui是基于网格模型渲染的,一个ugui组件就是一个Mesh,ui组件的Material为空,其实他是用了默认的Mate ...

  5. Unity3d 简单的小球沿贝塞尔曲线运动(适合场景漫游使用)

        简单的小球沿贝塞尔曲线运动,适合场景漫游使用 贝塞尔曲线:(贝塞尔曲线的基本想法部分摘自http://blog.csdn.net/u010019717/article/details/4768 ...

  6. unity3d简单的粒子特效

    实现目标 实现一个简单的粒子效果 实现过程 首先创建一个空的对象,然后添加一个Particle System 编写控制粒子运动的脚本 在Start函数中对需要用到的参数进行初始化 particleAr ...

  7. Unity3d简单的发牌效果

    废话不多说,直接上代码 using DG.Tweening; using System.Collections; using System.Collections.Generic; using Uni ...

  8. [Unity3D]简单的UGUI滑条控制物体移动

    滑条控制物体移动 在做作业的时候需要用滑条控制物体的直线滑动,简单写了一下,在这里分享一下 1.效果 2.用法 创建一个canvas 在canvas上创建一个slider,命名为Mslider 给Ms ...

  9. Unity3D简单体积光的实现

    实现思路 为了实现一个简单的体积光效果,我们直接把模型背面的顶点按照光照方向挤出一定距离,再按照距离对颜色进行插值,就可以实现简单的体积光效果 代码实现 首先体积光是一个半透明效果,所以关闭深度写入, ...

  10. 【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式

    创建型模式-工厂三兄弟 提示:个人学习总结,如有错误,敬请指正 文章目录 创建型模式---工厂三兄弟 一.简单工厂模式 1.简单工厂模式是什么? 2.UML图 3.实现方式 二.工厂(方法)模式 1. ...

最新文章

  1. a连接带id转送不了数据_你找到了数据清洗利器?
  2. jquery ajax node,jquery ajax post json and node express
  3. JEECG 版本更新日志
  4. springboot+mybatis+mysql(增删改查xml入门编程)
  5. WXS是小程序的一套脚本语言
  6. 错误: 找不到符号_Excel函数常见特殊符号、字符解读
  7. matlab 矢量化编程(三) —— 软阈值函数
  8. 查看SQL Server被锁的表以及如何解锁【转】
  9. spring5.0学习笔记8
  10. myeclipse 创建work set 后不显示的解决方法
  11. seaborn使用boxplot函数可视化箱图并基于分组均值或者中位数进行箱图升序(ascending)排序(Sort Boxplots in Ascending Order with Python)
  12. PCIe 1. PCI与PCIe学习一——硬件篇
  13. 欧洲机器人实验室盘点
  14. RedHat认证介绍
  15. pycharm 全局搜索快捷键
  16. 苹果手机群控 ios免越狱中控 非越狱脚本高清投屏
  17. 想自己动手制作游戏动漫角色模型,教你几招,一定要看看!
  18. 电压型逆变器和电流型逆变器的不同
  19. php distinct 用法,distinct的用法
  20. 基于 Mapnik 的地图服务器

热门文章

  1. 数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版)
  2. 企业内部知识共享平台的好处-以Confluence为例
  3. 使用 craco 对 cra 项目进行构建优化
  4. 【转】 NET 下的简繁互换
  5. IE主页被篡改,修改“Internet 选项”也无法解决时的解决方法
  6. 庖丁解牛 - 图解MySQL 8.0优化器查询解析篇
  7. ftp 227 entering passive mode
  8. 实现Web前端 live2dw小人物的显示
  9. 计算机软件系统崩溃,电脑软件打开后闪退或崩溃怎么办
  10. 桌面图标出现混乱,图标文件混乱无法显示怎么修复