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

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

将这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. Vue.js的库,包,资源的列表大全。

    官方资源 外部资源 社区 播客 官方示例 入门 开发工具 语法高亮 代码片段 自动补全 组件集合 库和插件 路由 ajax/数据 状态管理 校验 UI组件 i18n 示例 模板 脚手架 整合 插件/指 ...

  2. RobotFramework做接口自动化(内部接口需要登录token)

    背景: 项目中需要做接口自动化测试,使用robot,有一个收货地址列表的接口直接传参数访问时会返回:{"msg":"缺少参数","code" ...

  3. 用Docker自动构建纸壳CMS

    纸壳CMS可以运行在Docker上,接下来看看如何自动构建纸壳CMS的Docker Image.我们希望的是在代码提交到GitHub以后,容器镜像服务可以自动构建Docker Image,构建好以后, ...

  4. 为微软ContosoUniversity例子加上学生自选课程计划

    把ContosoUniversity例子过了一遍,好象还是有很多东西未能理解,决定自己随便加个功能看可以自己完成不.... 从github的例子中clone下来ContosoUniversity项目, ...

  5. C语言程序设计

    从 大一下 开始写博客,记录自己的学习. 而作为一个强迫症(比如我)是不允许做事缺头少尾的. 想了想还是得大一所学的C语言也搬上来,虽然结构老师经常嘲讽 (也不算嘲讽,算是絮叨吧)我的C语言,但是我还 ...

  6. git .gitignore忽略规则不生效解决办法

    忽略规则不生效, 原因是.gitignore只能忽略那些原来没有被track的文件, 如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的. 那么解决方法就是先把本地缓存删除(改变成 ...

  7. lua luna工具库

    luna工具库 概述 luna库提供了几个lua开发的常见辅助功能: lua/c++绑定 lua序列化与反序列化 变长整数编码,用于lua序列化,当然也可以方便的用于其他场合 这里把代码编译成了动态库 ...

  8. 910. Smallest Range II

    Given an array A of integers, for each integer A[i] we need to choose either x = -K or x = K, and ad ...

  9. binlog2sql

    从MySQL binlog解析出你要的SQL.根据不同选项,你可以得到原始SQL.回滚SQL.去除主键的INSERT SQL等. 安装 shell> git clone https://gith ...

  10. jvisualvm_使用jstatd连接远程linux应用

    [1]确定linux系统正确安装了ssh # sudo ps -e | grep ssh ①注意使用root,使用$会报如下错误: [appadmin@webcsuat2 ~]$ sudo ps -e ...