Unity换装实现

本文分享了Unity中实现角色换装的三种方法及其优缺点。第一种是通过设置对象活性来切换装备,存在性能和内存问题。第二种是通过合并部件以减少DrawCall,但会影响动画和内存使用。第三种方案改进了骨骼匹配,减少了性能消耗,通过预配置优化资源管理。
摘要由CSDN通过智能技术生成

最近整理了一下项目的换装系统,有一些想法,在这里分享一下。

我们的角色拆分了四个部件,头发,身体,腿和脚,对应到gameobject是这样的,000是骨骼根节点。

装备导出是这样的,skinnedmeshrenderer在000同级的子节点上,装备导出也是带骨骼信息的。

第一种实现办法

把装备gameobject挂到角色根节点下,然后通过setactive设置原部件和装备的显隐。

新装备上的skinnedmeshrenderer.bones,需要按照名字在角色的骨骼上找到对应的替换,不然动画就不认了,其他的都很简单不细说了,直接上代码。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjSwaper : MonoBehaviour
{
    public SkinnedMeshRenderer[] srcEquips = new SkinnedMeshRenderer[4];    // 原来的部件
    public SkinnedMeshRenderer[] equips = new SkinnedMeshRenderer[4];       // 预备换的部件
    Animation anim = null;
    void Start()
    {
        anim = gameObject.GetComponent<Animation>();
        anim.CrossFade("idle1");
    }

	void Update () 
    {
        if (Input.GetKeyDown(KeyCode.P))
        {
            Swap();
        }
	}
    public void Swap()
    {
        Transform[] transforms = gameObject.GetComponentsInChildren<Transform>(false);
        List<Transform> boneList = new List<Transform>();

        for (int i = 0 ; i < equips.Length ; ++i)
        {
            SkinnedMeshRenderer smr = null;
            if (equips[i] != null)
            {
                smr = equips[i];
                equips[i].transform.parent.gameObject.SetActive(true);
                srcEquips[i].gameObject.SetActive(false);
            }
            else
            {
                smr = srcEquips[i];
                srcEquips[i].gameObject.SetActive(true);
            }
            boneList.Clear();

            foreach (Transform bone in smr.bones)
            {
                foreach (Transform item in transforms)
                {
                    if (item.name != bone.name)
                        continue;
                    boneList.Add(item);
                    break;
                }
            }
            smr.bones = boneList.ToArray();
            smr.rootBone = srcEquips[i].rootBone;
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值