如何在角色上做可互换的盔甲(低聚模型)

时间:2017-05-29 15:01:38

标签: animation unity3d blender

我目前正在使用RPG图形上与Runescape(旧学校)非常相似,但使用我自己的游戏系统。我不确定拥有可互换装甲系统的最佳方法是什么。正如我所说的,我将创建低多边形模型,类似于像here这样的runescape模型,并且希望有可能随机变化像here这样的盔甲。

我理解有两种方法,第一种是改变我的角色模型的网格,第二种是创建我的角色模型,并使用骨骼权重来装甲模型。我知道这里有关于第一个选项的全部主题(无法制作第三个链接) forum.unity3d.com/threads/stitch-multiple-body-parts-into-one-character.16485 / ,但是真的吗?关于类似事物的每一次讨论都会引发这个话题。但它就像8岁和Unity 2.0一样......是否有更简单的方法来实现相同的结果,但不要研究主要的提示,这是我无法实现的令人筋疲力尽的解释。而对于第二种方式,我无法找到任何提示,除了手册和脚本在统一网络上的骨重量,这对我的使用和我的技能来说太笼统了。我花了几个小时寻找一些解决方案(教程),但谷歌不断推出相同的主题,这些主题是4-8岁......

有关如何选择更换装甲的最佳方法以及如何获得有关这些问题的任何知识的任何建议?谢谢。

1 个答案:

答案 0 :(得分:2)

所以我在我的项目中所做的是复制我的基本角色.blend文件(装备,模型)并删除大部分网格,除了我想要制作衣服的身体部位(胸部/腿)。我把它拉了一下,所以顶点不与基础网格重叠,只是保存它。

然后在Unity中我创建了一个刚刚保存的模型的新预制件。预制件的层次结构如下所示:带有BoneReplacer.cs脚本的父游戏对象 - >带有皮肤网眼渲染器的儿童游戏对象。

然后我所要做的就是将这个预制件拖到我的角色预制件上,这样这个脚本中的目标变量就指向我角色的蒙皮网格渲染器。

这可能不是最好的方法,但它对我有用,也许它会帮助你了解它并创造一些更好的解决方案。

继承人BoneReplacer.cs脚本:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class BoneReplacer : MonoBehaviour
{
    public GameObject target;
    SkinnedMeshRenderer myRenderer;
    Transform[] newBones;
    SkinnedMeshRenderer targetRenderer;
    Dictionary<string, Transform> boneMap = new Dictionary<string, Transform>();

    void Start()
    {
        target = transform.parent.parent.gameObject;
        targetRenderer = target.GetComponentInChildren<SkinnedMeshRenderer>();

        foreach (Transform _bone in targetRenderer.bones)
        {
            boneMap[_bone.gameObject.name] = _bone;
        }

        myRenderer = gameObject.GetComponent<SkinnedMeshRenderer>();
        newBones = new Transform[myRenderer.bones.Length];

        for (int i = 0; i < myRenderer.bones.Length; i++)
        {
            GameObject _bone = myRenderer.bones[i].gameObject;
            if (!boneMap.TryGetValue(_bone.name, out newBones[i]))
            {
                Debug.Log("Unable to map bone ~" + _bone.name + "~ to target skeleton!");
                break;
            }
        }

        myRenderer.bones = newBones;
        myRenderer.rootBone = targetRenderer.rootBone;
    }
}