using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public static class AvatarTool
{
///
/// 应用装备
///
/// 目标角色物体
/// 被改变的部位
/// 装备预制体名称
/// 预制体所在的对象预制物体
public static void ChangeAvatar(GameObject targetRole, GameObject targetPart, string partName, GameObject partSavorRolePrefab)
{
//Transform t = partSavorRolePrefab.transform.Find(partName);
Transform t = FindTargetObj(partSavorRolePrefab, partName);
if (t == null) return;
ChangeAvatar(targetRole, targetPart, t.gameObject);
}
///
/// 寻找到目标物体
///
public static Transform FindTargetObj(GameObject obj, string name)
{
Transform o = null;
Transform[] transforms = obj.transform.GetComponentsInChildren();
foreach (Transform t in transforms)
{
if (t.name == name)
{
o = t;
break;
}
}
return o;
}
///
/// 根据是否带有SkinnedMeshRenderer决定改变外观的方式
///
///
///
///
public static void ChangeAvatar(GameObject targetRole, GameObject targetPart, GameObject part)
{
if (targetPart.GetComponent())
{
Transform[] hips = targetRole.GetComponentsInChildren();//角色的骨骼物体
ChangeMesh(targetPart, part, hips);
}
else
{
ChangeMesh(targetPart, part);
}
}
///
/// 改变mesh,这里主要使用蒙皮骨骼换装
///
/// 需要被改变的玩家身上的部位,比如:鞋子
/// 用于改变的部位,比如:鞋子01
/// 玩家身上的骨骼,targetPart和part必须在相同的一套或者同名(模型不同,但是骨骼完全一样)的骨骼下
public static void ChangeMesh(GameObject targetPart, GameObject part, Transform[] hips)
{
SkinnedMeshRenderer smr = part.GetComponent();//获取预制物体下相关部位的SkinnedMeshRenderer
//获取角色物体下与预制物体相关更换的Mesh部位下作用于该Mesh,再场景中与其同名的骨骼列表
List bones = new List();
foreach (Transform bone in smr.bones)
{
foreach (Transform hip in hips)
{
if (hip.name != bone.name)
{
continue;
}
bones.Add(hip);
break;
}
}
targetPart.GetComponent().sharedMesh = smr.sharedMesh;//更改mesh
targetPart.GetComponent().bones = bones.ToArray();//更换(刷新)骨骼列表
targetPart.GetComponent().materials = smr.sharedMaterials;//更换材质
}
///
/// 改变Mesh,这里主要使用MeshRenderer
///
/// 玩家身上的部位
///
public static void ChangeMesh(GameObject targetPart, GameObject part)
{
targetPart.GetComponent().mesh = part.GetComponent().sharedMesh;
targetPart.GetComponent().materials = part.GetComponent().sharedMaterials;
}
}