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; } }