【Unity&DragonBone】实现更换像素角色人物的衣服(一)
2016-12-15 16:16
537 查看
首先更换像素角色人物的衣服,实质上是:
1.更换 像素点(精确的画出手臂每个部位的像素,对齐像素点,然后更换精确到1px像素的图片)
由于DragonBone已经设置好对应的精灵在UNITY,所以这条路很难实现
2.设置衣服图片为对应身体部位为其子物体(直接画出手臂的图片,然后想PS有图层那样,使得衣服手臂的图片在最后渲染)
本文章主要说的是设置其为子物体,并改变物体的渲染层级,来实现同样的效果
先用PS工具画出 图片 (这里仅作测试使用,简化了图片)衣服左手测试,保存PNG格式,导入DB,(如果不知道怎么使用DB,可以参考我之前写的文章),导入Unity
调整图片大小,位置(代码化的时候,这一步也不可缺少)
在Unity中,选择“左手”的这个骨架,选择动画,播放,可以看出测试图片并没有跟随移动
(这个因为在DB中,想对应的图片已经被骨骼绑定,对应在UNITY中,这个骨架就只有骨骼在移动)
为了验证猜想,把测试图片变为左手的子类(不明白“像素角色人物骨骼是如何移动的构成”,可以看我之前的文章)
调整测试图片的Sorting Layer 为3(即最高层),启动,发现测试图片是跟随移动的
骨骼的结构最好如下所示(这样命名,很规则,方便以后代码化的查找)
在Unity中有渲染层数
当然你也可以用更直观的办法来做,由于Unity创建的2D游戏其实也是在3D场景里做的只不过用的是XY轴的正交摄像机,所以你也可以直接设置游戏对象的Z坐标来控制游戏对象的显示。
资料链接:--------------------------------------------
--------------------------------------------
然而以上都只是测试,要想实现更换像素角色人物的衣服,必须使得衣服显示在皮肤上方
一开始我以为,改变Layer就可以实现。过程如下
通过这样的代码可以实现 遍历某物体的所有子物体
运行上面的代码,效果如下,其子物体的order in layer全部为0
然而这种改变 渲染层数Layer是无法实现效果的,作为实验的黑色小方块,也是无法可见的
------------------
后来发现
每一个DragonBone生成的Armature都有一个MeshRenderer网格渲染组件。
经过实验发现,仅仅把黑色小方块放置为像素人物身体部件的子物体的时候,这个黑色小方块的sorting layer 和order in layer都与骨架Armature一致
改变每个身体部件的MeshRenderer网格渲染组件,使其透明化,也可以达到换皮肤的效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LayerTest : MonoBehaviour {
// Use this for initialization
void Start () {
int i = 31;
print("i==:" + i + "\n");
foreach (Transform t in GetComponentsInChildren<Transform>())//遍历此.CS文件挂的物体下每个子物体
{
print("name:" + t.name + "\n");
// print("order in layer:" + t.gameObject.layer + "\n");
if (t.GetComponent<MeshRenderer>() != null)//判断每个子物体是否有MeshRenderer组件
{
t.GetComponent<MeshRenderer>().enabled = false;//判断每个子物体是否有MeshRenderer组件,如果有,使其透明
}
// t.gameObject.layer = i;
//i -= 1;
// print("order in layer+:" + t.gameObject.layer + "\n");
//获得物体的Layer层
}
}
可以看到Armature是没有MeshRenderer组件的
运行后,只有黑色小方块显示
下一篇文章:通过改变MeshRenderer组件来实现像素人物角色换皮肤的效果
1.更换 像素点(精确的画出手臂每个部位的像素,对齐像素点,然后更换精确到1px像素的图片)
由于DragonBone已经设置好对应的精灵在UNITY,所以这条路很难实现
2.设置衣服图片为对应身体部位为其子物体(直接画出手臂的图片,然后想PS有图层那样,使得衣服手臂的图片在最后渲染)
本文章主要说的是设置其为子物体,并改变物体的渲染层级,来实现同样的效果
先用PS工具画出 图片 (这里仅作测试使用,简化了图片)衣服左手测试,保存PNG格式,导入DB,(如果不知道怎么使用DB,可以参考我之前写的文章),导入Unity
调整图片大小,位置(代码化的时候,这一步也不可缺少)
在Unity中,选择“左手”的这个骨架,选择动画,播放,可以看出测试图片并没有跟随移动
(这个因为在DB中,想对应的图片已经被骨骼绑定,对应在UNITY中,这个骨架就只有骨骼在移动)
为了验证猜想,把测试图片变为左手的子类(不明白“像素角色人物骨骼是如何移动的构成”,可以看我之前的文章)
调整测试图片的Sorting Layer 为3(即最高层),启动,发现测试图片是跟随移动的
骨骼的结构最好如下所示(这样命名,很规则,方便以后代码化的查找)
在Unity中有渲染层数
unity3d怎么控制优先级
你可以在游戏物体物体的属性面板里设置Sorting Layer(用于设置不同层的显示顺序)和Order in Layer(用于设置在同一层中的显示顺序)来改变显示顺序。当然你也可以用更直观的办法来做,由于Unity创建的2D游戏其实也是在3D场景里做的只不过用的是XY轴的正交摄像机,所以你也可以直接设置游戏对象的Z坐标来控制游戏对象的显示。
资料链接:--------------------------------------------
Unity3d 更改所有子物体的Layer层
untiy3d 里面的设置面板里面 “layer”和”sorting layer“是什么区别。
unity渲染层级关系小结
unity3d怎么控制优先级
层Layers
UGUI研究院之不添加摄像机解决UI与UI特效叠层问题(九)
Unity3D中Layers和LayerMask解析
遍历父物体下所有子物体的几种方式--------------------------------------------
然而以上都只是测试,要想实现更换像素角色人物的衣服,必须使得衣服显示在皮肤上方
一开始我以为,改变Layer就可以实现。过程如下
通过这样的代码可以实现 遍历某物体的所有子物体
using System.Collections; using System.Collections.Generic; using UnityEngine; public class LayerTest : MonoBehaviour { // Use this for initialization void Start () { foreach (Transform t in GetComponentsInChildren<Transform>()) { print("name:" + t.name + "\n"); int i = 0; i = t.gameObject.layer; print("order in layer:" + i + "\n"); //获得物体的Layer层 } } }
运行上面的代码,效果如下,其子物体的order in layer全部为0
然而这种改变 渲染层数Layer是无法实现效果的,作为实验的黑色小方块,也是无法可见的
------------------
后来发现
每一个DragonBone生成的Armature都有一个MeshRenderer网格渲染组件。
经过实验发现,仅仅把黑色小方块放置为像素人物身体部件的子物体的时候,这个黑色小方块的sorting layer 和order in layer都与骨架Armature一致
改变每个身体部件的MeshRenderer网格渲染组件,使其透明化,也可以达到换皮肤的效果。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LayerTest : MonoBehaviour {
// Use this for initialization
void Start () {
int i = 31;
print("i==:" + i + "\n");
foreach (Transform t in GetComponentsInChildren<Transform>())//遍历此.CS文件挂的物体下每个子物体
{
print("name:" + t.name + "\n");
// print("order in layer:" + t.gameObject.layer + "\n");
if (t.GetComponent<MeshRenderer>() != null)//判断每个子物体是否有MeshRenderer组件
{
t.GetComponent<MeshRenderer>().enabled = false;//判断每个子物体是否有MeshRenderer组件,如果有,使其透明
}
// t.gameObject.layer = i;
//i -= 1;
// print("order in layer+:" + t.gameObject.layer + "\n");
//获得物体的Layer层
}
}
可以看到Armature是没有MeshRenderer组件的
运行后,只有黑色小方块显示
下一篇文章:通过改变MeshRenderer组件来实现像素人物角色换皮肤的效果
相关文章推荐
- 【Unity&DragonBones】像素角色人物骨骼动画教程(一)PS文件如何导入DragonBones
- 【Unity&DragonBones】像素角色人物骨骼动画教程(三)骨骼动画人物奔跑起来
- 【Unity&DragonBones】像素角色人物骨骼动画教程(二)骨骼树设置与骨骼动画关键帧
- 【Unity&DragonBones】像素角色人物骨骼动画教程(四)蒙皮骨骼动画使得角色动作更流畅
- 时光煮雨 Unity3D实现2D人物动画② Unity2D 动画系统&资源效率
- [Unity&RPG]实现简单的鼠标点击移动 角色
- NGUI 实现 透明底图遮罩 && 人物像素变黑
- Unity中实现人物平滑转身
- unity实现血条随人物的移动
- 角色游戏之3(人物血条的实现)
- Unity 中用 Vertex & Fragment Shader 实现 surface shader 中的 Diffuse 和 Decal
- <Unity UGUI> 在Unity5 的UGUI系统上实现图片的遮罩
- 微软企业库5.0 学习之路——Unity&PIAB 通过配置实现AOP
- Unity中UGUI人物血条跟随的几种实现方式(一)
- Unity中UGUI人物血条跟随的几种实现方式(二)
- <Unity UGUI>使用c#反射实现UGUI文本显示的国际化
- 【Unity快速实现小功能】动画系统学习小技巧篇(二)——摄像机跟随角色移动
- unity 角色死亡界面变灰实现
- 案例演示按"角色"的form认证实现过程