一、3D換裝方案
SkinnedMeshRenderer組件替換(最常用)
適用場景:角色需要保持骨骼動畫,更換服裝/武器等
實現步驟:
1.準備模型:
所有服裝需使用相同骨骼結構(建議在建模軟件中綁定到同一套骨骼)
導出時保留Skin數據(FBX格式)
2.代碼控制:
public class DressUpSystem : MonoBehaviour {
public SkinnedMeshRenderer bodyRenderer; // 身體基礎模型
public List<SkinnedMeshRenderer> clothes; // 所有可換服裝
public void ChangeCloth(int index) {
// 禁用所有服裝
foreach (var cloth in clothes) {
cloth.gameObject.SetActive(false);
}
// 啟用選中服裝
clothes[index].gameObject.SetActive(true);
}
}
3.優化技巧:
使用CombineMeshes合并相同材質的網格減少DrawCall:
void CombineMeshes() {
List<SkinnedMeshRenderer> renders = new List<SkinnedMeshRenderer>();
// 收集需要合并的Renderer...
SkinnedMeshRenderer combined = new GameObject("Combined").AddComponent<SkinnedMeshRenderer>();
combined.bones = bodyRenderer.bones;
combined.sharedMesh = new Mesh();
CombineInstance[] combine = new CombineInstance[renders.Count];
// 設置combine數據...
combined.sharedMesh.CombineMeshes(combine, true, false);
}
2.?動態換貼圖/材質(適合顏色款式變化)
public Renderer characterRenderer;
public Material[] outfitMaterials;
public void ChangeMaterial(int index) {
characterRenderer.material = outfitMaterials[index];
}
二、2D換裝實現方案
1.?Sprite分層渲染
適用場景:2D游戲或UI換裝系統
實現方式:
將角色拆分為多個Sprite(身體/頭發/衣服等)
通過控制子物體顯隱:
public GameObject[] hairStyles;
public void ChangeHair(int index) {
foreach (var hair in hairStyles) {
hair.SetActive(false);
}
hairStyles[index].SetActive(true);
}
2.?Spine/DragonBones骨骼動畫換裝
在動畫工具中設置換裝插槽
Unity中使用API動態替換:
// Spine示例
skeletonAnimation.Skeleton.FindSlot("weapon").Attachment = newWeaponAttachment;
代碼
三、性能優化關鍵點
1.資源管理:
使用Addressable或AssetBundle動態加載服裝資源
對換裝部件做對象池管理
2.渲染優化:
3D角色使用LOD Group分級細節
合并相同材質的Mesh(使用Mesh.CombineMeshes)
3.內存控制:
// 換裝時釋放舊資源
Resources.UnloadUnusedAssets();
四、實戰案例參考
1.基礎換裝Demo:
public void EquipWeapon(GameObject weaponPrefab) {
if(currentWeapon != null) Destroy(currentWeapon);
currentWeapon = Instantiate(weaponPrefab, handBone);
}
2.商店系統集成:
public void BuyAndEquip(ClothData cloth) {
if(coin >= cloth.price) {
coin -= cloth.price;
DressManager.Instance.ChangeCloth(cloth.type, cloth.id);
}
五、常見問題解決
1.服裝穿模:
調整服裝碰撞體大小
使用Blend Shapes處理緊身衣變形
2.換裝卡頓:
預加載常用服裝資源
使用協程分幀加載:
IEnumerator LoadClothAsync(string path) {
var request = Resources.LoadAsync<GameObject>(path);
yield return request;
Instantiate(request.asset);
}
3.跨場景保存:
使用ScriptableObject存儲當前裝扮數據或通過DontDestroyOnLoad保存換裝管理器