시작하기에 앞서...
이 강좌는 "나는 아바타 뚜따를 많이 해봤고 블렌더로 본을 추가하고 웨이트까지 칠 할 줄 안다" 는 분들을 위한 강좌입니다.
최대한 알기 쉽게 쓰려고 하지만 강좌 진행에 다소 불친절한 부분이 있을 수 있으니 양해 부탁드립니다!
최근 피직스본 업데이트를 하고나서 아바타 뺨에 본을 심거나 혀에 본을 심는 작업을 하는 분들이 많아졌는데

보통 본을 추가하는 작업 후에 다시 옷입히고 어쩌고 하면 너무 시간이 오래 걸리니 유니티에 FBX 덮어쓰기를 하실거에요
근데 그러면 문제점이 하나 생깁니다.

(있었는데요? 없었습니다..)
Skinned Mesh Renderer, Mesh에 수정한 메쉬를 집어 넣어도 아무것도 렌더링 되지 않습니다.
본을 추가하는 작업 후에 FBX덮어쓰기를 하면 이런 문제가 생기는데요
이거 해결하는 방법을 알려드리려 합니다.
본 강좌에서 나오는 방법을 응용하면 간편하게 버튼 하나로 아바타 옷을 입힐 수도 있고
옷 본과 바디 본을 합칠 수도 있습니다.
그럼 강좌 시작합니다..
우선 오브젝트에 할당된 메쉬의 웨이트를 이름만 같은 다른 오브젝트로 재할당 하는 코드를 하나 작성합니다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteInEditMode]
public class ReassignBoneWeigthsToNewMesh : MonoBehaviour
{
public Transform newArmature;
public string rootBoneName = "Hips";
public bool PressToReassign;
void Update()
{
if (PressToReassign)
Reassign();
PressToReassign = false;
}
// [ContextMenu("Reassign Bones")]
public void Reassign()
{
if (newArmature == null)
{
Debug.Log("No new armature assigned");
return;
}
if (newArmature.Find(rootBoneName) == null)
{
Debug.Log("Root bone not found");
return;
}
Debug.Log("Reassingning bones");
SkinnedMeshRenderer rend = gameObject.GetComponent<SkinnedMeshRenderer>();
Transform[] bones = rend.bones;
rend.rootBone = newArmature.Find(rootBoneName);
Transform[] children = newArmature.GetComponentsInChildren<Transform>();
for (int i = 0; i < bones.Length; i++)
for (int a = 0; a < children.Length; a++)
if (bones[i].name == children[a].name)
{
bones[i] = children[a];
break;
}
rend.bones = bones;
}
}
위 코드를 복사하고 Visual Studio를 켜서 붙여넣기 그리고 ReassignBoneWeigthsToNewMesh 라는 스크립트를 하나 만들어줍니다.
(비주얼 스튜디오는 무료 개발자 소프트웨어 입니다. 마이크로 소프트에서 다운로드 받으시면 됩니다.)

작성한 스크립트는 작업중인 유니티에 넣어주도록 합니다.
혀 본 추가 작업을 했다고 가정하고 진행하겠습니다. 수정본의 FBX를 하이어라키로 끌어옵니다.

수정본 FBX에서 우리가 블렌더로 추가한 혀(Tang) 본을 기존 아바타 Head 본에 끌어넣습니다.

그 후 새롭게 끌어왔던 FBX의 모든 메쉬를 shift + 클릭으로 다중 선택하고 우리가 이전에 만든 ReassignBoneWeigthsToNewMesh 컴포넌트를 추가해줍니다.


이런 컴포넌트가 추가 되었을 텐데 New Amature에 기존 모든 메쉬가 증발한 아바타의 Amature를 넣고 Press To Reassign을 눌러 주시면 됩니다.
그럼 아무반응이 없을텐데 아무 반응이 없는게 정상 적용된겁니다. 에러가 뜨면 체크박스에 체크가 됩니다.
보통 에러가 나는 경우는 웨이트를 옮길 본의 이름이 맞지 않다던가 경로가 이상한 경우입니다.
에러가 나는 경우 망가지는건 없으니 크게 걱정하지말고 본의 이름과 경로를 다시한번 확인해보시길 바랍니다.
에러의 경우 본의 포지션 값과는 관계가 없습니다.

잘 적용 되었다면
기존의 메쉬들은 삭제해주고 새로 끌어왔던 FBX의 메쉬들을 전부 끌어다 증발했던 아바타 안으로 옮겨주고
ReassignBoneWeigthsToNewMesh도 삭제해주고 하이어라키를 정리해줍니다.
새로운 메쉬들이 웨이트가 옮겨져 잘 따라오는 모습을 볼 수 있습니다.
앞서 소개한 응용해서 옷을 입히는건 더 쉽습니다.
그냥 입힐 옷에 ReassignBoneWeigthsToNewMesh 컴포넌트 넣고 본 합치면 됩니다.
쉐이프키 녹화나 애니메이션도 망가지지 않습니다.
이상으로 강좌 마칩니다.
정말 사용하기 나름 작업시간을 엄청 단축 시킬수 있는 꿀팁이라
많은 분들이 알았으면 좋겠네요.