Unity3d 換裝Avatar系統


原理就是用新造的部件和角色的骨骼進行重新對接。

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM