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 = ;//当前的装备索引
public Transform[] hips;//角色的骨骼物体 private void Awake()
{
hips = null;
if (role)
hips = role.GetComponentsInChildren<Transform>();//首先获取场景中角色下的骨骼列表 for (int i = ; 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 == ) return;
index = (index + ) % 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;//更换材质
}
}

unity 角色换装的更多相关文章

  1. Unity动态换装之Spine换装

    注:转载请注明转载,并附原链接 http://www.cnblogs.com/liaoguipeng/p/5867510.html 燕双飞情侣 一.动态换装原理 换装,无非就是对模型的网格,或者贴图进 ...

  2. 【Unity3D】3D角色换装++ Advance

    http://www.cnblogs.com/dosomething/archive/2012/12/15/2818897.html 本文在之前的文章Unity3D角色换装的原理 基础上做一个补充 给 ...

  3. 浅谈角色换装功能--Unity简单例子实现

    在前置篇中,基本上梳理了一下换装功能背后涉及到的美术工作流.但程序员嘛,功能终归是要落到代码上的.本文中会结合Unity提供的API及之前提到的内容来实现一个简单的换装功能.效果如下: (图1:最终效 ...

  4. Unity3d 3d角色换装实现原理及步骤

    http://www.cnblogs.com/dosomething/archive/2012/04/15/2450526.html 1.角色模型制作 unity3d支持Skin动画  但是不支持Ph ...

  5. 【Unity3d】3d角色换装实现原理及步骤

    http://www.cnblogs.com/dosomething/archive/2012/04/15/2450526.html 1.角色模型制作 unity3d支持Skin动画  但是不支持Ph ...

  6. unity官方换装教程Character Customization 学习笔记

    1. 下载示例demo,可以直接从AssetsStore上下载,但是速度比较慢,我在github上找了一个据说支持unity5.x的. 链接:https://github.com/spacebeagl ...

  7. Unity 之 人物换装

    http://www.cnblogs.com/mcwind/archive/2011/02/18/1957453.html  原理 一. SkinedMeshRender:该对象负责网格绘制.主要数据 ...

  8. Unity3D教程:换装方法

    http://www.manew.com/4136.html 游戏内的角色,能够像纸娃娃换装那样子让玩家可以为自己的角色改变外观,一直是相当受欢迎的功能:一般而言,我们建好的 3D 模型,如果要将其中 ...

  9. Unity3d 换装Avatar系统

    原理就是用新造的部件和角色的骨骼进行重新对接. demo的使用方法: PartIdx设置要换那个部件[0,4],一共5个部件 EquipIdx设置要更换部件的装备索引[0,1],具体看我的Change ...

随机推荐

  1. windows开启ftp服务

    1.启动或关闭windows-->internet information services-->ftp服务器   选中 2.此电脑右键-->管理-->服务和应用程序--> ...

  2. linux ngxtop安装安装及使用

    写在前面: ngxtop是Nginx日志实时分析利器 1.下载 下载地址:https://github.com/lebinh/ngxtop  下载zip文件到本地 登录linux服务器,定位到安装目录 ...

  3. jar is not a valid DFS filename

  4. MaxCompute - ODPS重装上阵 第六弹 - User Defined Type

    MaxCompute(原ODPS)是阿里云自主研发的具有业界领先水平的分布式大数据处理平台, 尤其在集团内部得到广泛应用,支撑了多个BU的核心业务. MaxCompute除了持续优化性能外,也致力于提 ...

  5. python selenium 笔记

    1.安装环境  下载python 3.6.4 第一页把最下面的环境变量勾上.第二页把 all user  勾上  直接安装到下一步 安装完成之后 cmd直接输入python  可以看到版本 2.安装  ...

  6. js 数组的forEach 函数

    var numbers = [4, 9, 16, 25]; function myFunction(item, index) { console.log("item:" + ite ...

  7. EasyUI DataGrid undefined处理

    处理undefined var val = null; console.log(val); console.log(val || ""); val = undefined; con ...

  8. 窗体操作:CBrush类

    CBrush画刷定义了一种位图形式的像素,利用它可对区域内部填充颜色. 该类封装了Windows的图形设备接口(GDI)刷子.通过该类构造的CBrush对象可以传递给任何一个需要画刷的CDC成员函数. ...

  9. vue-cli中route和router的区别

    在使用vue-router的时候经常分不清router和route的区别: 在函数式编程中: this.$router.push('/login') 或者Router.push() 在动态获取路由参数 ...

  10. JavaScript插件制作-tab选项卡

    JavaScript插件制作练习-鼠标划过选项卡切换图片 <!DOCTYPE html> <html> <head> <meta charset=" ...