unity人物换装

xiaogeformax xiaogeformax     2022-12-03     620

关键词:

unity人物换装

人物换装算是游戏中的老梗了,为了美化游戏,为获取更好的游戏体验,很多游戏中可以实现人物换装,还可以给人物更换武器,还要翅膀什么的。总之,能在玩家在体验上 带来很好的效果。
先看下效果图。

这个就把一个人物的形象稍微改变了下。为游戏增加些乐趣。

人物的皮肤的制作

首先看下人物皮肤的制作,其实这里美术已经给制作几套模型,我们之给第一套人物模型添加上骨骼,后面的就皮肤都不添加上骨骼了。只有给其加上SkinnedMeshRenderer,且只给添加上一套SkinnedMeshRenderer,不能够添加重复了。

这里就可以去批量生成衣服的prefab了。最好的CreatePrefabInternal()函数就是一句自定义的制作prefab的函数了。

[MenuItem("GameObject/批量生成角色衣服Prefab", false, 0)]
    public static void GenerateBodyClothPrefab()
    
        if (index >= 1)
        
            ResetCreateNormalPrefabByFbxmane();
            return;
        
        index++;
        GameObject[] objs = Selection.gameObjects;
        for (int index1 = 0; index1 < objs.Length; index1++)
        
            GameObject obj = objs[index1];
            if (obj.GetComponent<SkinnedMeshRenderer>() == null)
            
                SkinnedMeshRenderer[] skins = obj.GetComponentsInChildren<SkinnedMeshRenderer>();
                if (skins != null && skins.Length > 0)
                
                    for (int i = 0; i < skins.Length; i++)
                    
                        CreateSingleBodySkinPrefab(skins[i].gameObject);
                    
                
            
            else
            
                CreateSingleBodySkinPrefab(obj);
            
        
    
 public static void CreateSingleBodySkinPrefab(GameObject skin)
    
        if (skin == null) return;
        SkinBonesRecord boneRecord = skin.GetComponent<SkinBonesRecord>();
        if (boneRecord == null)
            boneRecord = skin.AddComponent<SkinBonesRecord>();
        boneRecord.RecordBoneNames();
        SkinnedMeshRenderer mesh = skin.GetComponent<SkinnedMeshRenderer>();
        mesh.receiveShadows = false;
        mesh.useLightProbes = false;
        mesh.shadowCastingMode = UnityEngine.Rendering.ShadowCastingMode.Off;
        EditorUtility.SetDirty(skin);
        string prefabpath = tempPrefabFolderPath + skin.name + "skin.prefab";
        CreatePrefabInternal(skin, prefabpath);
    

加载衣服模型

衣服的prefab制作好了,我们在游戏中将其的assetBundle加载进来。这里是通过ShowClothStyle的id将其加载进来的,如果为0的话,就卸载当前的衣服,否则就进去穿衣服的函数。

 public void ShowEquipsFashionCloth(int ShowClothStyle)
        
            if (LoadConfigManager.ModelShowContainer.dic.ContainsKey(ShowClothStyle) == false)
            
#if UNITY_EDITOR
                Debug.LogFormat("不存在时装0", ShowClothStyle);
#endif
                return;
            
            #region 衣物模型生成
            if (ShowClothStyle != 0)
            
                //更换
                if (ShowClothStyle != _lastClothStyle && ShowClothStyle != 0)
                           characterGene.ChangeBodyCloth(ShowClothStyle, false);
                
            
            else
            
                //脱下装备
                if (_lastClothStyle != 0)
                
                    characterGene.RemoveBodyCloth();
                
            
            #endregion
            _lastClothStyle = ShowClothStyle;
        

下面的函数会先将旧的衣服的id号保存起来,然后装备里面的号码更新为新的id号。

public void ChangeBodyCloth(int modelid, bool isNgui = false, System.Action doneact = null)
     
        int oldclothid = 0;
        if (equipsModelCache.ContainsKey("body"))
            oldclothid = equipsModelCache["body"];
        var model = LoadConfigManager.ModelShowContainer.GetModelShow(modelid);
        if (model == null)
        
            return;
        
        equipsModelCache["body"] = modelid;
        GameManager.assetBundleNew.StartCoroutine(_ChangeBodyCloth(modelid, isNgui,oldclothid, doneact));
    

