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

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

将这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. Linq实战 之 Linq to Sql及Entity Framework操作详解

    Linq实战 之 Linq to Sql及Entity Framework操作详解 一:linq to db的框架 1. linq to sql 2. linq to ado.net entity f ...

  2. 基于SSH的网上购物商城系统-JavaWeb项目-有源码

    开发工具:Myeclipse/Eclipse + MySQL + Tomcat 项目简介: 基于WEB的网上购物系统主要功能包括:前台用户登录退出.注册.在线购物.修改个人信息.后台商品管理等等.本系 ...

  3. [LeetCode 题解]: Permutations

    Given a collection of numbers, return all possible permutations. For example,[1,2,3] have the follow ...

  4. Tomcat负载均衡原理详解及配置(Apache2.2.19+Tomcat7.0.12)

    结构图 JAVA项目一般直接用Tomcat作为Web服务器.为了增加tomcat的性能和稳定性,我们一般采用balance和session同步机制. 下图列出了我们常用也是最简单的解决方案. 说明 1 ...

  5. 【05】循序渐进学 docker:系统资源和网络

    写在前面的话 在上一篇学习 Dockerfile 的时候其实还有几个相当重要得关键中没有谈到,但没关系,在后面的内容会单独提出来一个一个的学习.这里就先谈谈关于资源的控制个容器的网络~ 资源限制 其实 ...

  6. python基础,变量,if语句

     一.python初识 python是一门 解释型弱类型编程语言. 特点: 简单.明确.优雅 二.python的解释器 CPython. 官方提供的. 内部使用c语言来实现 PyPy. 一次性把我们的 ...

  7. 小记一次shellscript的麻烦

    小记一次shellscript的麻烦 一.起因: 之前写过篇文章 文本分析实例 ,大致的内容就是对 "nginx的web服务器进行日志分析,删除不被访问的截图". 点我打开哔哩哔哩 ...

  8. 《Fixed Income Portfolio Analytics》阅读笔记——第零部分

    <Fixed Income Portfolio Analytics>第零部分的思维导图. <Fixed Income Portfolio Analytics>阅读笔记--第零部 ...

  9. python爬虫urllib库使用

    urllib包括以下四个模块: 1.request:基本的HTTP请求模块,可以用来模拟发送请求.就像在浏览器里输入网址然后回车一样,只需要给库方法传入URL以及额外的参数,就可以模拟实现这个过程. ...

  10. 微信小程序 没有找到node_modules目录 ,小程序引入vant框架报错。

    如果大家是按照官网的引入方法,是否报错如图 不着急,大家就试试我的方法吧!两步走完美搞定! 第一步: 在小程序顶部点击设置->项目设置,会弹出下面的窗口.大家把使用npm模块勾上对勾. 第二步: ...