unity3d Mesh合并

原创 2016年08月30日 10:54:19

1:合并mesh 和 材质球,       挂在对象上,运行场景即可。(父物体必须有mesh和材质球)

using UnityEngine;

using System.Collections;


public class Combine_Test : MonoBehaviour
{


    // Use this for initialization
    void Start()
    {
        //---------------- 先获取材质 -------------------------
        //获取自身和所有子物体中所有MeshRenderer组件
        MeshRenderer[] meshRenderers = GetComponentsInChildren<MeshRenderer>();
        //新建材质球数组
        Material[] mats = new Material[meshRenderers.Length];
        for (int i = 0; i < meshRenderers.Length; i++)
        {
            //生成材质球数组 
            mats[i] = meshRenderers[i].sharedMaterial;
        }
        //---------------- 合并 Mesh -------------------------
        //获取自身和所有子物体中所有MeshFilter组件
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];
        for (int i = 0; i < meshFilters.Length; i++)
        {
            combine[i].mesh = meshFilters[i].sharedMesh;
            //矩阵(Matrix)自身空间坐标的点转换成世界空间坐标的点 
            //combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            combine[i].transform = transform.worldToLocalMatrix * meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);
        }
        //为新的整体新建一个mesh
        transform.GetComponent<MeshFilter>().mesh = new Mesh();
        //合并Mesh. 第二个false参数, 表示并不合并为一个网格, 而是一个子网格列表
        transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine, false);
        transform.gameObject.SetActive(true);


        //为合并后的新Mesh指定材质 ------------------------------
        transform.GetComponent<MeshRenderer>().sharedMaterials = mats;
    }


  

}

2:只合并mesh  并 保存 

using UnityEngine;
using System.Collections;
using System.Collections.Generic;

//合并  挂在对象上
public class MyMeshClass : MonoBehaviour
{
    void Start()
    {
        MeshFilter[] meshFilters = GetComponentsInChildren<MeshFilter>();
        CombineInstance[] combine = new CombineInstance[meshFilters.Length];
        int i = 0;


        while (i < meshFilters.Length)
        {


            combine[i].mesh = meshFilters[i].sharedMesh;


            //combine[i].transform = meshFilters[i].transform.localToWorldMatrix;
            combine[i].transform = transform.worldToLocalMatrix * meshFilters[i].transform.localToWorldMatrix;
            meshFilters[i].gameObject.SetActive(false);


            i++;


        }
        transform.GetComponent<MeshFilter>().mesh = new Mesh();
        transform.GetComponent<MeshFilter>().mesh.CombineMeshes(combine);
        transform.gameObject.SetActive(true);
        }
}

//保存合并后新生成的Mesh  此脚本放在Edit文件夹下,不然发布会报错

using UnityEngine;
using System.Collections;
using UnityEditor;




public class EditorTools : MonoBehaviour
{
[MenuItem("Tools/Save Combine Mesh")]
    public static void SaveMesh()
    {
        Mesh m = Selection.activeGameObject.GetComponent<MeshFilter>().sharedMesh;
        AssetDatabase.CreateAsset(m, "Assets/cmbMesh.asset");
        AssetDatabase.SaveAssets();
    }
}

Unity3D Mesh小课堂(五)CombineMeshes合并网格

合并网格可以提升性能,而且也可以让我们更好更灵活的管理模型。 有些时候我们会希望多个模型使用同一个Collider,但是我们显然不能让美术再给我们专门为碰撞做模型来。因为他们可能会有不同的组合,或者跟...
  • ecidevilin
  • ecidevilin
  • 2016年09月09日 23:40
  • 7337

Unity3d 人物换装 之 Mesh 合并 (材质合并)

在Unity中提供了模型动画合并的功能,也就是说我们可以把人物模型的4个部位合并到一个GameObject中。...
  • cp790621656
  • cp790621656
  • 2015年03月23日 20:13
  • 5800

Unity Mesh合并办法 – 实现换装 优化效率 模型合并

如标题所诉。mesh 分离。可以实现一个 人物 用很多不同形状的武器或者装备什么的。同时 分离可以优化效率。 那这里就有一个 mesh如何合并的问题。unity提供了 mesh合并的接口。 简单示...
  • cbbbc
  • cbbbc
  • 2016年11月28日 21:02
  • 1410

Unity3d网格合并

http://www.cxyclub.cn/n/54078/ 几个不同的物体,在Unity3d中可以将网格合并在一起,用于优化。 在Unity3d中构建临时场景如下:建一C#脚本名为"Co...
  • OnafioO
  • OnafioO
  • 2016年02月23日 22:09
  • 2142

Unity 3D Avatar换装系统 SkinnedMeshRenderer皮肤渲染

版本:unity 5.4.1  语言:C#   参考了《Unity3D 实战核心技术详解》,我把换装系统的一个核心技术记录一下,本人虽然是在U3D开发,不过没有真正接触到这样的技术,感觉比较遗憾,这里...
  • u012632851
  • u012632851
  • 2017年02月17日 11:28
  • 4094

Unity网格合并_材质合并

从换装的角度(这里指的是换形状、换组成部件的换装,而不是挂点型的换装),都需要网格合并、材质合并。 从优化角度,Mesh也需要合并。 以下就是使用unity进行mesh合并的例子。...
  • chenggong2dm
  • chenggong2dm
  • 2014年12月04日 15:23
  • 22818

Unity中的网格与材质球合并

很多时候我们需要把具有相同shader的材质球合并,从而减少drawcall的产生。   比如多部位的人物换装,手、脚、身体分别来自不同的FBX文件,它们各自有自己的材质球,拼装成一个人物的时候,...
  • dardgen2015
  • dardgen2015
  • 2016年05月27日 16:34
  • 5115

Unity教程之-合并(Combine)引用相同材质球的网格(Mesh)

Unity自带了一个合并网格的功能,Mesh.CombineMeshes 组合网格 function CombineMeshes (combine : CombineInstance[], me...
  • cbbbc
  • cbbbc
  • 2016年11月29日 14:52
  • 845

unity3d meshBaker教程(四) 制作预置材质

1.导入Assets->Import Package->Character Controller 2.新建场景,把3rd Person Controller拖到场景中,移除上面除...
  • qq617119142
  • qq617119142
  • 2015年02月15日 17:45
  • 1359

unity3d meshBaker教程(五) 动态添加删除物体

情景再现:如一个RPG游戏,会刷新很多的怪物,如果不做优化的话那么每一个怪物都需要占用几个DC,如何才能动态生成,并且又不占用DC呢?下面就来操作一下。 使用教程三的场景,就是cube会上下...
  • qq617119142
  • qq617119142
  • 2015年02月15日 18:01
  • 1359
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:unity3d Mesh合并
举报原因:
原因补充:

(最多只允许输入30个字)