[애니메이션] Unity 타임라인 작업시 사용 가능한 Editer Scripts

 

Unity에서 애니메이션 타임라인 작업시 몇 가지 편의 기능을 추가하여 사용할 수 있다.

 

[작업 준비하기]

  1. 작업 타임라인 복제하기
    • Duplicate (Rename) - (추천) 선택한 타임라인 프리팹 게임오브젝트를 원하는 이름 (폴더 지정가능) 으로 복제하도록 기능 지원, 타임라인 프리팹인 경우 Playable Director 항목을 포함하여 복제한다.
    • Duplicate Selected Prefab with Timeline (단축키 Alt + N) - 씬 하이어라키에서 복제를 원하는 프리팹 게임오브젝트를 선택하고 메뉴 또는 단축키를 사용하여 실행하면 해당 프리팹 이름 + _NEW 상태로 복제하여 준다. ( Playable Director 항목을 포함) 작업 진행시 원하는 이름으로 rename 후 작업 진행 가능
  2. Timeline Preview Values Transfer - Timeline 작업 후 Preview 적용과 그렇지 않을 때 카메라 또는 캐릭터 포즈 및 위치가 달라지게 된다. 이를 Sync 해주기 위해 기능 제공
    • Sync 작업할 프리팹 또는 TimeLine을 선택 후 Initialize 하여 현재 Preview의 0frame 상태를 저장
    • Transfer Values를 누르면 해당 상태를 현재 프리팹 하위에 적용해 줌
    • 프리팹의 Overrides를 Apply All 하여 상태를 유지하도록 저장
  3. CutScene Ball Simulator - Timeline 컷씬에 사용할 Ball 애니메이션을 시뮬레이션으로 타구 각도, 높이, 힘을 시뮬레이션 하여 결과를 보여주고 해당 시뮬레이션을 애니메이션 파일로 저장해주는 기능 제공

[My Macro Button / Utils 기능 사용]

  1. Activate Selected GameObject
    • 선택한 타임라인 프리팹 활성 상태로 전환
    • 두번째 클릭부터 타임라인 활성시간 0으로 변경하며 Timeline 창을 Lock 설정(토글) 해준다.
  2. Timeline Lock Toggle (단축키 Alt + T) - 타임라인 작업시 Hierarchy 노드중 TimeLine 이외의 항목을 선택하더라도 Timeline 창을 유지 시켜 주도록 Lock 을 단축키로 토글
  3. Timeline Binding Restore
    • 복제된 Timeline 프리팹은 요소의 Bindings가 Missing되어 있음. 이를 현 프리팹의 Timeline 기준으로 복구 해주는 기능 (My Macro Button에 기능 통합되어 개별 사용하지 않음)
  4. Character Parts Hand Change - (선수 프리팹 선택 후) 타임라인 프리팹의 각 투수 및 수비 선수의 글러브 손 위치를 왼쪽 / 오른쪽으로 토글 기능 지원 (타자의 경우 배트 위치 변경 가능)
  5. Animation Clip Duplicate Export (단축키 Alt + D)
    • 애니메이션 FBX 에서 Clip을 지정된 폴더 위치에 Duplicate (덮어쓰기) 하도록 기능 지원
    • Clip 이름이 “Take 001” 인 경우 파일명과 동일하게 변경하도록 기능 지원
  6. Timeline Prefab Duplicate Export
    • 작업 완료된 타임라인 프리팹을 정리하여 최종 폴더에 복제하도록 기능 지원
    • 작업용 프리팹에 포함된 선수 프리팹과 runner 이하 프리팹은 자동 삭제

