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;
    }

    
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值