暗黑战神换装系统的实现

翻了一下暗黑战神的换装系统,效果如下图所示,可以看到人物的武器,盔甲外观的模型具有不同程度的变化。


其实人物模型以及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。最终效果如下:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值