[기타 지원 기능]

  1. Timeline Clip Info Editor - Timeline Playable 을 등록하고 대상 트랙을 선택후 해당 애니메이션 클립의 Left (or Right) 클립을 토글 전환 할 수 있도록 기능 (My Macro Button - Character Parts Hand Change에 기능 통합하여 개별 사용하지 않음)
  2. Timeline Path Drawer
    • 작업 중인 타임라인 게임오브젝트에서 Path를 출력하고 싶은 오브젝트를 등록하여 애니메이션 이동 경로를 Line Renderer를 사용 하여 가시적으로 보여주는 기능
    • Playable Director - TimeLine 게임오브젝트 등록
    • Target GameObejct - Ball_move 등과 같이 이동 경로를 Path로 출력하고 싶은 게임오브젝트를 등록
  3. Timeline Prefab Comparer
    • 작업 완료된 타임라인 프리팹을 정상적으로 폴더에 복제하였는지 확인하는 기능 지원
    • Cut_Cut 이하 작업 폴더 선택 후 비교하여 1:1 매칭이 되지 않은 프리팹을 출력
  4. Timeline Group Creator - 타임라인 그룹을 편하게 생성 / 관리 할 수 있도록 기능 지원

  5. Timeline Playable Clip Viewer
    • Assets / Resources / Timeline 의 하위 폴더에 있는 Playable 리소스에서 선수 Position 관련하여 내부 생성한 Animation Clip의 정보를 보여 준다.
    • Check Famerate 60FPS - Samples (Framerate) 가 60fps로 되어 있는 항목을 보여 준다.
    • Check Label Validate - Track 레이블이 지정되지 않은 목록을 보여 준다. (Animation Track …)
  6. Timeline Animation Framerate Converter
    • 활성화된 작업 Timeline 프리팹을 기준으로 해당 Playable Director에 내부 생성한 Animation Clip 중 Samples (Framerate) 가 60fps로 되어 있는 목록을 보여준다.
    • 선택한 목록 버튼을 클릭하면 해당 클립이 활성화 된다.
    • 하단 버튼을 클릭하면 Convert 60fps to 30fps로 변경하는 기능 지원
    • (기존 프레임을 60 → 30으로 변경하는 경우 Duration 또한 두배로 길어진다. 이 부분을 기존의 Duration을 유지하면서 변경하는 기능을 자동화하여 구현하였다.)
    • Animation 창의 Samples 항목은 해당 창의 [:] 을 클릭하여 Show Sample Rate를 체크 활성해주면 보여진다.

  7. Timeline Remove Unused Bindings - Timeline을 복제해서 작업하다보면 이전 연결된 Bindings가 연결은 끊어졌지만 정보는 그대로 남아 있음. 쓰레기 값이라고 볼 수 있는데 해당 내용을 삭제하여 최적화 해주는 기능을 제공 (적용 테스트 결과는 파일 용량 최적화 결과가 미미 해서 사용 추천은 하지않음)

 

[애니메이션] 3dsmax 에서 사용 가능한 Max Script

 

3dsMax_Scripts_-_anifilm_tools.zip
0.01MB

 

  1. TimeConfig.ms 를 제외한 나머지 스크립트는 맥스창에 드래그 앤 드롭으로 설치 가능하다.
  2. TimeConfig.ms 는 맥스 설치 경로 C:\Program Files\3ds Max 2021 에 복사하여 준다.

[메뉴 구성 방법]

Customize User Interface 설정에서 Toolbars 탭에서 구성 가능

New 버튼을 눌러 새로운 툴바를 생성하고 Category / anifilm tools 항목에서 등록 원하는 Action을 드래그 하여 추가해 준다.

 

[사용 방법]

  1. TimeConfig 스크립트는 맥스 하단의 타임슬라이더를 좀 더 편하게 사용할 수 있도록 구성
  2. BoneToggle 은 단축키를 지정하여 Bone 과 Biped 를 Hide & Show 토글 사용할 수 있다.
  3. Edit Biped Anim Tools 바이패드 작업시 필요한 몇 가지 기능을 버튼으로 구성
    • Select Biped COM - Bip001 을 선택
    • Select All Biped - 모든 바이패드 오브젝트 선택 (Footsteps, Twist, Nub 제외)
    • Unlink Bip001 from Root_Dummy - Root_Dummy에서 Bip001을 Unlink & Link 토글 사용 (바이패드 Move All Mode 사용시 Unlink 필요)
    • Toggle Move All Move / Mirror In Place 는 Biped 제공 기능을 버튼으로 빠르게 접근 하도록 구성

  1. Create Ball Keys
    • Player_Ball_control 을 원하는 오브젝트에 링크 애니메이션을 편하게 제작하도록 구성

  1. SaveAsMax2020 - 2021 또는 2022 버전으로 저장된 맥스파일을 2020 버전으로 저장
  2. ExportCharAnim / ExportCharParts - 애니메이션 FBX 익스포트 또는 All Parts 익스포트시 오브젝트 자동 선택 후 익스포트 하도록 구성
  3. Biped Anim Loader
    • Open Biped Animation File List 를 통해 폴더에 있는 Biped (.bip) 파일 목록을 불러 올 수 있다.
    • 목록을 불러 올때는 폴더가 아닌 파일 기준으로 해당 폴더에 있는 모든 파일을 불러들인다.
    • BIP File Lists: 목록 중 불러올 항목을 선택하고 [Load Selection Animation .BIP to Biped] 버튼을 통해 편하고 빠르게 불러들일 수 있도록 구성 하였다.

