暗黑战神换装系统的实现
2017-04-30 13:26
323 查看
翻了一下暗黑战神的换装系统,效果如下图所示,可以看到人物的武器,盔甲外观的模型具有不同程度的变化。
其实人物模型以及Hierarchy层级最初如下图所示,101_XX每个节点具有一个SkinnedMeshRenderer组件,对应每个可换装部位的模型。
整体视图如下所示,中间为人物的各个可换装部分,左右两边分别对应武器和人物实体类型:
换装有两种方式,一种是直接将装备挂载在某个Slot下面,如翅膀,武器-刀,这一种简单的设置为Slot的子结点即可:
private void AddEquidmentByParentNode(string nodeName, GameObject equipGo)
{
Transform equipTransform = GetChild(transform, nodeName);
Vector3 scale = equipGo.transform.localScale;
equipGo.transform.parent = equipTransform;
equipGo.transform.localPosition = Vector3.zero;
equipGo.transform.localEulerAngles = Vector3.zero;
equipGo.transform.localScale = scale;
}
另外一种则是替换Mesh和Material,一般是需要和角色融为一体的装备,如拳套,角色外形,腿部胸部挂件等,需要处理SkinnedMeshRenderer:
private void AddEquidmentByMeshRenderer(string nodeName, GameObject equipGo)
{
Transform equipTransform = GetChild(transform, nodeName);
SkinnedMeshRenderer equipSMR = equipGo.GetComponent<SkinnedMeshRenderer>();
SkinnedMeshRenderer smr = equipTransform.GetComponent<SkinnedMeshRenderer>();
if (smr == null)
return;
smr.castShadows = false;
smr.receiveShadows = false;
smr.useLightProbes = true;
smr.sharedMaterial = equipSMR.sharedMaterial;
smr.sharedMesh = equipSMR.sharedMesh;
List<Transform> bones = new List<Transform>();
for (int i = 0; i < equipSMR.bones.Length; i++)
{
bones.Add(GetChild(transform, equipSMR.bones[i].name));
}
smr.bones = bones.ToArray();
}
进一步可以合并Mesh以及Material。最终效果如下:
其实人物模型以及Hierarchy层级最初如下图所示,101_XX每个节点具有一个SkinnedMeshRenderer组件,对应每个可换装部位的模型。
整体视图如下所示,中间为人物的各个可换装部分,左右两边分别对应武器和人物实体类型:
换装有两种方式,一种是直接将装备挂载在某个Slot下面,如翅膀,武器-刀,这一种简单的设置为Slot的子结点即可:
private void AddEquidmentByParentNode(string nodeName, GameObject equipGo)
{
Transform equipTransform = GetChild(transform, nodeName);
Vector3 scale = equipGo.transform.localScale;
equipGo.transform.parent = equipTransform;
equipGo.transform.localPosition = Vector3.zero;
equipGo.transform.localEulerAngles = Vector3.zero;
equipGo.transform.localScale = scale;
}
另外一种则是替换Mesh和Material,一般是需要和角色融为一体的装备,如拳套,角色外形,腿部胸部挂件等,需要处理SkinnedMeshRenderer:
private void AddEquidmentByMeshRenderer(string nodeName, GameObject equipGo)
{
Transform equipTransform = GetChild(transform, nodeName);
SkinnedMeshRenderer equipSMR = equipGo.GetComponent<SkinnedMeshRenderer>();
SkinnedMeshRenderer smr = equipTransform.GetComponent<SkinnedMeshRenderer>();
if (smr == null)
return;
smr.castShadows = false;
smr.receiveShadows = false;
smr.useLightProbes = true;
smr.sharedMaterial = equipSMR.sharedMaterial;
smr.sharedMesh = equipSMR.sharedMesh;
List<Transform> bones = new List<Transform>();
for (int i = 0; i < equipSMR.bones.Length; i++)
{
bones.Add(GetChild(transform, equipSMR.bones[i].name));
}
smr.bones = bones.ToArray();
}
进一步可以合并Mesh以及Material。最终效果如下:
相关文章推荐
- Ogre中实现换装系统
- Ogre中实现换装系统
- 使用piece和插槽灵活实现3D游戏中的换装系统
- [Unity3D]Unity3D游戏开发之换装系统的实现
- 虚幻4 捏脸和换装系统实现
- cocos2d-x实现3D模型的换装系统的研究
- 人物换装系统基本实现,开始做多线程加载。
- Unity3D游戏开发之换装系统的实现
- cocos2d-x实现3D模型的换装系统的研究
- Ogre中实现换装系统
- cocos2d-x实现3D模型的换装系统的研究
- 虚幻4 捏脸和换装系统实现
- linux下使用系统调用编程实现copy命令功能
- 在ASP.NET系统中实现与EXCEL的交互
- Linux 系统内核空间与用户空间通信的实现与分析 from [http://www-900.ibm.com/developerWorks/cn/linux/]
- 网络系统实现技术之IPX与SPX
- linux下使用系统调用实现进程后台运行
- 实现WEB中的@虚拟域名系统(原理篇)
- 网络系统实现技术--AppleTalk
- 人事档案信息管理系统的面向对象的分析、设计和实现