原理就是用新造的部件和角色的骨骼進行重新對接。
demo的使用方法:
PartIdx設置要換那個部件[0,4],一共5個部件
EquipIdx設置要更換部件的裝備索引[0,1],具體看我的ChangeEquip的PartList。
點擊Test執行換裝
//換裝源碼
using UnityEngine; using System.Collections; using System.Collections.Generic; public class MyAvatar : MonoBehaviour { [System.Serializable] public class PartInfo { public GameObject DefaultPart; public GameObject NewPart; } //目前部件列表 public List<PartInfo> AvatorParts; /// <summary> /// 換裝 /// </summary> /// <param name="idx">部件索引id</param> /// <param name="res">裝備資源</param> public void ChangePart(int idx, GameObject res) { if (idx < 0 || idx >= AvatorParts.Count) { Debug.Log("out of range"); return; } //獲得這個部件信息 var info = AvatorParts[idx]; //先刪除新裝備的 if (null != info.NewPart) { GameObject.Destroy(info.NewPart); info.NewPart = null; } if (null == res) {//脫裝備,還原成默認裝備 info.DefaultPart.SetActive(true); } else {//穿新裝備 info.DefaultPart.SetActive(false); //實例化那個部件 var go = GameObject.Instantiate(res) as GameObject; //獲得蒙皮Renderer var newSkin = go.GetComponentInChildren<SkinnedMeshRenderer>(); //要掛接的是帶蒙皮Renderer var newPart = newSkin.gameObject; //掛上 newPart.transform.parent = info.DefaultPart.transform.parent; //在主角骨骼身體里找到該部件所需要的骨骼(這里有一點需求就是美術在做部件時是要帶着骨骼的) var bones = new Transform[newSkin.bones.Length]; for (int i = 0; i < newSkin.bones.Length; i++) { bones[i] = FindChild(gameObject.transform, newSkin.bones[i].name); } //重新賦值骨骼 newSkin.bones = bones; //給當前部件信息賦值 info.NewPart = newPart; //刪除剩下沒用的東西 GameObject.Destroy(go); } } public static Transform FindChild(Transform t, string searchName) { foreach (Transform c in t) { string partName = c.name; if (partName == searchName) { return c; } else { Transform r = FindChild(c, searchName); if (r != null) { return r; } } } return null; } }
最后附上Demo
鏈接: http://pan.baidu.com/s/1jHpw3Im 密碼: w4r6