unity 角色换装

unity角色换装的关键是更改角色部位上的物体的SkinnedMeshRenderer组件的属性:

更改mesh:mesh决定了部位的物体的外形,是主要的数据。

刷新骨骼:同一个部位下,不同的mesh受到的不同的骨骼的影响不同,因此更换mesh之后,还要更新SkinnedMeshRenderer下的骨骼列表的信息,也就是更换骨骼列表。

替换材质:一个SkinnedMeshRenderer下由多个材质作用,因此还需要更换材质列表。

 

操作过程为,从预制物体中获取的需要更换的相关部位的mesh,然后通过从预制物体的相关部位的SkinnedMeshRenderer下获取到影响该部位的骨骼列表,然后从场景角色的骨骼下获取到同名的骨骼列表,将该骨骼列表赋予到场景下角色的部位的SkinnedMeshRenderer下,并且获取到预制物体下该部位的材质列表,同样的将该列表赋予场景下角色的部位的SkinnedMeshRenderer下。

 

为了获取到更换的信息,需要由预制物体存储物体的相关信息。预制物体如下,每个部位下所有的物体都呈现,便于程序提取信息。

原模型如下:

场景下角色如下:

具体代码如下:

该脚本可以放在任何地方

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

public class AvatarSysDemo00 : MonoBehaviour
{
    public Transform role;//场景中的角色物体
    public GameObject rolePrefab;//预制物体
    public GameObject kuzi;//场景中角色物体下裤子物体
    public string[] kuziNames;//所有的用于替换的裤子的名字,用于再预制物体中找到相关的物体的信息
    public GameObject[] objs;//裤子相关的预制物体 
    int index = 0;//当前的装备索引
    public Transform[] hips;//角色的骨骼物体

    private void Awake()
    {
        hips = null;
        if (role)
            hips = role.GetComponentsInChildren<Transform>();//首先获取场景中角色下的骨骼列表

        for (int i = 0; i < kuziNames.Length; i++)//获取预制物体下的所有裤子物体
        {
            Transform kuziObj = rolePrefab.transform.Find(kuziNames[i]);
            objs[i] = kuziObj.gameObject;
        }
    }

    // Start is called before the first frame update
    void Start()
    {
              
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))//设置为按下空格就切换一下裤子
        {
            Debug.Log(objs.Length);
            if (objs.Length == 0) return;
            index = (index + 1) % objs.Length;

            ChangeMesh(objs[index]);
        }
    }

    //换装
    public void ChangeMesh(GameObject part)
    {
        SkinnedMeshRenderer smr = part.GetComponent<SkinnedMeshRenderer>();//获取预制物体下相关部位的SkinnedMeshRenderer

        //获取角色物体下与预制物体相关更换的Mesh部位下作用于该Mesh,再场景中与其同名的骨骼列表
        List<Transform> bones = new List<Transform>();
        foreach (Transform bone in smr.bones)
        {
            foreach (Transform hip in hips)
            {
                if (hip.name != bone.name)
                {
                    continue;
                }
                bones.Add(hip);
                break;

            }
        }
        kuzi.GetComponent<SkinnedMeshRenderer>().sharedMesh = smr.sharedMesh;//更改mesh
        kuzi.GetComponent<SkinnedMeshRenderer>().bones = bones.ToArray();//更换(刷新)骨骼列表
        kuzi.GetComponent<SkinnedMeshRenderer>().materials = smr.sharedMaterials;//更换材质
    }
}

 

转载于:https://www.cnblogs.com/xiaoahui/p/unity.html

  • 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
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值