• [Unity3D]Unity3D连衣裙实现游戏开发系统


             大家好,我是秦培。欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei

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

    我们来看几组图片吧:



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

             一、添加式换装

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


             二、更新式换装

                    更新式换装是指角色拥有一个公共的骨骼网络和针对该模型的若干组贴图。

    那么,此时的换装实际上就是将贴图贴到相应的位置实现角色外观的改变,仙剑四严格来讲应该不算是换装,它实际上是做了两套模型(琼华装/野人装)。

    古剑奇谭的换装实际上就是这样的类型的换装。这里我们以以下的一个样例,来一起学习怎样实现这样的类型的换装。

    首先我们创建一个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;
    	}
    	
    	
    }
    

           这里我们提供两套外装。

    我们把脚本拖放到模型上。然后编辑贴图数组:


            编辑好贴图后。我们就能够执行程序了,注意贴图要和模型网格匹配。

    执行效果:



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

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

           每日箴言人的思想是了不起的,仅仅要专注于某一项事业。就一定会做出使自己感到惊讶的成绩来。——马克·吐温




           喜欢我的博客请记住我的名字:秦元培。我的博客地址是:blog.csdn.net/qinyuanpei

           转载请注明出处,本文作者:秦元培,本文出处:http://blog.csdn.net/qinyuanpei/article/details/24393683


    版权声明:本文博客原创文章,博客,未经同意,不得转载。转载请注明作者和出处,谢谢!

  • 相关阅读:
    [杂题]FZU2190 非提的救赎
    [模拟]ZOJ3480 Duck Typing
    [模拟]ZOJ3485 Identification Number
    [数论]ZOJ3593 One Person Game
    [博弈]ZOJ3591 Nim
    [杂题]URAL1822. Hugo II's War
    二分图相关
    KMP算法详解
    中国国家集训队论文集目录(1999-2009)
    最短路Dijkstra算法的一些扩展问题
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4752192.html
Copyright © 2020-2023  润新知