• Unity3D游戏开发之换装系统的实现


    换装有两种:增加式换装、更新式换装

     一、增加式换装

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

    二、更新式换装

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

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

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

    这种方法需要设计者完全的了解角色身体的内部构造,所以需要和美工有良好的合作才可以实现。

    本文出处:http://blog.csdn.net/qinyuanpei/article/details/24393683

  • 相关阅读:
    第八篇 Flask中的蓝图
    第七篇 Flask实例化配置及Flask对象配置
    第六篇 Flask中的路由系统
    第五篇 Flask 中内置的 Session
    第四篇 Flask 中的模板语言 Jinja2 及 render_template 的深度用法
    第三篇 Flask中的request
    守护进程与守护线程
    GIL(全局解释器锁)与互斥锁
    python 面向对象
    实现能计算类似1
  • 原文地址:https://www.cnblogs.com/UnrealEra/p/5861581.html
Copyright © 2020-2023  润新知