Unity3D:在运行时减少骨骼数量

Unity3D:在运行时减少骨骼数量,unity3d,Unity3d,我在模拟人生中创造了一个角色,你可以给角色添加不同的衣服 我使用的所有模型都使用相同的骨骼和装备。我将这些模型放在不同的资产包中。在运行时,我阅读资产包并将这些模型组合到一个SkindMesh渲染器中,从而组合到一个对象中。但每次我添加另一个对象时,骨骼数都会增加 我知道为什么会发生这种情况,但我想再次减少骨骼的数量。 我试图找到重复的骨骼,并将它们和bindpose删除到与删除的骨骼相同的索引上,但这仍然会给我错误“bindpose的数量与骨骼的数量不匹配”,即使它们都是45 以下是附加模型的

我在模拟人生中创造了一个角色,你可以给角色添加不同的衣服

我使用的所有模型都使用相同的骨骼和装备。我将这些模型放在不同的资产包中。在运行时,我阅读资产包并将这些模型组合到一个SkindMesh渲染器中,从而组合到一个对象中。但每次我添加另一个对象时,骨骼数都会增加

我知道为什么会发生这种情况,但我想再次减少骨骼的数量。 我试图找到重复的骨骼,并将它们和bindpose删除到与删除的骨骼相同的索引上,但这仍然会给我错误“bindpose的数量与骨骼的数量不匹配”,即使它们都是45

以下是附加模型的代码:

private void UpdateSkinnedMesh()
{
    float startTime = Time.realtimeSinceStartup;

    // Create a list of for all data
    List combineInstances = new List();
    List materials = new List();
    List bones = new List();
    Transform[] transforms = baseModel.GetComponentsInChildren();

    //TEMP
    List elements = new List();
    elements.Add(body);
    if(_currentActiveProps.ContainsKey(ItemSubCategory.Skin))
        elements.Add(tutu);

    //Go over all active elements
    foreach (CharacterElement element in elements)
    {
        //Get the skinned mesh renderer
        SkinnedMeshRenderer smr = element.GetSkinnedMeshRenderer();

        //Add materials to the entire list
        materials.AddRange(smr.materials);

        //Add all submeshes to a combined mesh
        for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)
        {
            CombineInstance ci = new CombineInstance();
            ci.mesh = smr.sharedMesh;
            ci.subMeshIndex = sub;
            combineInstances.Add(ci);
        }

        //Bones are not saved in asset bundle, get the names and reference them again
        foreach (string bone in element.GetBoneNames())
        {
            foreach (Transform transform in transforms)
            {
                if (transform.name != bone) continue;
                bones.Add(transform);
                break;
            }
        }

        //Destroy the temp object
        Destroy(smr.gameObject);
    }

    //Get skinned mesh renderer
    SkinnedMeshRenderer r = baseModel.GetComponentInChildren();

    //Create enew combined mesh
    r.sharedMesh = new Mesh();
    r.sharedMesh.CombineMeshes(combineInstances.ToArray(), false, false);

    //Add bones and materials
    r.bones = bones.ToArray();
    r.materials = materials.ToArray();

    Debug.Log("Bindposes: " + r.sharedMesh.bindposes.Length);

    Debug.Log("Generating character took: " + (Time.realtimeSinceStartup - startTime) * 1000 + " ms");
    Debug.Log("Bone count: " + r.bones.Length);
}
private void UpdateSkinnedMesh()
{
float startTime=Time.realtimeSinceStartup;
//为所有数据创建一个列表
List combineInstances=new List();
列表材质=新列表();
列表骨骼=新列表();
Transform[]transforms=baseModel.GetComponentsInChildren();
//临时工
列表元素=新列表();
元素。添加(正文);
if(_currentActiveProps.ContainsKey(ItemSubCategory.Skin))
增加(图图);
//检查所有活动元素
foreach(元素中的字符元素)
{
//获取蒙皮网格渲染器
SkinnedMeshRenderer smr=element.GetSkinnedMeshRenderer();
//将材质添加到整个列表中
材料添加范围(smr材料);
//将所有子网格添加到组合网格
对于(int sub=0;sub

我已经问了关于Unity答案的问题,但因为主持人需要几个小时才能批准该问题,所以我也想在这里尝试。

我也面临同样的问题。你找到解决办法了吗?