Unity 将网格拼接在一起
Unity Stitching meshes together
几天来我一直在思考这个问题,尝试了一些不同的方法,并在谷歌上搜索了很多。我专门看了很多这个帖子
http://forum.unity3d.com/threads/stitch-multiple-body-parts-into-one-character.16485/
但我很困惑,不确定这是否是我想要的 100%。
我只是想用自己的网格向已有的游戏对象添加一个新网格。它运行相同的骨骼结构或动画师,被添加的对象具有其粘贴位置所需的骨骼。
https://gyazo.com/19778b3c73ef9a749c8cc338f7e49d79
这就是我要添加到我的播放器上的对象。我试着直接从它身上取下网格,然后 link 将它变成与正在动画的玩家相同的骨骼结构
当使用 fuse/mixamo 创建和导入对象时,它会将对象添加为父播放器上的单独网格对象
https://gyazo.com/55ce7442dc186756da4ff149ac3543e5
所以如果我要禁用装甲网格 id 就留下这个
https://gyazo.com/09ffd7c7721f46e6980f895a1a873749
但我尝试导入没有盔甲的角色。然后我在搅拌机中打开带有玩家和盔甲的角色并删除玩家并留下骨骼结构和盔甲然后将其另存为单独的 fbx 并将其导入统一并将新的盔甲 fbx 粘贴到原始玩家上尝试为它设置动画,就像它最初来自 mixmo 对象一样。但它没有,甚至不能让它导入 Tpose。当我自己配置它时,它不会保存配置,只会继续回到原来的位置。
我想我应该....只有盔甲上需要的骨头。然后做一些类型的游戏逻辑来找出盔甲对象上哪些骨骼与添加到玩家的名称相同并将玩家骨骼替换为盔甲的骨骼?但我觉得如果我想这样做,那么我需要将播放器分成几部分,以便它知道要更换播放器的哪些部分。或者有什么方法可以让玩家保持在一起,让盔甲跟随玩家的骨头,我想这是最简单的事情
我很确定我发布的 link 正是我想要的。我想我只是没有完全理解它,希望有人能帮助我更好地理解它
好的,这个 post 不会解释代码如何工作,而是如何让代码 TOOOOO 工作。 Masterprompt 很好地解释了代码 here。如果您想了解代码的工作原理,请遵循 link.
无论如何,关于如何将 2 个对象合并在一起,使一个对象脱离基础对象的动画。
示例用途可以是
- 从肢体创建人肢体。
- 为基础玩家添加护甲
在没有图形艺术家为我创建我的资产的情况下,我如何获得它的基本原理是使用 fuse 和 mixamo。我强烈推荐这些程序。没有这些程序,您仍然可以轻松地完成这项工作,但我将像您正在使用它一样解释如何做。
好的,下载 Adobe fuse 并创建您的基础播放器。 (最好裸体)
现在将该播放器保存为您想要的任何内容(我使用 Main_Player_Naked)
将此播放器上传到 mixamo 进行自动装配,从 mixamo 下载模型后将其导入 unity。 (此时我假设你知道如何将模型统一设置为类人动物)
现在您的玩家已创建并导入到 unity 中,请继续为他制作动画或对他做任何您想做的事。无论你对他做什么,新的 armor/hair/beard 都可以正常工作,无论你添加到你的播放器。
好的,现在是时候创建我们要添加的盔甲了。继续并在 fuse 中重新打开您的裸体玩家,并使用您希望他拥有的新资产重新创建他(不要更改任何体型大小,只需添加新对象)。 (别担心我们不会切换整个模型,这只是为了让我们不必自己装配新资产)现在你的新资产看起来不错,继续执行第一步创造裸体演奏。因此,保存您新创建的角色并导入到 mixamo 以进行自动装配。现在下载新播放器并将其导入到 unity 中。删除玩家的所有对象,除了新资产(它位于对象下方的裸体玩家的单独网格上)
现在我们将使用 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 的资产。
运行 您的游戏并推动 'H' 创建资产并 'J' 删除它。
几天来我一直在思考这个问题,尝试了一些不同的方法,并在谷歌上搜索了很多。我专门看了很多这个帖子
http://forum.unity3d.com/threads/stitch-multiple-body-parts-into-one-character.16485/
但我很困惑,不确定这是否是我想要的 100%。
我只是想用自己的网格向已有的游戏对象添加一个新网格。它运行相同的骨骼结构或动画师,被添加的对象具有其粘贴位置所需的骨骼。
https://gyazo.com/19778b3c73ef9a749c8cc338f7e49d79
这就是我要添加到我的播放器上的对象。我试着直接从它身上取下网格,然后 link 将它变成与正在动画的玩家相同的骨骼结构
当使用 fuse/mixamo 创建和导入对象时,它会将对象添加为父播放器上的单独网格对象
https://gyazo.com/55ce7442dc186756da4ff149ac3543e5
所以如果我要禁用装甲网格 id 就留下这个
https://gyazo.com/09ffd7c7721f46e6980f895a1a873749
但我尝试导入没有盔甲的角色。然后我在搅拌机中打开带有玩家和盔甲的角色并删除玩家并留下骨骼结构和盔甲然后将其另存为单独的 fbx 并将其导入统一并将新的盔甲 fbx 粘贴到原始玩家上尝试为它设置动画,就像它最初来自 mixmo 对象一样。但它没有,甚至不能让它导入 Tpose。当我自己配置它时,它不会保存配置,只会继续回到原来的位置。
我想我应该....只有盔甲上需要的骨头。然后做一些类型的游戏逻辑来找出盔甲对象上哪些骨骼与添加到玩家的名称相同并将玩家骨骼替换为盔甲的骨骼?但我觉得如果我想这样做,那么我需要将播放器分成几部分,以便它知道要更换播放器的哪些部分。或者有什么方法可以让玩家保持在一起,让盔甲跟随玩家的骨头,我想这是最简单的事情
我很确定我发布的 link 正是我想要的。我想我只是没有完全理解它,希望有人能帮助我更好地理解它
好的,这个 post 不会解释代码如何工作,而是如何让代码 TOOOOO 工作。 Masterprompt 很好地解释了代码 here。如果您想了解代码的工作原理,请遵循 link.
无论如何,关于如何将 2 个对象合并在一起,使一个对象脱离基础对象的动画。
示例用途可以是
- 从肢体创建人肢体。
- 为基础玩家添加护甲
在没有图形艺术家为我创建我的资产的情况下,我如何获得它的基本原理是使用 fuse 和 mixamo。我强烈推荐这些程序。没有这些程序,您仍然可以轻松地完成这项工作,但我将像您正在使用它一样解释如何做。
好的,下载 Adobe fuse 并创建您的基础播放器。 (最好裸体) 现在将该播放器保存为您想要的任何内容(我使用 Main_Player_Naked) 将此播放器上传到 mixamo 进行自动装配,从 mixamo 下载模型后将其导入 unity。 (此时我假设你知道如何将模型统一设置为类人动物)
现在您的玩家已创建并导入到 unity 中,请继续为他制作动画或对他做任何您想做的事。无论你对他做什么,新的 armor/hair/beard 都可以正常工作,无论你添加到你的播放器。
好的,现在是时候创建我们要添加的盔甲了。继续并在 fuse 中重新打开您的裸体玩家,并使用您希望他拥有的新资产重新创建他(不要更改任何体型大小,只需添加新对象)。 (别担心我们不会切换整个模型,这只是为了让我们不必自己装配新资产)现在你的新资产看起来不错,继续执行第一步创造裸体演奏。因此,保存您新创建的角色并导入到 mixamo 以进行自动装配。现在下载新播放器并将其导入到 unity 中。删除玩家的所有对象,除了新资产(它位于对象下方的裸体玩家的单独网格上)
现在我们将使用 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 的资产。
运行 您的游戏并推动 'H' 创建资产并 'J' 删除它。