/// <summary> /// only put in one transform child partition example:Wing /// Anchor Name = name /// </summary> void UpdateChildrenPartition(PartitionObject partition, string name, string assetName, GameObject partitionObj) { Transform partitionAnchorDataTransform = transform.Find(name); if (partitionAnchorDataTransform == null) { EB.Debug.LogWarning("UpdateChildrenPartition:Partition Anchor Data lost Need to Add!!", assetName); partition.UnregisterObject(partitionObj); return; } ChildPartitionAnchorDataComponent anchordata = partitionAnchorDataTransform.GetComponent <ChildPartitionAnchorDataComponent>(); Transform partitionAnchor = anchordata.mAnchorBone; if (partitionAnchor == null) { EB.Debug.LogWarning("UpdateChildrenPartition:Partition Anchor Bone: anchordata.mAnchorBone lost!!", assetName); partition.UnregisterObject(partitionObj); return; } //Vector3 pos = partitionObj.transform.localPosition; //partitionObj.transform.parent = partitionAnchor; partitionObj.transform.SetParent(partitionAnchor, false); partitionObj.transform.localPosition = partitionAnchorDataTransform.localPosition; partitionObj.transform.localScale = partitionAnchorDataTransform.localScale; partitionObj.CustomSetActive(!SyncLoad); partition.RegisterMeshObjects(partitionObj); SetLayer(partitionObj, gameObject.layer); }
/// <summary> /// need combine bone partition example:Armor /// 合并骨骼部件 /// </summary> /// <param name="partition"></param> /// <param name="name"></param> /// <param name="assetName"></param> /// <param name="partitionObj">部件数据组件</param> /// <param name="isLinkObj"></param> void UpdateCombineBonePartition(PartitionObject partition, string name, string assetName, GameObject partitionObj, bool isLinkObj = false) { if (gameObject == null) { EB.Debug.LogError("This AvatarComponent has been destroyed!"); return; } //获取数据组件身上挂载的部件预置体相应的蒙皮 SkinnedMeshRenderer[] meshes = partitionObj.GetComponentsInChildren <SkinnedMeshRenderer>(); if (meshes == null || meshes.Length == 0) { if (partitionObj.GetComponentInChildren <CharacterPartitionLink>() == null) { EB.Debug.LogWarning("UpdatePartition: SkinnedMeshRenderer not found in {0}", assetName); } partition.UnregisterObject(partitionObj); return; } for (int meshIndex = meshes.Length - 1; meshIndex >= 0; meshIndex--) { SkinnedMeshRenderer smr = meshes[meshIndex]; Transform root = null; m_CombinedBones.Clear(); Transform[] bones = smr.bones; //reskin this thing to the new skeleton if (!m_SkeletonBonesDic.ContainsKey(smr.rootBone.name)) { EB.Debug.LogError("No rootBone for {0}", assetName); return; } root = m_SkeletonBonesDic[smr.rootBone.name]; if (!m_SkeletonBonesDic.ContainsKey(RootBoneTransformName)) //for Optimized Game Object { smr.bones = new Transform[0]; } else { int boneCount = bones.Length; for (int boneIndex = 0; boneIndex < boneCount; boneIndex++) { Transform bone = bones[boneIndex]; Transform combinedBone = null; if (m_SkeletonBonesDic.TryGetValue(bone.name, out combinedBone) && combinedBone != null) { m_CombinedBones.Add(combinedBone); } } smr.bones = m_CombinedBones.ToArray(); } smr.rootBone = root; smr.transform.SetParent(gameObject.transform); smr.gameObject.CustomSetActive(!SyncLoad); partition.RegisterMeshObjects(smr.gameObject); smr.gameObject.layer = gameObject.layer; CheckRender(); } }