大家好,我是秦元培,

         不知从什么时候开始,国产RPG单机游戏开始出现换装,仙剑系列中第一部实现了换装的游戏是仙剑奇侠传四,后来原上海软星团队,目前的烛龙科技更是在/《古剑奇谭》中将换装发挥到了极致。我们来看几组图片吧:

unity3d spine换装 unity3d换装游戏_.net

unity3d spine换装 unity3d换装游戏_贴图_02

unity3d spine换装 unity3d换装游戏_.net_03

unity3d spine换装 unity3d换装游戏_System_04

        换装从某种意义上来说就是改变角色的外观,虽然没有什么特别实用的功能,但从视觉上可以打破以往PRG游戏一套行头走天下的尴尬局面,所以换装还是很不错的。那么从技术上来讲,换装主要分为两类:

         一、增加式换装

             所谓增加式换装,就是指角色模型的身体是一个完整的网格,需要更换的部分只是一个可拆卸的部件,因而换装实际上就是在特定的部位增加或者移除一个模型。这类换装通常用在角色的武器更换中,仙剑、古剑的武侠更换都是这种类型,如图所示的鱼骨头只是在手这个位置更换模型:

unity3d spine换装 unity3d换装游戏_.net_05

         二、更新式换装

                更新式换装是指角色拥有一个公共的骨骼网络和针对该模型的若干组贴图。那么,此时的换装实际上就是将贴图贴到对应的位置实现角色外观的改变,仙剑四严格来讲应该不算是换装,它实际上是做了两套模型(琼华装/野人装)。古剑奇谭的换装实际上就是这种类型的换装,这里我们以下面的一个例子,来一起学习如何实现这种类型的换装。首先我们创建一个Unity项目:

         首先我们去下载官方提供的换装的例子,我们这里只需要里面的模型,因为这个模型提供了多组贴图可以供我们使用。我们将模型拖拽到场景中,我们展开模型可以发现模型是有若干个部分组成的,每一个模型都有一个SkinnedMeshRenderer组件,改变该组件的材质,我们就可以实现对特定部位的换装。由此,我们写出了下面的代码:


using UnityEngine;
using System.Collections;

public class ChangeSkin : MonoBehaviour {
	
	//眼睛贴图
	public Texture2D[] TextureEyes;
	//面部贴图-前
	public Texture2D[] TextureFace1;
	//面部贴图-后
	public Texture2D[] TextureFace2;
	//头发贴图-前
	public Texture2D[] TextureHair1;
	//头发贴图-后
	public Texture2D[] TextureHair2;
	//下衣贴图-前
	public Texture2D[] TexturePants1;
	//下衣贴图-后
	public Texture2D[] TexturePants2;
    //上衣贴图-前
	public Texture2D[] TextureTop1;
	//上衣贴图-后
	public Texture2D[] TextureTop2;
	//鞋子贴图-前
	public Texture2D[] TextureShoes1;
	//鞋子贴图-后
	public Texture2D[] TextureShoes2;
	
	//与贴图对应的SkinnedMeshRenderer
	SkinnedMeshRenderer MeshEyes;
	SkinnedMeshRenderer MeshFace1;
	SkinnedMeshRenderer MeshFace2;
	SkinnedMeshRenderer MeshHair1;
	SkinnedMeshRenderer MeshHair2;
	SkinnedMeshRenderer MeshPants1;
	SkinnedMeshRenderer MeshPants2;
	SkinnedMeshRenderer MeshTop1;
	SkinnedMeshRenderer MeshTop2;
	SkinnedMeshRenderer MeshShoes1;
	SkinnedMeshRenderer MeshShoes2;
	
	void Start () 
	{
	   //获取SkinnedMeshRenderer
	   MeshEyes=transform.Find("eyes").GetComponent<SkinnedMeshRenderer>();
	   MeshFace1=transform.Find("face-1").GetComponent<SkinnedMeshRenderer>();
	   MeshFace2=transform.Find("face-2").GetComponent<SkinnedMeshRenderer>();
	   MeshHair1=transform.Find("hair-1").GetComponent<SkinnedMeshRenderer>();
	   MeshHair2=transform.Find("hair-2").GetComponent<SkinnedMeshRenderer>();
	   MeshPants1=transform.Find("pants-1").GetComponent<SkinnedMeshRenderer>();
	   MeshPants2=transform.Find("pants-2").GetComponent<SkinnedMeshRenderer>();
	   MeshTop1=transform.Find("top-1").GetComponent<SkinnedMeshRenderer>();
	   MeshTop2=transform.Find("top-2").GetComponent<SkinnedMeshRenderer>();
	   MeshShoes1=transform.Find("shoes-1").GetComponent<SkinnedMeshRenderer>();
	   MeshShoes2=transform.Find("shoes-2").GetComponent<SkinnedMeshRenderer>();
	}
	
	void OnGUI()
	{
	  if(GUILayout.Button("显示外装1",GUILayout.Height(30)))
	  {
        SetSkin(MeshEyes,TextureEyes[0]);
		SetSkin(MeshFace1,TextureFace1[0]);
		SetSkin(MeshFace2,TextureFace2[0]);
		SetSkin(MeshHair1,TextureHair1[0]);
		SetSkin(MeshHair2,TextureHair2[0]);
		SetSkin(MeshPants1,TexturePants1[0]);
		SetSkin(MeshPants2,TexturePants1[0]);
		SetSkin(MeshTop1,TextureTop1[0]);
		SetSkin(MeshTop2,TextureTop2[0]);
		SetSkin(MeshShoes1,TextureShoes1[0]);
		SetSkin(MeshShoes2,TextureShoes2[0]);
	  }
		
	  if(GUILayout.Button("显示外装2",GUILayout.Height(30)))
	  {
		SetSkin(MeshEyes,TextureEyes[1]);
		SetSkin(MeshFace1,TextureFace1[1]);
		SetSkin(MeshFace2,TextureFace2[1]);
		SetSkin(MeshHair1,TextureHair1[1]);
		SetSkin(MeshHair2,TextureHair2[1]);
		SetSkin(MeshPants1,TexturePants1[1]);
		SetSkin(MeshPants2,TexturePants1[1]);
		SetSkin(MeshTop1,TextureTop1[1]);
		SetSkin(MeshTop2,TextureTop2[1]);
		SetSkin(MeshShoes1,TextureShoes1[1]);
		SetSkin(MeshShoes2,TextureShoes2[1]);	
	  }
	}

	
	private void SetSkin(SkinnedMeshRenderer mRenderer,Texture2D mTexture)
	{
	   mRenderer.material.mainTexture=mTexture;
	}
	
	
}


       这里我们提供两套外装。我们把脚本拖放到模型上,然后编辑贴图数组:

unity3d spine换装 unity3d换装游戏_System_06

        编辑好贴图后,我们就可以运行程序了,注意贴图要和模型网格匹配。运行效果:

unity3d spine换装 unity3d换装游戏_unity3d spine换装_07


       这种方法需要设计者完全的了解角色身体的内部构造,所以需要和美工有良好的合作才可以实现,感觉效果还是不错的啊,哈哈

       好了,这就是今天的博客了,希望对大家有用、希望大家喜欢!