关键词:
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动画,作为一款广 查看详情