AddSkinnedMeshParts 스크립트를 사용해서 기본 뼈대에 캐릭터 파츠를 불러오고 간단하게 애니메이션을 확인할 수 있도록 작성해보았다. (파츠 교체 시스템 기본 구성)

 

실행시 결과

 

게임오브젝트 구성 내용 (남자 캐릭터)

남자 캐릭터 파츠 구성
남자 캐릭터 애니메이션 (레거시)

 

게임오브젝트 구성 내용 (여자 캐릭터)

여자 캐릭터 파츠 구성
여자 캐릭터 애니메이션 (레거시)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
 
public class AddSkinnedMeshParts : MonoBehaviour
{
    [SerializeField] GameObject[] parts;
 
    void Start()
    {
        foreach (var part in parts)
        {
           AddSkinnedMeshRenderer(part);
        }
    }
 
    public void AddSkinnedMeshRenderer(GameObject newSkinnedMesh)
    {
        // add skinned mesh
       var newSkinnedMeshRenderer = newSkinnedMesh.GetComponentInChildren<SkinnedMeshRenderer>();
       SkinnedMeshRenderer skinnedMeshRenderer = Instantiate(newSkinnedMeshRenderer, transform);
 
        Transform[] childrens = transform.GetComponentsInChildren<Transform>(true);
 
        // sort bones.
        Transform[] bones = new Transform[newSkinnedMeshRenderer.bones.Length];
        for (int boneOrder = 0; boneOrder < newSkinnedMeshRenderer.bones.Length; boneOrder++)
        {
            bones[boneOrder] = System.Array.Find<Transform>(childrens, c => c.name == newSkinnedMeshRenderer.bones[boneOrder].name);
        }
       skinnedMeshRenderer.bones = bones;
    }
}
 
cs

 

AddSkinnedMeshParts.cs
0.00MB

 

 

LOWPOLY - Universal Character 유니티 에셋으로 테스트 구성한 프로젝트 패키지

PKG_Make_Parts_Prefab_and_Using_Parts_with_AddSkinnedMeshParts.unitypackage
2.43MB

해당 내용은 버전 0.1.2 부터 0.1.7 까지 연재 형태로 수정 업데이트 될 예정입니다.

(1편 시작)

2024년 5월 중순 가랑 모델링 팀장님께서 혹시 이런걸 좀 쉽게 할 수 있는 방법이 없겠냐고 물어본다.

 

npc_245, 여, (npc이름), H_F_10031, J_F_30007_1, P_F_10072, -, S_F_10009, F_F_0192, A_F_10008, B_F_10007, -, -, K_F_10044, -

 

 

이런 정보를 가지고 폴더별로 흩어져 있는 모델링 파츠 리소스를 npc_245 폴더 하위에 모아주는 파이썬 스크립트를 ChatGPT(이하 지피티)를 사용해서 작성하셨고 꽤 문제 없이 동작한다고 하셨다.

그런데 해당 파츠들을 하나의 맥스 Scene에 모아서 렌더링을 하려고 하는데 일일이 Skin 모디파이어를 적용해 주거나 수정하기에는 일정이 너무 빠듯하고 요청된 npc의 개수가 너무 많다. (이후 추가 요청은 더 많아짐)

 

이걸 좀 편하게 해줄 수 있는 맥스 스크립트 하나 작성 가능 할까요?

 

얘기를 듣고 몇 분 정도 고민해 보다가 일단 한번 해보기로 한다. 일단 맥스에서 편하게 파츠를 불러와서 바이패드에 붙이는 방법을 먼저 확인해 봐야 하겠다.

 

1. 기준 바이패드가 있는 맥스 Scene에서 머지를 통해서 파츠를 불러와 보면 Skin 모디파이어는 있지만 적용된 바이패드 본 정보는 없다.

2. 머지시 파츠의 바이패드 본을 포함시켜서 머지하면 Skin 모디파이어의 정보가 있고 불필요한 바이패드가 같이 불러와 진다.

3. 파츠에 Bone이 적용되어 있다면 바이패드를 제외하고 매쉬 오브젝트와 Skin에 적용된 Bone 노드를 가져오는 경우 Bone 정보는 살아있는 상태이다.

4. 원본 파츠의 Skin 모디파이어에는 Bip001을 제외한 모든 바이패드가 적용된다.

 

뭔가 될 것 같은 느낌이 든다. (아... 안되나?)

1. Skin 모디파이어에 Advanced Parameter에 Skin 정보를 .env로 저장하고 불러오는 기능을 이용해 볼수 있겠다.

2. 머지시 바이패드를 제외한 Bone 노드는 포함시킨다.

(적용해 보자)

