IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> DragonBones+Unity 实现换装 -> 正文阅读

[游戏开发]DragonBones+Unity 实现换装

学习自 https://www.zhihu.com/collection/691395675
https://gitee.com/afrx_s_projz/change_skin_demo.dragonbones
素材来自 https://www.bilibili.com/video/BV1Y7411K7y6
龙骨换装的核心函数是

 UnityFactory.factory.ReplaceSkin(
            player.GetComponentInChildren<UnityArmatureComponent>().armature,
            goBody.GetComponent<UnityArmatureComponent>().armature.armatureData.defaultSkin
            );

两个参数,第一个是当前换装对象的armature,第二个是换装目标的armature数据,那么在龙骨中做好多个只含有皮肤数据的预制体,就可以从这些预制体中加载要换装的皮肤数据。

制作皮肤

首先要获得图片资源,从ps中得到分层数据后,导入龙骨。一个角色有多套皮肤资源,可以先导入到龙骨的同一个项目中,这样之后在library里就可以直接替换不同位置的图片
在这里插入图片描述
导入龙骨后,绑定骨骼,制作动画,相关教程有很多。我们为这个角色制作了idle和jump两个动画。
在这里插入图片描述
接下来复制这个原件,有几个要替换的部位就复制几个。这里替换脸和身体两个部位,那么就复制两个,一个取名为face、一个取名为body,原来的原件改名为default,如下:
在这里插入图片描述
双击face元件,将骨骼下的插槽全部拖拽到root骨骼下,删除所有和皮肤无关的插槽,用下面的方法将要用的插槽与原骨骼重新绑定:
点击网格、添加绑定骨骼,在画布或树形图中选定要绑定的骨骼,然后双击确定。这里分离插槽和骨骼后,将头部插槽与头部骨骼重新绑定。
之后删除所有无关的骨骼和动画。删除动画的方法是新建一个新的动画取名为NULL,删除所有原有的动画。
同样的方法,制作body部位的皮肤。
在这里插入图片描述
制作好之后,导出,选择所有元件
在这里插入图片描述
另存为一个新的项目,下面要制作另一套皮肤。将脸部图片和身体图片替换:选择对应的插槽然后替换图片即可。如果找不到替换的图片,从ps里导入图片素材到此项目的library中即可。
在这里插入图片描述
替换之后,删除所有动画,直接导出,得到另外三个导出文件。至此,我们得到两套文件:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在unity中实现换装

在unity中,首先导入龙骨插件,接着在Resources文件夹下新建文件,结构如下
在这里插入图片描述
将两套导出文件分别拖入DragonBones文件夹下。
新建龙骨物体,选择ske json文件,点击create,就得到默认的游戏物体,将sortingMode改为 SortByOrder。Armature选default。

将这个游戏物体拖拽到Skin文件夹中。
在这里插入图片描述
在这里插入图片描述

复制这个游戏物体得到face和body,在这两个预制体中,点进去修改预制体,将armature分别设置为face和body,就得到了三个prefab
在这里插入图片描述
同样的方法,制作战斗模式下的三个预制体,放到C2文件夹下。

代码控制

新建C#脚本,新建游戏物体Player,将default预制体放在Player子物体中,脚本挂在Player上。脚本内容如下:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DragonBones;
public class ChangeTest : MonoBehaviour
{
    /// <summary>
    /// Start
    /// </summary>
    void Start()
    {
        StartCoroutine(ChangeSkin());
    }

    /// <summary>
    /// 修改皮肤
    /// </summary>
    /// <returns>迭代器</returns>
    private IEnumerator ChangeSkin()
    {
        WaitForSeconds wait = new WaitForSeconds(2);
        yield return wait;

        //找到player对象
        GameObject player = GameObject.Find("Player");

        //换到战斗服装
        GameObject goBody = Resources.Load<GameObject>("ChangeTest/C2/Skin/body");
        goBody = GameObject.Instantiate<GameObject>(goBody);
        goBody.SetActive(false);
        // 只是借助 Prefab 取得上面的皮肤数据, 并不真正要使用它!
        // 所以直接隐藏即可

        UnityFactory.factory.ReplaceSkin(
            player.GetComponentInChildren<UnityArmatureComponent>().armature,
            goBody.GetComponent<UnityArmatureComponent>().armature.armatureData.defaultSkin
            );
        Destroy(goBody);
        yield return wait;


        //换到战斗表情
        GameObject goFace = Resources.Load<GameObject>("ChangeTest/C2/Skin/face");
        goFace = GameObject.Instantiate<GameObject>(goFace);
        goFace.SetActive(false);
        

        UnityFactory.factory.ReplaceSkin(
            player.GetComponentInChildren<UnityArmatureComponent>().armature,
            goFace.GetComponent<UnityArmatureComponent>().armature.armatureData.defaultSkin
            );
        Destroy(goFace);
        yield return wait;

        //换到平常表情
        goFace = Resources.Load<GameObject>("ChangeTest/C1/Skin/face");
        goFace = GameObject.Instantiate<GameObject>(goFace);
        goFace.SetActive(false);
       

        UnityFactory.factory.ReplaceSkin(
            player.GetComponentInChildren<UnityArmatureComponent>().armature,
            goFace.GetComponent<UnityArmatureComponent>().armature.armatureData.defaultSkin
            );
        Destroy(goFace);
        yield return wait;
    }

    
}

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-07-22 23:06:05  更:2021-07-22 23:06:23 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/20 13:16:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码