unity换装系统+网格合并
这里的做法是模型把所有衣服全部穿上作为一个资源
然后还有一个只有骨骼信息的骨架资源
将这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换装系统+网格合并的更多相关文章
- Unity 网格合并
从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装,那么需要合并SkinnedMeshRenderer, ...
- Unity网格合并_材质合并
[转]Unity网格合并_材质合并 原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网 ...
- 【转】Unity网格合并_材质合并
原帖请戳:Unity网格合并_材质合并 写在前面: 从优化角度,Mesh需要合并. 从换装的角度(这里指的是换形状.换组成部件的换装,而不是挂点型的换装),都需要网格合并.材质合并.如果是人物的换装, ...
- unity 3d 之合并网格和贴图(combine mesh and texture)
https://www.cnblogs.com/eangulee/p/3877824.html unity 3d 之合并网格和贴图(combine mesh and texture) 本人是个小白 ...
- Unity3d mesh合并,网格合并具体用法教程
Unity开发Mesh合并网格 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...
- 雷林鹏分享:jQuery EasyUI 数据网格 - 合并单元格
jQuery EasyUI 数据网格 - 合并单元格 数据网格(datagrid)经常需要合并一些单元格.本教程将向您展示如何在数据网格(datagrid)中合并单元格. 为了合并数据网格(datag ...
- Unity3d网格合并
几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化. 在Unity3d中构建临时场景如下:建一C#脚本名为"CombineMeshes",挂在Cube上. Combi ...
- Unity --- MeshRenderer之网格合并
创建如图所示的对象结构,parent为空对象,然后将下面的代码挂载到parent对象上运行即可. using UnityEngine; using System.Collections; public ...
- Unity网格合并_材质合并[转]
http://blog.csdn.net/chenggong2dm/article/details/41699029
随机推荐
- Promises讲解
原生 Promises 是在 ES2015 对 JavaScript 做出最大的改变.它的出现消除了采用 callback 机制的很多潜在问题,并允许我们采用近乎同步的逻辑去写异步代码. 可以说 pr ...
- PowerDesigner Comment与Name相互替换
从name替换comment Option Explicit ValidationMode = True InteractiveMode = im_Batch Dim mdl ' the curren ...
- [Mac] 获取cpu信息
[Mac] 获取cpu信息 命令行获取cpu信息 sysctl machdep.cpu output like machdep.cpu.tsc_ccc.denominator: 0 machdep.c ...
- Transaction And Lock--常用的查询事务和锁的语句
--===================================================== --查看当前运行事务 SET TRANSACTION ISOLATION LEVEL R ...
- uwsgi启动Django项目时:unable to load app 0 (mountpoint='') (callable not found or import error) *** no app loaded. going in full dynamic mode ***
说起来有点坑 用命令都能正常启动,但是用配置文件就是不行 提示 unable to load app (mountpoint='') (callable not found or import err ...
- sql字段操作
--删除第一位 substring(ftpMobile,2,len(ftpMobile)-1) --检查是否是数字 ISNUMERIC(ftpMobile) =0 含数字以外字符 ISNUMERIC ...
- C# 连接Oracle,并调用存储过程(存在返回值),C# 调用sql存储过程
1.获取Oracle表格信息 public OracleHelpers(string ConnStr) { ConnectionString = ConnStr; conn = new OracleC ...
- centos6和7的防火墙开关
CentOS6.5查看防火墙的状态: 1 [linuxidc@localhost ~]$service iptable status 显示结果: 1 2 3 4 5 [linuxidc@localho ...
- [Perl][文件操作]判断文件是否为符号链接(Unicode路径)
Win32API::File 判断文件/文件夹是否为符号链接 Win32::Unicode 好像无法做这方面的判断,只能判断是否为目录.文件.文件是否存在. Win32API::File 则支持 Ge ...
- 201621123023《Java程序设计》第4周学习总结
一.本周学习总结 1.1 写出你认为本周学习中比较重要的知识点关键词 继承.多态.覆盖.重载 1.2 尝试使用思维导图将这些关键词组织起来.注:思维导图一般不需要出现过多的字. 二.书面作业 1. 面 ...