翻了一下暗黑战神的换装系统,效果如下图所示,可以看到人物的武器,盔甲外观的模型具有不同程度的变化。
其实人物模型以及Hierarchy层级最初如下图所示,101_XX每个节点具有一个SkinnedMeshRenderer组件,对应每个可换装部位的模型。
整体视图如下所示,中间为人物的各个可换装部分,左右两边分别对应武器和人物实体类型:
换装有两种方式,一种是直接将装备挂载在某个Slot下面,如翅膀,武器-刀,这一种简单的设置为Slot的子结点即可:
private void AddEquidmentByParentNode(string nodeName, GameObject equipGo)
{
Transform equipTransform = GetChild(transform, nodeName);
Vector3 scale = equipGo.transform.localScale;
equipGo.transform.parent = equipTransform;
equipGo.transform.localPosition = Vector3.zero;
equipGo.transform.localEulerAngles = Vector3.zero;
equipGo.transform.localScale = scale;
}
另外一种则是替换Mesh和Material,一般是需要和角色融为一体的装备,如拳套,角色外形,腿部胸部挂件等,需要处理SkinnedMeshRenderer:
private void AddEquidmentByMeshRenderer(string nodeName, GameObject equipGo)
{
Transform equipTransform = GetChild(transform, nodeName);
SkinnedMeshRenderer equipSMR = equipGo.GetComponent<SkinnedMeshRenderer>();
SkinnedMeshRenderer smr = equipTransform.GetComponent<SkinnedMeshRenderer>();
if (smr == null)
return;
smr.castShadows = false;
smr.receiveShadows = false;
smr.useLightProbes = true;
smr.sharedMaterial = equipSMR.sharedMaterial;
smr.sharedMesh = equipSMR.sharedMesh;
List<Transform> bones = new List<Transform>();
for (int i = 0; i < equipSMR.bones.Length; i++)
{
bones.Add(GetChild(transform, equipSMR.bones[i].name));
}
smr.bones = bones.ToArray();
}
进一步可以合并Mesh以及Material。最终效果如下: