애니메이션 추가

This commit is contained in:
2026-09-01 20:19:59 +09:00
parent 01c852fef9
commit 7ec587353a
1542 changed files with 585048 additions and 21 deletions

View File

@@ -179,9 +179,9 @@ void Setup(Vrm10Instance vrm)
currentRoot = vrm.gameObject;
currentRoot.transform.SetParent(transform, false);
currentRoot.transform.localPosition = spawnPosition;
currentRoot.transform.localRotation = faceCamera
? Quaternion.Euler(0f, 180f, 0f) // VRM 은 +Z 를 향하므로 돌려세운다
: Quaternion.identity;
// 컨트롤 리그를 만드는 동안에는 회전을 걸어두지 않는다. 아래 설명 참고.
currentRoot.transform.localRotation = Quaternion.identity;
// 중요: Vrm10Instance.Runtime 은 지연 생성 프로퍼티다. 여기서 한 번 접근해
// 컨트롤 리그를 미리 만들어 둔다. 컨트롤 리그가 생성될 때 Animator.avatar 가
@@ -190,6 +190,24 @@ void Setup(Vrm10Instance vrm)
// 가한 회전이 전부 지워진다. 반드시 컴포넌트 부착보다 먼저 접근해야 한다.
_ = vrm.Runtime;
// 돌려세우는 것은 반드시 컨트롤 리그가 만들어진 "뒤"라야 한다.
//
// Vrm10RuntimeControlRig 는 리그 루트를 이렇게 만든다:
// _controlRigRoot = new GameObject(...).transform;
// _controlRigRoot.SetParent(vrmRoot); // 인자 하나 = worldPositionStays:true
//
// 새 오브젝트는 월드 회전 identity 로 생기고, SetParent 의 기본값이 월드 트랜스폼
// 유지라서 부모에 붙어도 월드 identity 를 지킨다. 즉 리그 루트의 로컬 회전이
// inverse(vrmRoot.rotation) 이 되어, 미리 걸어둔 회전을 정확히 상쇄해 버린다.
// 그러면 애니메이션 클립이 만든 포즈가 루트 회전을 무시하고 늘 월드 +Z 를 향한다
// (= 카메라에 등을 보인다. faceCamera 를 꺼도 달라지지 않는다).
//
// 리그가 다 만들어진 뒤에 돌리면 리그 전체가 자식으로서 같이 돌아가므로 문제없다.
// ProceduralIdle 만 쓸 때는 기존 포즈에 작은 델타만 얹어서 이 함정이 안 보였다.
currentRoot.transform.localRotation = faceCamera
? Quaternion.Euler(0f, 180f, 0f) // VRM 은 +Z 를 향하므로 돌려세운다
: Quaternion.identity;
var avatar = currentRoot.AddComponent<VrmAvatar>();
avatar.Bind(vrm);
Current = avatar;