这里的做法是模型把所有衣服全部穿上作为一个资源

然后还有一个只有骨骼信息的骨架资源

将这2个制作好了Prefab

模型部件数据

资源数据

【代码】

using System.Collections;
using System.Collections.Generic;
using UnityEngine; public class AvatarSystem : MonoBehaviour { //模型全文件
GameObject modelObject;
Transform modelSource;
//骨骼文件
GameObject targetSource;
Transform targetTrans;
//Data字典 存储source的各种信息;
private Dictionary<string, Dictionary<string, Transform>> data = new Dictionary<string, Dictionary<string, Transform>>();
//targetSmr字典 存储目标的骨骼信息
private Dictionary<string, SkinnedMeshRenderer> targetSmr = new Dictionary<string, SkinnedMeshRenderer>();
//骨骼数组
private Transform[] hips;
//套装数据
string[,] avatarStr = new string[,] { { "Glove", "suit01" }, { "Head", "suit01" }, { "Hair", "suit01" }, { "Body", "suit02" }, { "Leg", "suit03" }, { "Shoe", "suit03" } }; // Use this for initialization
void Start () {
InstantiateAvatar("Prefab/Model_girl");//读取模型文件
InstantiateSkeleton("Prefab/Target_girl");//读取骨架文件
LoadAvatarData(modelSource);//读取模型所有衣服数据,并且存储
hips = targetTrans.GetComponentsInChildren<Transform>();//拿取人物骨骼信息
Inivatar(avatarStr);//换上套装
//targetSource.AddComponent<Animator>();
} // Update is called once per frame
void Update () { } //实例化来源
void InstantiateAvatar(string modelName)
{
//必需得实例化出来,不然无法获得数据
modelObject = (Instantiate(Resources.Load<GameObject>(modelName)));
modelSource = modelObject.transform;
modelSource.gameObject.SetActive(false);//隐藏
//Destroy(modelObject);//销毁
}
//实例化骨架(换装就是在骨架上加衣服)
void InstantiateSkeleton(string targetName)
{
targetSource = Instantiate(Resources.Load<GameObject>(targetName));
targetTrans = targetSource.transform;
}
//读取来源的各种信息(source模型源文件)
void LoadAvatarData(Transform source)
{
if (source == null)
{
return;
}
SkinnedMeshRenderer[] parts = source.GetComponentsInChildren<SkinnedMeshRenderer>(true);
foreach (SkinnedMeshRenderer part in parts)
{
string[] partName = part.name.Split('_');
if (!data.ContainsKey(partName[]))
{
data.Add(partName[], new Dictionary<string, Transform>());
GameObject partObj = new GameObject();
partObj.name = partName[];
partObj.transform.parent = targetTrans;
targetSmr.Add(partName[], partObj.AddComponent<SkinnedMeshRenderer>());
}
data[partName[]].Add(partName[], part.transform);
}
}
//更改Mesh
public void ChangeMesh(string part, string item)
{
SkinnedMeshRenderer smr = data[part][item].GetComponent<SkinnedMeshRenderer>();
//网格合并
List<CombineInstance> combineInstances = new List<CombineInstance>();
for (int i = ; i < smr.sharedMesh.subMeshCount; i++)
{
CombineInstance ci = new CombineInstance();
ci.mesh = smr.sharedMesh;
ci.subMeshIndex = i;
combineInstances.Add(ci);
}
List<Transform> bones = new List<Transform>();
foreach (Transform bone in smr.bones)
{
foreach (Transform hip in hips)
{
if (hip.name != bone.name)
{
continue;
}
bones.Add(hip);
break;
}
} //网格合并方式
targetSmr[part].sharedMesh = new Mesh();
targetSmr[part].sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);
//非网格合并方式
//targetSmr[part].sharedMesh = smr.sharedMesh;
targetSmr[part].bones = bones.ToArray();
targetSmr[part].materials = smr.materials; } /// <summary>
/// 换装(换1件到多件)
/// </summary>
/// <param name="avatarStr"></param>
public void Inivatar(string[,] avatarStr)
{
int nLength = avatarStr.GetLength();
for (int i = ; i < nLength; i++)
{
ChangeMesh(avatarStr[i, ], avatarStr[i, ]);
}
}
}

