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

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

将这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. javascript高级程序设计读书笔记----事件

      DOM0级事件处理程序 传统处理方式,即讲一个函数赋值给一个事件处理程序属性.   DOM2级事件处理程序 addEventListener()和removeHandler()两个方法用于指定和删 ...

  2. ORM,Entity Framework介绍以及其所包含的基础架构介绍

    一:entity framework 6.0 ORM (实体关系模型) O: Domain Object 领域模型 R: Relational Database 关系型数据库 M: Mapping 映 ...

  3. 腾讯云通信UserSig生成.Net实现

    腾讯云通信后台生成usersig只有java实现代码.以下是根据java代码转换为net实现,java版GitHub地址:https://github.com/TencentVideoCloudMLV ...

  4. css3动画(animation)效果2-旋转的星球

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  5. Hibernate根据方言dialect动态连接多数据库

    Hibernate根据方言dialect动态连接多数据库 由于最近需要在web项目中动态链接不同地址的数据库,且要链接的子数据库的信息在总数据库(即web项目的主数据库)的表中,所以动手写了一个类. ...

  6. 用JS实现汉字转拼音

    <!DOCTYPE HTML> <html> <head> <title>用JS实现汉字转拼音</title> <meta chars ...

  7. 简单的数字校验JS

    /** *张衍涛 * 数字校验 v:校验的元素 l:要保留的小数点位数 */ function checkNumber(v,l){ var val=v.value; if(isNaN(val) || ...

  8. NSUserDefault存储类

    类要实现NSCoding协议 实现encodeWithCoder和initWithCoder方法 先把类的instance archive成NSData,然后存起来 TGTest *tt = [TGT ...

  9. Spark - 经典案例

    初识 Spark 大数据处理,目前还只是小白阶段,初步搭建起运行环境,慢慢学习之. 本文熟悉下 Spark 数据处理的几个经典案例. 首先将 Scala SDK 的源码导入 IDEA,方便查看和调试代 ...

  10. [转] Ansible 进阶 | facts 缓存

    [From] https://blog.csdn.net/bruce_6/article/details/81328975 什么是 Ansible factsAnsible facts 是远程系统的信 ...