Unity3D简单换装系统
根据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简单换装系统相关推荐
- Unity3D简单的打飞机游戏
Unity3D简单的打飞机游戏 这是下载地址,请自行下载 这是下载地址,请自行下载
- [unity3D]简单实现FPS中的射击功能
[Unity3D]最简单最详细的第一人称射击教程 自学Unity3D一段时间,看到在网上有很多有关于Unity3D第一人称射击教程,但是大多数教程都比较复杂难懂,在这里我介绍一个比较简单实用的方法供大 ...
- Unity3D简单电影视图编辑
转载自:http://www.cnblogs.com/twjcnblog/archive/2012/03/21/2409749.html 游戏中,经常会有这样的需求,即播放一段电影,给玩家更好的体验. ...
- Unity3D简单的UI系统
Unity3d的ugui如果用得不好,非常的影响性能,可能很多人都不知道,其实ugui是基于网格模型渲染的,一个ugui组件就是一个Mesh,ui组件的Material为空,其实他是用了默认的Mate ...
- Unity3d 简单的小球沿贝塞尔曲线运动(适合场景漫游使用)
简单的小球沿贝塞尔曲线运动,适合场景漫游使用 贝塞尔曲线:(贝塞尔曲线的基本想法部分摘自http://blog.csdn.net/u010019717/article/details/4768 ...
- unity3d简单的粒子特效
实现目标 实现一个简单的粒子效果 实现过程 首先创建一个空的对象,然后添加一个Particle System 编写控制粒子运动的脚本 在Start函数中对需要用到的参数进行初始化 particleAr ...
- Unity3d简单的发牌效果
废话不多说,直接上代码 using DG.Tweening; using System.Collections; using System.Collections.Generic; using Uni ...
- [Unity3D]简单的UGUI滑条控制物体移动
滑条控制物体移动 在做作业的时候需要用滑条控制物体的直线滑动,简单写了一下,在这里分享一下 1.效果 2.用法 创建一个canvas 在canvas上创建一个slider,命名为Mslider 给Ms ...
- Unity3D简单体积光的实现
实现思路 为了实现一个简单的体积光效果,我们直接把模型背面的顶点按照光照方向挤出一定距离,再按照距离对颜色进行插值,就可以实现简单的体积光效果 代码实现 首先体积光是一个半透明效果,所以关闭深度写入, ...
- 【设计模式】Unity3D 简单工厂、工厂(方法)、抽象工厂模式
创建型模式-工厂三兄弟 提示:个人学习总结,如有错误,敬请指正 文章目录 创建型模式---工厂三兄弟 一.简单工厂模式 1.简单工厂模式是什么? 2.UML图 3.实现方式 二.工厂(方法)模式 1. ...
最新文章
- a连接带id转送不了数据_你找到了数据清洗利器?
- jquery ajax node,jquery ajax post json and node express
- JEECG 版本更新日志
- springboot+mybatis+mysql(增删改查xml入门编程)
- WXS是小程序的一套脚本语言
- 错误: 找不到符号_Excel函数常见特殊符号、字符解读
- matlab 矢量化编程(三) —— 软阈值函数
- 查看SQL Server被锁的表以及如何解锁【转】
- spring5.0学习笔记8
- myeclipse 创建work set 后不显示的解决方法
- seaborn使用boxplot函数可视化箱图并基于分组均值或者中位数进行箱图升序(ascending)排序(Sort Boxplots in Ascending Order with Python)
- PCIe 1. PCI与PCIe学习一——硬件篇
- 欧洲机器人实验室盘点
- RedHat认证介绍
- pycharm 全局搜索快捷键
- 苹果手机群控 ios免越狱中控 非越狱脚本高清投屏
- 想自己动手制作游戏动漫角色模型,教你几招,一定要看看!
- 电压型逆变器和电流型逆变器的不同
- php distinct 用法,distinct的用法
- 基于 Mapnik 的地图服务器
热门文章
- 数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版)
- 企业内部知识共享平台的好处-以Confluence为例
- 使用 craco 对 cra 项目进行构建优化
- 【转】 NET 下的简繁互换
- IE主页被篡改,修改“Internet 选项”也无法解决时的解决方法
- 庖丁解牛 - 图解MySQL 8.0优化器查询解析篇
- ftp 227 entering passive mode
- 实现Web前端 live2dw小人物的显示
- 计算机软件系统崩溃,电脑软件打开后闪退或崩溃怎么办
- 桌面图标出现混乱,图标文件混乱无法显示怎么修复