/// <summary> /// DynamicBoneを再設定する。ほぼオリジナルの処理のコピペ /// </summary> /// <param name="cc"></param> /// <param name="obj"></param> /// <param name="dictBone"></param> public void ForceRescueDynamicBone(ChaControl cc, GameObject obj, Dictionary <string, GameObject> dictBone) { var dbcs = cc.objBodyBone.GetComponentsInChildren <DynamicBoneCollider>(true); var dbs = obj.GetComponentsInChildren <DynamicBone>(true); foreach (var db in dbs) { if (db.m_Root != null && !BoneImplantMarker.IsMarked(db.m_Root)) { foreach (var kvp in dictBone) { if (kvp.Key == db.m_Root.name) { db.m_Root = kvp.Value.transform; break; } } } if (db.m_Exclusions != null && db.m_Exclusions.Count > 0) { for (int i = 0; i < db.m_Exclusions.Count; i++) { if (db.m_Exclusions[i] != null && !BoneImplantMarker.IsMarked(db.m_Exclusions[i])) { foreach (var kvp in dictBone) { if (kvp.Key == db.m_Exclusions[i].name) { db.m_Exclusions[i] = kvp.Value.transform; break; } } } } } if (db.m_notRolls != null && db.m_notRolls.Count != 0) { for (int i = 0; i < db.m_notRolls.Count; i++) { if (db.m_notRolls[i] != null && !BoneImplantMarker.IsMarked(db.m_notRolls[i])) { foreach (var kvp in dictBone) { if (kvp.Key == db.m_notRolls[i].name) { db.m_notRolls[i] = kvp.Value.transform; break; } } } } } } }
/// <summary> /// ボーン参照を移し替える実処理。AssignedAnotherWeights.AssignedWeightsAndSetBoundsLoopの置き換え /// </summary> /// <param name="t"></param> /// <param name="bounds"></param> /// <param name="rootBone"></param> /// <param name="dictBone"></param> private void TransferBoneReferenceLoop(Transform t, Bounds bounds, Transform rootBone, Dictionary <string, GameObject> dictBone) { var smr = t.GetComponent <SkinnedMeshRenderer>(); if (smr != null) { var num = smr.bones.Length; var tmpArray = new Transform[num]; GameObject obj = null; for (var i = 0; i < num; i++) { if (BoneImplantMarker.IsMarked(smr.bones[i])) { tmpArray[i] = smr.bones[i]; } else if (dictBone.TryGetValue(smr.bones[i].name, out obj)) { tmpArray[i] = obj.transform; } } smr.bones = tmpArray; smr.localBounds = bounds; var c = smr.gameObject.GetComponent <Cloth>(); if (rootBone != null && c == null) { smr.rootBone = rootBone; } else if (smr.rootBone != null && dictBone.TryGetValue(smr.rootBone.name, out obj)) { smr.rootBone = obj.transform; } } IEnumerator enumerator = t.gameObject.transform.GetEnumerator(); try { while (enumerator.MoveNext()) { var t2 = (Transform)enumerator.Current; TransferBoneReferenceLoop(t2, bounds, rootBone, dictBone); } } finally { IDisposable disposable; if ((disposable = (enumerator as IDisposable)) != null) { disposable.Dispose(); } } }