3. 대상 오브젝트 매쉬의 Skin 정보를 .env로 저장하고 기준 바이패드 Scene에서 머지한다. (Skin 적용 Bone 노드 포함)

4. Skin 모디파이어에 바이패드를 추가해준 뒤 .env를 불러온다. Match by Name으로 맞춰주고 확인 버튼을 누른다.

 

잘 적용된다. 머지하고 .env를 적용해주는 프로세스로 진행할 수 있게 되었다.

 

스크립트로 작성해본다.

1. Save Parts Skin Weight 버튼으로 대상 오브젝트의 .env를 저장

2. Merge Parts 버튼으로 기준 바이패드 Scene에서 .env를 저장한 맥스파일을 선택하면 적용해 준다.

 

구상한대로 잘 동작한다. 두번 뭔가를 해줘여 하니 좀 번거롭다. 두가지 동작을 하나로 합쳐본다.

3. Make Env & Merge Parts 버튼을 누르면 파츠 오브젝트의 맥스 파일을 선택해주면 불러와서 붙여준다.

 

추가로 번거로운게 있다고 한다. 메터리얼에 적용된 Self-Illumination Color 값 100으로 적용된 오브젝트가 있는데 V-Ray 렌더링시 매번 0으로 변경해줘야 한다고 한다. 해당 제어를 하는 스크립트 구문을 찾은 후 버튼을 하나 더 추가 해 본다.

(오브젝트 프로퍼티에 Vertex Channel Display 체크 해제도 같이 추가함)

4. Parts Mat Self-Illumination Color to 0 버튼을 누르면 원하는 기능으로 동작한다.

 

Merge_Parts_with_Skin_v0.1.2.ms
Merge_Parts_with_Skin_v0.1.2.ms
0.02MB

 

모델링 팀장님이 테스트 해보시더니 클릭 몇번으로 오브젝트 머지의 고단함이 줄어 들었다고 아주 기뻐하신다.

아직 뭔가 더 할 수 있을 것 같다. (2편에 계속...)

 

(2편 시작)

이후 머지 해온 오브젝트를 삭제하는 기능을 추가하고 잘 안되는 부분을 수정한다. (버전 0.1.3 / 0.1.4)

 

Merge_Parts_with_Skin_v0.1.4.ms
Merge_Parts_with_Skin_v0.1.4.ms
0.02MB

 

 

(모델링 팀장님) 팀장님~

- 네

(모델링 팀장님) 인간이란게 원래 앉으면 눕고 싶고 그런거 아니겠습니까 ㅎㅎㅎ;;

- ㅎㅎㅎ

 

 

새로운 기능 추가 요청이 들어왔다. 해당 기능 추가는 어렵지 않았는데 의외의 복병이 있었다.

모델링 담당자 마다 .psd 파일 이름을 저장하는 폴더 위치와 이름을 저장하는 방식이 약간씩 다른 부분 때문에 네이밍 룰을 찾는 패턴을 만들기가 꽤 까다로웠다.

 

1. 대부분 오브젝트와 같은 이름으로 저장되어 있다. (파츠 오브젝트 네이밍 룰 적용)

2. 저장된 위치가 약간씩 다르다. (같은 폴더에 있다 / 하위 psd 폴더에 있다 / 하위 포토샵 폴더에 있다)

3. 이름의 Prefix에 성별 구분을 제외하였다. (동일한 텍스처를 사용한 경우)

4. 가끔 오타도 있다. (성별 Prefix에 _P 라고 되어 있음)

 

등등 조건문 + 패턴 매칭으로 내용을 정리하여 구현을 완료하고 모델링 팀장님께 전달해드렸다. 이것 저것 테스트 해봤고 전반적으로 잘 되는데 안되는 건 수동으로 처리하신단다. 모든 걸 완벽하게 할 수 없어서 약간 아쉬움이 남았다.

 

Merge_Parts_with_Skin_v0.1.5.ms
Merge_Parts_with_Skin_v0.1.5.ms
0.03MB

 

파일을 찾는 조건의 범위를 기존 상대경로에서 절대경로로 변경하고 다양한 패턴에 대응하기 위해서 내용을 수정했다. 기능 자체는 동일하고 파츠 선택 상태면 해당 파츠만 아무것도 선택하지 않은 상태이면 전체 오브젝트에 대해 기능을 적용해주는 형태로 변경하게 된다.

Merge_Parts_with_Skin_v0.1.6.ms
0.03MB

 

(3편에 계속...)

전역 지정 (필터 입력 내용 없음) - 프리셋 파일 지정

폴더별로 지정시 glob:"폴더/파일명.확장자" 형태로 지정 가능 (확장자 대소문자 구분함)

 

+ Recent posts