Unity 换装系统

Github:https://github.com/pinzeweifen/demo/tree/master/Unity/Replacement%20Dress

效果:

测试:

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

public class Test : MonoBehaviour {

    public ReplacementDress replacementDress;

    public SkinnedMeshRenderer eye;
    public SkinnedMeshRenderer face;
    public SkinnedMeshRenderer hair;
    public SkinnedMeshRenderer pant;
    public SkinnedMeshRenderer shoes;
    public SkinnedMeshRenderer body;
    
    private void Start()
    {
        //先一次性添加所有需要变换的装扮
        replacementDress.AddSkin(eye);
        replacementDress.AddSkin(face);
        replacementDress.AddSkin(hair);
        replacementDress.AddSkin(pant);
        replacementDress.AddSkin(shoes);
        replacementDress.AddSkin(body);

        //显示装扮
        replacementDress.GeneraterSkin();
    }
}



using System.Collections.Generic;
using UnityEngine;

[RequireComponent(typeof(SkinnedMeshRenderer))]
public class ReplacementDress : MonoBehaviour
{
    private static System.Exception SmrException = new System.Exception("蒙皮组件不能为空!");

    private List<Material> m_Materials = new List<Material>();
    private List<Transform> m_Bones = new List<Transform>();
    private List<CombineInstance> m_CombineInstances = new List<CombineInstance>();

    private Mesh m_Mesh;
    private Dictionary<string, Transform> m_AllBones = new Dictionary<string, Transform>();
    private SkinnedMeshRenderer m_SkinnedMeshRenderer;

    private int m_Count;
    private Transform[] m_TmpBones;

    private void Awake()
    {
        m_SkinnedMeshRenderer = GetComponent<SkinnedMeshRenderer>();
        var childs = GetComponentsInChildren<Transform>();

        m_Count = childs.Length;
        for(int i=0;i< m_Count; i++)
        {
            m_AllBones.Add(childs[i].name, childs[i]);
        }
    }

    /// <summary>
    /// 添加蒙皮
    /// </summary>
    /// <param name="skin"></param>
    public void AddSkin(SkinnedMeshRenderer skin)
    {
        if (skin == null) throw SmrException;

        CombineInstance ci = new CombineInstance();
        ci.mesh = skin.sharedMesh;
        m_CombineInstances.Add(ci);
        m_Materials.AddRange(skin.materials);

        m_TmpBones = skin.bones;
        m_Count = m_TmpBones.Length;
        for(int i = 0; i < m_Count; i++)
        {
            m_Bones.Add(m_AllBones[m_TmpBones[i].name]);
        }
    }

    /// <summary>
    /// 生成蒙皮
    /// </summary>
    public void GeneraterSkin()
    {
        m_Mesh = new Mesh();
        m_Mesh.CombineMeshes(m_CombineInstances.ToArray(), false, false);
        m_SkinnedMeshRenderer.sharedMesh = m_Mesh;
        m_SkinnedMeshRenderer.materials = m_Materials.ToArray();
        m_SkinnedMeshRenderer.bones = m_Bones.ToArray();

        m_Materials.Clear();
        m_Bones.Clear();
        m_CombineInstances.Clear();
    }
    
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Unity中实现人物换装功能可以通过以下几个步骤来实现。 首先,将人物模型拆分为头、身体、手臂、腿、武器等部分。这样可以实现每个部位的独立建模和贴图,为后续的换装提供基础。[1] 其次,可以使用替换蒙皮网格的方法来实现简单的换装效果。这意味着可以替换模型换装部位的GameObject,或直接替换蒙皮网格。这种方法适用于合并模型网格的情况,它不会关心替换部位是否属于原始角色的一部分。同时,如果需要替换的部位有多个配件拥有独立的网格和贴图,则此方法也适用。 然后,可以考虑合并所有蒙皮网格,以降低游戏的Draw Call数量。这涉及到重新计算UV,合并贴图和材质。这种复杂的实现可以通过以下步骤来完成:替换蒙皮网格或替换换装部位的GameObject,然后合并所有蒙皮网格,刷新骨骼,附加材质,合并贴图,并重新计算UV。这样可以实现更复杂的换装效果。 最后,根据需要可以实现实时时装和各种搭配效果。这可以通过动态换装的方式来实现,利用avatar来实现装备与人物分离的效果。 综上所述,Unity中可以通过拆分模型、替换蒙皮网格、合并网格和贴图、刷新骨骼、重新计算UV等方法来实现人物换装功能。这样可以实现自由换装、实时时装和各种搭配效果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [如何用Unity3D实现游戏中的角色换装?](https://blog.csdn.net/august5291/article/details/120259369)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [unity 3d换装之 SkinMeshRenderer](https://blog.csdn.net/kenkao/article/details/79928166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小鱼游戏开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值