럽플레이스는 모바일 기반 (PC 클라이언트 동시제공) 리듬 액션 게임으로 인게임에서 일정 프레임을 유지하는 것을 목표로 하다보니 그래픽스에서 사용가능한 일부 기능의 제약을 가지고 있는데 가장 아쉬웠던 부분이 그림자 부분이다.

 

개인적으로 아쉬운 마음에 테스트 해본 이미지와 영상

 

 

 

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:"폴더/파일명.확장자" 형태로 지정 가능 (확장자 대소문자 구분함)

 

MyMacroButton (자주 사용하는 기능을 버튼으로 만들기)

 

- 작업용 Scene 폴더에 있는 Scenes를 버튼으로 보여줌 (해당 폴더에 있는 파일 기준으로 적당히 보여줄수 있도록 함)

버튼 누르면 해당 Scene 열어줌

 

- 자주 사용하는 경로를 등록(추가/삭제 가능) 해 놓고 버튼 누르면 하이라이트 선택

 

- 자주 하는 귀찮은 것들을 적당히 버튼으로 만들어서 사용

1. Collapse Selected <<< / >>> Expand Selected

    캐릭터 프리팹 Expand All & Collapse All (단축키 Alt + 클릭과 같음, 단축키 모를때 만듦)

2. Animation Clip Settings for Riding (1, 3, 5)

    라이딩이라는 구조의 캐릭터 애니메이션 클립 설정을 파일명 기준으로 자동 등록해줌 (네이밍 룰에 따라 지정)

    Animation Type: Legacy / animation_riding_숫자 형태로 하나만 등록, 3개 등록하는데 기준에서 5씩 숫자 증가,

    5개 등록 숫자 1씩 증가 형식

3. 애니메이션 지정된 폴더에 복제

4. 파티클 프리뷰용 빈 파티클 컴포넌트 추가

5. 파티클 기본값 설정해둔 컴포넌트 추가

    (Scale Mode, Max Particle, Order in Layer 매번 바꾸기 귀찮아서 구성, 유니티 프리셋으로 같은 기능 사용 가능)

MyMacroButton.cs
0.02MB

ListDecoParentObject 프리팹 정보 (추적 관리)

 

현재 진행중인 프로젝트에는 특정 코스튬에 이펙트를 붙일 수 있도록 해두었는데 이펙트 출력 위치를 코스튬 프리팹에 정보를 입력하여 출력할 수 있도록 구현되어 있다. (DecoParentObject)

코스튬 10000번대 20000번대 30000번대로 구분하여 관리되며 해당 리소스가 많아짐에 따라서 추적 관리가 어려워 진다.

해당 폴더의 파츠 프리팹을 검색하고 DecoParentObject 또는 PartsEffect 정보가 없는 것을 버튼 리스트로 보여주며 해당 버튼을 클릭시 프리팹을 하이라이트 선택해 준다.

 

몇 가지 구분을 통하여 Sort 할 수 있도록 해두었다.

 

 

ListDecoParentObject.cs
0.02MB

List Textures with Mipmaps 선택한 폴더안에 있는 텍스처중 텍스처 설정의 Genarate Mip Maps 가 활성화 되어 있는 파일을 목록으로 보여줌

1. 파일 또는 폴더 선택후 [재검색] 가능

2. 표시된 목록 버튼 클릭시 해당 파일을 하이라이트 선택해줌

 

ListTexturesWithMipmaps.cs
0.01MB

+ Recent posts