/// <summary> /// 打开快速蒙皮窗口 /// </summary> void OpenSkinWindow() { SkeletonSkin _SkeletonSkin = EditorWindow.GetWindowWithRect <SkeletonSkin>(new Rect(0, 0, 120, 30), false, "快速蒙皮"); _SkeletonSkin.titleContent = new GUIContent(EditorGUIUtility.IconContent("AvatarInspector/BodySilhouette")); _SkeletonSkin.titleContent.text = "快速蒙皮"; _SkeletonSkin.autoRepaintOnSceneChange = true; _SkeletonSkin.Show(); _SkeletonSkin._MeshAnimation = _MeshAnimation; }
//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; }
internal void CopyToSkeleton(Skeleton skeleton, GameObject parent, Item item) { Func <ItemSkinDirectory.Skin, bool> func = null; SkeletonSkin[] skeletonSkins = this.SkeletonSkins; for (int i = 0; i < (int)skeletonSkins.Length; i++) { SkeletonSkin skeletonSkin = skeletonSkins[i]; GameObject gameObject = new GameObject(); gameObject.transform.parent = parent.transform; skeletonSkin.DuplicateAndRetarget(gameObject, skeleton).updateWhenOffscreen = true; if (item != null && item.skin > (long)0) { ItemSkinDirectory.Skin[] skinArray = item.info.skins; Func <ItemSkinDirectory.Skin, bool> func1 = func; if (func1 == null) { Func <ItemSkinDirectory.Skin, bool> func2 = (ItemSkinDirectory.Skin x) => (long)x.id == item.skin; Func <ItemSkinDirectory.Skin, bool> func3 = func2; func = func2; func1 = func3; } ItemSkinDirectory.Skin skin = ((IEnumerable <ItemSkinDirectory.Skin>)skinArray).FirstOrDefault <ItemSkinDirectory.Skin>(func1); if (skin.id == 0 && item.skin > (long)0) { Rust.Workshop.WorkshopSkin.Apply(gameObject, item.skin, null); return; } if ((long)skin.id != item.skin) { return; } ItemSkin itemSkin = skin.invItem as ItemSkin; if (itemSkin == null) { return; } itemSkin.ApplySkin(gameObject); } } }