因为要在assetBundle里面加载,所有需要使用协程函数。

 private IEnumerator _ChangeBodyCloth(int clothid, bool isNgui, int oldClothid, System.Action doneact)
    
        if (characterRoot == null)
        
            Debug.Log("!!! character root is not exist");
            yield break;
        
        bool isMapRelevant = true;
        if (isNgui)
            isMapRelevant = true;
        GameObject newskinobj = GameManager.objectCacheMgr.SpawnByModelStyle(CacheType.ResName_Model, clothid, true);
        if (newskinobj == null)
        
            var abinfo = GameManager.assetBundleNew.CreateModelAB(clothid, false, true, isMapRelevant, isNgui);
            if (abinfo == null)
            
                yield break;
            
            while (!abinfo.IsDone)
                yield return null;

            newskinobj = abinfo.objInst as GameObject;
            if (isMapRelevant)
              //从缓存池里读取  AssetBundles.AssetBundleManagerNew.AddToMapRelDyUnloadAbInfos(abinfo, isMapRelevant);
            else
              //放入缓存里面  AssetBundles.ABLoadInfo.Release(abinfo);
            if (newskinobj == null)
            
                yield break;
            
        
        if (destroy)
               GameManager.objectCacheMgr.CacheExsistGOToCachePool(5, clothid, "", newskinobj, false, false);
            yield break;
        
        if (!equipsModelCache.ContainsKey("body") || equipsModelCache["body"] != clothid)
        
#if UNITY_EDITOR
            Debug.LogWarning(clothid + "---download clothid is not cur clothid---- " + "body --" + equipsModelCache["body"]);
#endif
            GameManager.objectCacheMgr.CacheExsistGOToCachePool(5, clothid, "", newskinobj, false, false);
            yield break;
        
        //共用一套总骨骼,但是需要更新信息,需要公用下载
        if (skins == null)
        
            Debug.LogError("no skin");
            yield break;
        
        SkinnedMeshRenderer newskin = newskinobj.GetComponent<SkinnedMeshRenderer>();
        SkinBonesRecord skinbonesRecord = newskinobj.GetComponent<SkinBonesRecord>();
        if (newskin == null)
        
            Debug.LogError("new skin obj no skinnedmeshrender " + newskinobj.name);
            GameObject.Destroy(newskinobj);
            yield break;
        
        if (skinbonesRecord == null)
        
            Debug.LogError("new skin obj no SkinBonesRecord " + newskinobj.name);
            GameObject.Destroy(newskinobj);
            yield break;
        
        List<Transform> bones = new List<Transform>(40);
        for (int i = 0; i < skinbonesRecord.BoneNames.Count; i++)
        
            for (int j = 0; j < bonetrans.Length; j++)
            
                if (boneNames[j] == skinbonesRecord.BoneNames[i])
                
                    bones.Add(bonetrans[j]);
                    break;
                
            
        
        if (normalRoot == null)
        
            GameObject.Destroy(newskinobj);
            yield break;
        
        if (newSkinMesh == null)
        
            newSkinMesh = newskin;
            newskin.bones = bones.ToArray();
            newskinobj.transform.SetParent(normalRoot.transform);
            newskinobj.transform.localPosition = Vector3.zero;
            newskinobj.transform.localEulerAngles = new Vector3(-90, 0, 0);
            newskinobj.transform.localScale = Vector3.one;
            baseSkinMesh.gameObject.SetActive(false);
            newskinobj.SetActive(true);
        
        else
        
            newskin.bones = bones.ToArray();
            newskinobj.transform.SetParent(normalRoot.transform);
            newskinobj.transform.localPosition = Vector3.zero;
            newskinobj.transform.localEulerAngles = new Vector3(-90, 0, 0);
            newskinobj.transform.localScale = Vector3.one;
            baseSkinMesh.gameObject.SetActive(false);
            newskinobj.SetActive(true);
            if (oldClothid != 0)
                GameManager.objectCacheMgr.CacheExsistGOToCachePool(5, oldClothid, "", newSkinMesh.gameObject, false, false);
            else
                GameObject.DestroyImmediate(newSkinMesh.gameObject);
            newSkinMesh = newskin;
        
        if (isNgui)
        
            NGUITools.SetLayer(newSkinMesh.gameObject, (int)SceneLayer.NGui);
        
        else
        
            Util.SetObjectLayerWithTagFilter(charobtype, newSkinMesh.gameObject, Const.SceneTags_ModelEffect);
        
        ChangeSkinShader();
        if (doneact != null)
            doneact();
    

unity3d换装之模型动画分离

...许是如同3D手游一般,更换模型动画。 对于游戏中的人物,一般分为头、上身、下身、武器四大部分就可以了。所以在游戏中,我们把这四部分单独做四个模型动画,然后动态拼接为一个整体,达到换装的效果。 然后根... 查看详情

unity实现换装系统

publicclassAvatarSys:MonoBehaviour   //privateGameObjectgirlSource;//资源model   privateTransformgirlSourceTrans;   privateGameObjectgirlTarget;//骨架物体  查看详情

