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

  • 相关阅读:
    Spring Tool Suite 配置和使用
    自动提示在线/离线状态
    Excel数据导入数据库的SQL快速生成
    MySQL查询和删除重复数据
    内存不足时,调用ajax报的错
    订单支付成功后存储过程
    下订单存储过程
    课程表,订单表(统计报名人数),评论表(统计评论的人数),点赞表(点赞人数)
    更改浏览器的滚动条样式
    自定义文本选中样式
  • 原文地址:https://www.cnblogs.com/mrblue/p/5236507.html
Copyright © 2011-2022 走看看