私はあなたがキャラクターを持っていて、キャラクターに別の服を追加できるシムのようなものを作成しています。
私が使用するすべてのモデルは、同じボーンとリグを使用しています。これらのモデルをさまざまなアセットバンドルに入れました。実行時にアセットバンドルを読み取り、これらのモデルを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についてはすでに質問しましたが、モデレーターが質問を承認するまでに数時間かかるため、ここでも試してみたかったのです。