学习自 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
{
void Start()
{
StartCoroutine(ChangeSkin());
}
private IEnumerator ChangeSkin()
{
WaitForSeconds wait = new WaitForSeconds(2);
yield return wait;
GameObject player = GameObject.Find("Player");
GameObject goBody = Resources.Load<GameObject>("ChangeTest/C2/Skin/body");
goBody = GameObject.Instantiate<GameObject>(goBody);
goBody.SetActive(false);
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;
}
}
|