public void PrecacheRig() { rigDefinition = new List <BoneDefintion>(); Transform[] children = rootBone.GetComponentsInChildren <Transform>(); for (int i = 0; i < children.Length; i++) { BoneDefintion bd = new BoneDefintion() { index = i, name = children[i].name, gameObject = children[i] }; rigDefinition.Add(bd); } }
//If we have a shirt that's already on one player, we can't just use the Equip method because it places it in the wrong spot? //Use this instead I guess public void ReassignSkin(SkeletonSkin equip, Skeleton skel) { List <Transform> b = new List <Transform>(); foreach (var e in equip.skeleton) { BoneDefintion bd = skel.rigDefinition.Find((d) => e == d.name); b.Add(skel.rigDefinition[bd.index].gameObject.transform); } SkinnedMeshRenderer s = equip.GetComponent <SkinnedMeshRenderer>(); s.bones = b.ToArray(); s.rootBone = skel.rootBone; s.transform.parent = skel.rootBone.parent.parent; }
//Call this to move a skinned mesh renderer from one skeleton to another //Skeletons must match! public void EquipSkin(SkeletonSkin skin) { List <Transform> b = new List <Transform>(); foreach (var bone in skin.skeleton) { //we need a list (b) that has all the bones that these two share? //for every bone precached in the skin //we need to find that corresponding bone in our rigDef and add it to a list //find bone with name bone (string value) BoneDefintion bd = rigDefinition.Find((d) => bone == d.name); b.Add(rigDefinition[bd.index].gameObject.transform); } skin.smr.bones = b.ToArray(); skin.smr.rootBone = rootBone; skin.smr.transform.parent = rootBone.parent; }