unity换装系统+网格合并的更多相关文章

  1. Unity 网格合并

    从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装,那么需要合并SkinnedMeshRenderer, ...

  2. Unity网格合并_材质合并

    [转]Unity网格合并_材质合并 原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网 ...

  3. 【转】Unity网格合并_材质合并

    原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装, ...

  4. unity 3d 之合并网格和贴图(combine mesh and texture)

    https://www.cnblogs.com/eangulee/p/3877824.html unity 3d 之合并网格和贴图(combine mesh and texture)   本人是个小白 ...

  5. Unity3d mesh合并,网格合并具体用法教程

    Unity开发Mesh合并网格 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  6. 雷林鹏分享:jQuery EasyUI 数据网格 - 合并单元格

    jQuery EasyUI 数据网格 - 合并单元格 数据网格(datagrid)经常需要合并一些单元格.本教程将向您展示如何在数据网格(datagrid)中合并单元格. 为了合并数据网格(datag ...

  7. Unity3d网格合并

    几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化. 在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上. Combi ...

  8. Unity --- MeshRenderer之网格合并

    创建如图所示的对象结构,parent为空对象,然后将下面的代码挂载到parent对象上运行即可. using UnityEngine; using System.Collections; public ...

  9. Unity网格合并_材质合并[转]

    http://blog.csdn.net/chenggong2dm/article/details/41699029

随机推荐

  1. GridView中合并单元格

    using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Da ...

  2. map的回调函数

    问题:--js   (['1','2','3']).map(parseInt) 第一眼看到这个题目的时候,脑海跳出的答案是 [1, 2, 3],但是真正的答案是[1, NaN, NaN]. 首先让我们 ...

  3. Android通知栏介绍与适配总结(上篇)

    此文已由作者黎星授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 由于历史原因,Android在发布之初对通知栏Notification的设计相当简单,而如今面对各式各样的通知 ...

  4. OI树上问题 简单学习笔记

    判断链 每个点的度数不超过2 判断树 n个点,n-1条边 每两个点之间的路径唯一 多叉树转换成二叉树 第一个孩子作为左孩子,第一个孩子的兄弟作为它的右孩子. 树的重心 树上一点,满足删除该点时,树内剩 ...

  5. gulp 图片、样式、js、实时刷新等压缩gulpfile.js文件各个模块

    1.压缩tinypng图片   gulp-tinypng-nokey,但不压缩gif格式(另外一个gulp-imagemin压缩率不高,可以压缩gif格式) // 获取 gulp var gulp = ...

  6. Excel的公式:锁定某个区域函数--OFFSET()

    OFFSET(标识位置,偏移的行数,偏移的列数,偏移后锁定的行数,偏移后锁定的列数) 打个比方解释:在xy轴上画一个矩形 标识位置:等同于原点; 偏移的行数:矩形的起始y轴坐标; 偏移的列数:矩形的起 ...

  7. PL/SQL那点事-->SqlSession operation; SQL []; ORA-01722: 无效数字

    PL/SQL那点事-->SqlSession operation;SQL []; ORA-01722: 无效数字 出现这种情况,在网上查了很多方法:大致主要有两种方法帮助我们解决这个问题: 1. ...

  8. [开源] angularjs + Asp.net 前后端分离解决方案

    本文版权归 博客园 萧秦 所有,此处为技术收藏,如有再转,请于篇头明显位置标明原创作者及出处,以示尊重! 作者:萧秦 原文:http://www.cnblogs.com/xqin/p/4862849. ...

  9. UIViewController读书笔记

    当一个VC把另一个VC作为子view加到自己的view时,一定要先调用addChildViewController(_:)方法. 因为一个VC的root view,也就是VC的view只能被这个VC持 ...

  10. TX2之多线程读取视频及深度学习推理

    背景 一般在TX2上部署深度学习模型时,都是读取摄像头视频或传入视频文件进行推理,从视频中抽取帧进行目标检测等任务.对于大点的模型,推理的速度是赶不上摄像头或视频的帧率的,如果我们使用单线程进行处理, ...