Unity换装之合并网格

为了提高游戏性能,需要对人物进行换装后,讲人物各个部分再进行组合,形成一个整体的网格,所以需要合并网格,骨骼,材质等。

下面是从Resources中加载人物各个部分,然后再组装。

首先加载的骨骼,再加载其他部分。

    void LoadResource()
    {
        GameObject go = Resources.Load<GameObject>("Female_bone");
        GameObject bone = (GameObject)Instantiate(go);
        boneChildren = bone.GetComponentsInChildren<Transform>();

        List<Material> mats = new List<Material>();
        List<Transform> bones = new List<Transform>();
        List<CombineInstance> cis = new List<CombineInstance>();

        AddPart("Female_top-1", bones, mats, cis, bone.transform);
        AddPart("Female_pants-1", bones, mats, cis, bone.transform);
        AddPart("Female_face-1", bones, mats, cis, bone.transform);
        AddPart("Female_hair-1", bones, mats, cis, bone.transform);
        AddPart("Female_shoes-1", bones, mats, cis, bone.transform);
        AddPart("Female_eyes", bones, mats, cis, bone.transform);

        SkinnedMeshRenderer smr = bone.GetComponent<SkinnedMeshRenderer>();
        smr.sharedMesh = new Mesh();
        smr.sharedMesh.CombineMeshes(cis.ToArray(), false, false);
        smr.bones = bones.ToArray();
        smr.sharedMaterials = mats.ToArray();
    }

    void AddPart(string partname, List<Transform> bones, List<Material> mats, List<CombineInstance> cis, Transform bone)
    {
        GameObject go = Resources.Load<GameObject>(partname);
        go = (GameObject)Instantiate(go);
        SkinnedMeshRenderer smr = go.GetComponent<SkinnedMeshRenderer>();
        foreach (Transform child in smr.bones)
        {
            bones.Add(FindChildByName(child.name));
        }
        smr.material.mainTexture = tex[mats.Count];
        mats.Add(smr.material);
	for (int sub = 0; sub < smr.sharedMesh.subMeshCount; sub++)
	{
		CombineInstance ci = new CombineInstance();
		ci.mesh = smr.sharedMesh;
		ci.subMeshIndex = sub;
		cis.Add(ci);
	}
        DestroyImmediate(go);
    }

    private Transform FindChildByName(string name)
    {
        foreach (Transform child in boneChildren)
        {
            if (child.name == name)
            {
                return child;
            }
        }
        return null;
    }


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值