private void ChangeModel(Transform childTrans, string anchorName) { if (childTrans != null) { SkinnedMeshRenderer skinnedMesh = childTrans.gameObject.GetComponent <SkinnedMeshRenderer>(); MeshRenderer staticMesh = childTrans.gameObject.GetComponent <MeshRenderer>(); bool avatarChanged = false; if (skinnedMesh != null) { skinnedMesh.receiveShadows = false; Transform rootbone = skinnedMesh.rootBone; Transform oldRoot = UnityTools.FindChildTransform(GameObject.transform, rootbone.name); if (oldRoot != null) { UnityTools.ReplaceNewTran(rootbone, oldRoot); } else { Debug.LogError("找不到替换的骨骼位置"); } List <Transform> newTargetBones = new List <Transform>(); foreach (Transform srcBone in skinnedMesh.bones) { if (renderNodeObjects.Contains(srcBone.name)) { newTargetBones.Add((renderNodeObjects[srcBone.name] as GameObject).transform); } } skinnedMesh.bones = newTargetBones.ToArray(); skinnedMesh.rootBone = (renderNodeObjects[skinnedMesh.rootBone.name] as GameObject).transform; childTrans.parent = GameObject.transform; avatarChanged = true; NotifySkinnedMeshChanged(skinnedMesh); } else if (staticMesh != null) { staticMesh.receiveShadows = false; bool isExist = bindNodeTable.ContainsKey(anchorName); if (isExist) { Transform bindParent = bindNodeTable[anchorName] as Transform; childTrans.parent = bindParent; childTrans.localPosition = new Vector3(0, 0, 0); childTrans.localRotation = Quaternion.identity; childTrans.localScale = Vector3.one; avatarChanged = true; NotifyStaticMeshChanged(staticMesh); //< 回调函数aa } } if (avatarChanged) { if (renderNodeObjects.Contains(childTrans.name)) { GameObject oldAvatarPart = renderNodeObjects[childTrans.name] as GameObject; oldAvatarPart.transform.parent = null; GameObject.Destroy(oldAvatarPart); } renderNodeObjects[childTrans.name] = childTrans.gameObject; meshTable[childTrans.name] = childTrans.gameObject; RefreshAvatar(); } } }