unity3d换装系统

...注明出处:http://www.cnblogs.com/shamoyuu/p/6505561.html 一、换装原理  游戏角色换装分为以下几步:    1.替换蒙皮网格    2.刷新骨骼    3.替换材质   上面这种是比较简单的换装,可以实现,但是一般我们... 查看详情

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

换装有两种:增加式换装、更新式换装  一、增加式换装       所谓增加式换装,就是指角色模型的身体是一个完整的网格,需要更换的部分只是一个可拆卸的部件,因而换装实际上就是在特定的... 查看详情

unity角色换装问题(代码片段)

游戏中经常涉及到角色换装问题。1.装备模型中的每一套装备都必须使用同一套骨骼,把单个骨骼数据保存成Prefab,骨骼数据在Unity中以Transform形式存在2.把模型中的每个部分都单独保存成prefab。实现思路:1.创建骨骼GameObject,把... 查看详情

dragonbones龙骨换装(局部换装)

...的图片,来达到局部换装的目的。游戏中可以只制作一个人物动画,然后局部替换100套衣服、100套发型或者100种眼睛。甚至可以把人和衣服所有插槽都换了。下图替换了衣服。     一、创建一个测试骨骼动画pub... 查看详情

unity体感设备kinectv2虚拟换装解决方案

...ouUnity插件版本:Kinectv2ExampleswithMS-SDK2.13,Kinect插件示例3D换装Demo场景:更换模型,绑定模型,以及材质更换即能实现网上很多的3D换装功能。(1):KinectFittingRoom1(2):KinectFittingRoom2以上两个场景为官方自带的3D换装功能;本... 查看详情

有没有大佬知道spine怎么在unity里换装的基本流啊,要被开了

参考技术A打开你的unity安装目录下的Editor\StandardPackages.把你的unitypackage扔进去,再打开Unity,右击project,选择Inputpackage就能找到你的,点击就可导入。 查看详情

角色换装

https://www.cnblogs.com/oldman/articles/2395518.html Unity3D角色换装实现原理及步骤https://www.cnblogs.com/dosomething/archive/2012/04/15/2450526.html 查看详情

unity记一次时装骨骼换装的合并(代码片段)

换装入门之前做过一次,好久没做了国内团队都会做,做法也是各自精彩,只是分享的少;而国外的技术相对比较单一,但是模型细节度,丰富度都远不如国内,也很难和国内技术栈整合;所以网... 查看详情

unity记录一下skinnedmeshrender换装系统的关键(代码片段)

其实,关键就在于SkinnedMeshRenderer有点废话其实,关键在于Mesh和bones要匹配,也就是mesh从哪里来的,那个节点下bones都要包含进来下面这段代码就是不包含节点也没关系,指向引用也是可以的但是bones的引用不... 查看详情

基于spine动画的avatar换装系统优化

...     很多游戏开发团队都正在使用Spine动画软件来制作人物AVATAR动画,作为一款广泛应用于游戏中的2D动画制作软件,Spine提供了良好的骨骼动画功能和库接口来实现人物AVATAR动画。                 自从Spine支... 查看详情

基于spine动画的avatar换装系统优化

...     很多游戏开发团队都正在使用Spine动画软件来制作人物AVATAR动画,作为一款广泛应用于游戏中的2D动画制作软件,Spine提供了良好的骨骼动画功能和库接口来实现人物AVATAR动画。                 自从Spine支... 查看详情

基于spine动画的avatar换装系统优化

...     很多游戏开发团队都正在使用Spine动画软件来制作人物AVATAR动画,作为一款广泛应用于游戏中的2D动画制作软件,Spine提供了良好的骨骼动画功能和库接口来实现人物AVATAR动画。                 自从Spine支... 查看详情

基于spine动画的avatar换装系统优化

...     很多游戏开发团队都正在使用Spine动画软件来制作人物AVATAR动画,作为一款广泛应用于游戏中的2D动画制作软件,Spine提供了良好的骨骼动画功能和库接口来实现人物AVATAR动画。                 自从Spine支... 查看详情

unity啥时候用到unity二维动画混合树

参考技术A换装问题其实有三种方式,换材质,换模型,换网格。如果你想详细了解的话,百度搜索《小阿哥换装》,第一个就是。 查看详情

基于spine动画的avatar换装系统优化

...     很多游戏开发团队都正在使用Spine动画软件来制作人物AVATAR动画,作为一款广 查看详情

基于spine动画的avatar换装系统优化

...     很多游戏开发团队都正在使用Spine动画软件来制作人物AVATAR动画,作为一款广 查看详情