


原理就是用新造的部件和角色的骨骼進行重新對接。
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
