Exemplo n.º 1
0
        private Material CombineMaterial(SkinnedCombinedData data)
        {
            Material mat = new Material(Shader.Find("Role/CartoonCombine"));

            mat.SetTexture("_MainTex", data.textures[0]);
            mat.SetTexture("_Tex1", data.textures[1]);
            mat.SetTexture("_Tex2", data.textures[2]);
            mat.SetTexture("_Tex3", data.textures[3]);
            return(mat);
        }
Exemplo n.º 2
0
    private static SkinnedCombinedData CollectInfomationFromSkinnedMeshs(GameObject skeleton, SkinnedMeshRenderer[] skinnedMeshRenderers, bool combine = false)
    {
        if (null == skeleton)
        {
            return(null);
        }

        SkinnedCombinedData data = new SkinnedCombinedData();

        data.childs.AddRange(skeleton.GetComponentsInChildren <Transform>(true));

        int index = 0;

        foreach (SkinnedMeshRenderer smr in skinnedMeshRenderers)
        {
            if (combine)
            {
                data.textures.Add(smr.sharedMaterials[0].GetTexture("_MainTex") as Texture2D);
            }
            else
            {
                data.materials.AddRange(smr.sharedMaterials);
            }

            int meshCount = smr.sharedMesh.subMeshCount;
            for (int i = 0; i < meshCount; i++)
            {
                CombineInstance ci = new CombineInstance();
                ci.mesh         = smr.sharedMesh;
                ci.subMeshIndex = i;
                if (combine)
                {
                    ReCalculateUV(ci.mesh, index);
                }
                data.combineInstances.Add(ci);
            }

            int bonesCount = smr.bones.Length;
            for (int i = 0; i < bonesCount; i++)
            {
                int childCount = data.childs.Count;
                for (int j = 0; j < childCount; j++)
                {
                    if (smr.bones[i].name.Equals(data.childs[j].name))
                    {
                        data.bones.Add(data.childs[j]);
                        break;
                    }
                }
            }
            index++;
        }

        return(data);
    }
Exemplo n.º 3
0
    public static void CombineSkinnedMesh(GameObject skeleton, SkinnedMeshRenderer[] skinnedMeshRenderers, bool combine = false, OnCombineCustomizeMaterial customizeMaterialFunc = null)
    {
        SkinnedCombinedData data = CollectInfomationFromSkinnedMeshs(skeleton, skinnedMeshRenderers, combine);

        if (null == data)
        {
            return;
        }

        SkinnedMeshRenderer smr = skeleton.AddComponent <SkinnedMeshRenderer>();

        smr.sharedMesh = new Mesh();
        smr.sharedMesh.CombineMeshes(data.combineInstances.ToArray(), combine, false);
        smr.bones = data.bones.ToArray();

        if (combine && null != customizeMaterialFunc)
        {
            smr.material = customizeMaterialFunc(data);
        }
        else
        {
            smr.materials = data.materials.ToArray();
        }
    }