您的位置:首页 > 移动开发 > Unity3D

【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中有渲染层数

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组件来实现像素人物角色换皮肤的效果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: