zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)
    UVaLive 5031 Graph and Queries (Treap)
    Uva 11996 Jewel Magic (Splay)
    HYSBZ
    POJ 3580 SuperMemo (Splay 区间更新、翻转、循环右移,插入,删除,查询)
    HDU 1890 Robotic Sort (Splay 区间翻转)
    【转】ACM中java的使用
    HDU 4267 A Simple Problem with Integers (树状数组)
    POJ 1195 Mobile phones (二维树状数组)
    HDU 4417 Super Mario (树状数组/线段树)
  • 原文地址:https://www.cnblogs.com/mrblue/p/5236507.html
Copyright © 2011-2022 走看看