1

私はあなたがキャラクターを持っていて、キャラクターに別の服を追加できるシムのようなものを作成しています。

私が使用するすべてのモデルは、同じボーンとリグを使用しています。これらのモデルをさまざまなアセットバンドルに入れました。実行時にアセットバンドルを読み取り、これらのモデルを1つのSkinnedMeshRendererに、つまり1つのオブジェクトに結合します。しかし、別のオブジェクトを追加するたびに、ボーンの数が増えます。

なぜそうなっているのかはわかりますが、もう一度骨の数を減らしたいと思います。重複するボーンを見つけて削除しようとしましたが、削除されたボーンと同じインデックスにあるバインドポーズを削除しようとしましたが、両方とも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);
}

Unity Answersについてはすでに質問しましたが、モデレーターが質問を承認するまでに数時間かかるため、ここでも試してみたかったのです。

4

0 に答える 0