Unity拼接网格

时间:2016-07-16 04:59:49

标签: c# unity3d mesh

我已经考虑了几天,并尝试了一些不同的东西,并搜索了相当多。我专门看了很多这个帖子

http://forum.unity3d.com/threads/stitch-multiple-body-parts-into-one-character.16485/

但我很困惑,并不确定这100%是否是我想要的。

我只是尝试使用自己的网格向已经存在的游戏对象添加新网格。它使用相同的骨骼结构或动画师,添加的对象具有粘贴位置所需的骨骼。

https://gyazo.com/19778b3c73ef9a749c8cc338f7e49d79

尝试添加到我的播放器上的对象。我尝试直接从网格中取出网格,然后将其链接到与动画播放器相同的骨骼结构

当使用fuse / mixamo创建和导入对象时,它会将对象添加为父播放器上的单独网格对象

https://gyazo.com/55ce7442dc186756da4ff149ac3543e5

所以,如果我要禁用装甲网格ID,请留下这个

https://gyazo.com/09ffd7c7721f46e6980f895a1a873749

但我尝试在没有盔甲的情况下导入我的角色。然后我用搅拌器中的玩家和装甲打开了角色并删除了玩家并离开了骨骼结构和盔甲,然后将其保存为单独的fbx并将其导入统一并将其粘贴到原始玩家的新装甲fbx上尝试它太动画了它原来是来自mixmo对象。但它没有,甚至无法在Tpose中导入它。当我自己配置​​它时,它不会保存配置,只是不断回到原来的位置。

我想我应该......只有盔甲上需要的骨头。然后做一些类型的游戏逻辑来弄清楚装甲对象上的骨骼是什么,就像添加到玩家并用装甲骨替换玩家骨骼一样?但我觉得如果我想这样做,那么我需要将玩家拆分成碎片,以便它知道要替换玩家的部分。或者有没有办法让玩家保持在一起,只需让盔甲跟随玩家的骨头,我想这将是最简单的事情

我很确定我发布的链接非常适合我想要的。我想我完全不理解它,希望有人帮助我更好地理解它

1 个答案:

答案 0 :(得分:2)

好的,这篇文章不会解释代码是如何工作的,而是如何让代码TOOOOO工作。 Masterprompt很好地解释了代码here。如果您想了解代码的工作方式,请遵循该链接。

无论如何,要做些什么来将两个对象合并在一起,使一个对象运行基础对象的动画。

示例用途可能是

  • 从四肢创造一个肢体。
  • 添加盔甲太基础玩家

如果我没有图形艺术家为我创建我的资产,我如何得到这个的肉和骨头是使用保险丝和mixamo。我强烈建议这些计划。如果没有这些程序,你仍然可以很容易地得到它,但我将解释如何使用它,就像你正在使用它。

好的,下载Adobe保险丝并创建您的基本播放器。 (最好裸体) 现在将该播放器保存为您想要的任何内容(我使用了Main_Player_Naked) 将此播放器上传到mixamo进行自动装配,从mixamo下载模型后将其导入统一。 (此时我假设您知道如何将模型设置为统一的人形)

现在您的玩家已经创建并导入团结状态,然后为他做动画或者随心所欲地做任何事情。无论你对他做什么都可以使用新的盔甲/头发/胡须,无论你添加到你的玩家身上。

好的,现在是时候创建我们要添加的装甲了。继续,在保险丝中重新打开你的裸体球员,并用他想要的新资产重建他(不要改变任何体形大小,只需添加新物体)。 (不要担心我们不会将整个模型转换出来,这只是因为我们不必自己安装新资产)现在您的新资产看起来不错,请继续并按照创建裸体游戏的第一步。因此,保存新创建的角色并导入mixamo进行自动装配。现在下载并将新播放器导入统一。删除播放器以外的所有对象,除了新资源(位于该对象下的裸体播放器的单独网格上)

现在我们将使用Masterprompts post

中的代码

我已经重写了它,所以这里是我的新代码

using UnityEngine;
using System.Collections;

public class CreatePlayer : MonoBehaviour
{

    public GameObject objPlayer;
    public GameObject objLimb;
    public GameObject objAdded;


    // Use this for initialization
    void Start()
    {
    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetKeyDown(KeyCode.H))
            AddLimb(objLimb, objPlayer);
        if (Input.GetKeyDown(KeyCode.J))
            Destroy(objAdded);
    }

    // 

    void AddLimb(GameObject BonedObj, GameObject RootObj)
    {
        var BonedObjects = BonedObj.gameObject.GetComponentsInChildren<SkinnedMeshRenderer>();
        foreach (SkinnedMeshRenderer SkinnedRenderer in BonedObjects)
        {
            ProcessBonedObject(SkinnedRenderer, RootObj);
        }
    }

    private void ProcessBonedObject(SkinnedMeshRenderer ThisRenderer, GameObject RootObj)
    {
        /*      Create the SubObject        */
        var NewObj = new GameObject(ThisRenderer.gameObject.name);
        NewObj.transform.parent = RootObj.transform;
        /*      Add the renderer        */
        NewObj.AddComponent<SkinnedMeshRenderer>();
        var NewRenderer = NewObj.GetComponent<SkinnedMeshRenderer>();
        /*      Assemble Bone Structure     */
        var MyBones = new Transform[ThisRenderer.bones.Length];
        for (var i = 0; i < ThisRenderer.bones.Length; i++)
            MyBones[i] = FindChildByName(ThisRenderer.bones[i].name, RootObj.transform);
        /*      Assemble Renderer       */
        NewRenderer.bones = MyBones;
        NewRenderer.sharedMesh = ThisRenderer.sharedMesh;
        NewRenderer.materials = ThisRenderer.materials;
        objAdded = NewObj;
    }


    private Transform FindChildByName(string ThisName,Transform ThisGObj)
    {
        Transform ReturnObj;
        if( ThisGObj.name==ThisName )
            return ThisGObj.transform;
        foreach (Transform child in ThisGObj)
        {
            ReturnObj = FindChildByName( ThisName, child );
            if( ReturnObj )
                return ReturnObj;
        }
        return null;
    }
}

这很快被抛到了一起。我建议让它更好。

但是只需添加裸体玩家objPlayer和资产添加到objLimb。

运行你的游戏并推动&#39; H&#39;创造资产和J&#39;删除它。