コード例 #1
0
    public void Combine()
    {
        if (base.gameObject.isStatic)
        {
            Debug.LogWarning(string.Format("이미 StaticBatching이 동작 중이므로 컴바인할 수 없습니다. (\"{0}\")", base.gameObject.name), base.gameObject);
            return;
        }
        TsMeshCombine.Cells.ResetBound();
        MeshFilter[] componentsInChildren = base.GetComponentsInChildren <MeshFilter>();
        Matrix4x4    worldToLocalMatrix   = base.transform.worldToLocalMatrix;
        Dictionary <TsMeshCombine.Key, TsMeshCombine.Combiner> dictionary = new Dictionary <TsMeshCombine.Key, TsMeshCombine.Combiner>();

        MeshFilter[] array = componentsInChildren;
        for (int i = 0; i < array.Length; i++)
        {
            MeshFilter meshFilter = array[i];
            GameObject gameObject = meshFilter.gameObject;
            Renderer   renderer   = meshFilter.renderer;
            Mesh       sharedMesh = meshFilter.sharedMesh;
            if (!sharedMesh.name.Contains("Combined Mesh (root: scene)"))
            {
                if (renderer != null && renderer.enabled && sharedMesh != null && !gameObject.isStatic)
                {
                    if (gameObject.collider is MeshCollider)
                    {
                        Debug.LogWarning(string.Format("[CombinedMesh] 오브젝트에 MeshCollider가 있어서 combine 할 수 없습니다. (Object=\"{0}\", Mesh=\"{1}\")", gameObject.name, meshFilter.sharedMesh.name), gameObject);
                    }
                    else
                    {
                        TsMeshUtil.CombineData data = default(TsMeshUtil.CombineData);
                        data.mesh      = sharedMesh;
                        data.transform = worldToLocalMatrix * meshFilter.transform.localToWorldMatrix;
                        Vector3    position        = meshFilter.transform.position;
                        Material[] sharedMaterials = renderer.sharedMaterials;
                        for (int j = 0; j < sharedMaterials.Length; j++)
                        {
                            Material material = sharedMaterials[j];
                            data.subMeshIndex = Math.Min(j, data.mesh.subMeshCount - 1);
                            TsMeshCombine.Key      key = new TsMeshCombine.Key(material, gameObject.layer, position);
                            TsMeshCombine.Combiner combiner;
                            if (!dictionary.TryGetValue(key, out combiner))
                            {
                                combiner = new TsMeshCombine.Combiner(material, gameObject.layer, base.transform, key.ToString());
                                dictionary.Add(key, combiner);
                            }
                            combiner.Add(data);
                        }
                        UnityEngine.Object.DestroyImmediate(renderer);
                        UnityEngine.Object.DestroyImmediate(meshFilter);
                    }
                }
            }
        }
        foreach (TsMeshCombine.Combiner current in dictionary.Values)
        {
            current.Combine();
        }
        this.CleanUp(base.transform);
        UnityEngine.Object.Destroy(this);
    }
コード例 #2
0
 public void Add(TsMeshUtil.CombineData data)
 {
     this.list.Add(data);
 }