VRChat/VRChat 아바타 강좌

10. Unity의 맥가이버! 컴포넌트

FakeZero 2024. 3. 7. 22:26

10.Unity의 맥가이버! 컴포넌트


  컴포넌트에 대해서는 몇 번 언급한 적이 있을 것이다. 애초에 아바타를 업로드 할 때에도 Animator와 VRC Avatar Descriptor라는 컴포넌트를 사용하니 말이다. 그러나 Unity의 컴포넌트는 그것뿐이 아니며 유용한 기믹을 잔뜩 가지고 있으니 천천히 살펴보도록 하자!

 

  아무리 그래도 컴포넌트를 전부 소개하기에는 무리가 있으므로 몇가지 자주 사용하는 컴포넌트만을 소개한다.


-Transform

  가장 많이 사용하는 컴포넌트인 Transform은 오브젝트의 좌표, 회전, 스케일을 관리한다. Transform은 많이 사용하는 컴포넌트이니 별다른 설명이 필요 없을 것이라 믿는다.


-Mesh Renderer

  메시(Mesh) 데이터를 형체로 구현시키는 컴포넌트라고 할 수 있다. 메트리얼 데이터도 적용할 수 있고 쉐이프 키가 적용되어 있는 모델의 경우 BlendShapes를 통해 쉐이프 키 기능을 조정할 수 있다. 본(Bone) 데이터가 적용되어 있는 경우 중심이 되는 본을 집어 넣는 것으로(Skinned Mesh Renderer의 Root Bone) 본을 적용할 수 있다.

 

  아바타를 만드는데 Mesh Renderer 계열 컴포넌트에서 볼 부분은 많지 않으므로 아래의 항목만 주의 하도록 하자.

  • Mesh : 메시 데이터를 적용한다.
  • Materials : 메시 데이터에 메트리얼 데이터를 적용한다. 복수의 메트리얼을 사용하는 경우 순서에 주의해야 한다.
  • Root Bone : 가장 중심이 되는 본의 데이터를 넣으면 메시 데이터에 적용된 본 데이터를 기반으로 본을 적용한다. 
  • Anchor Override : 모델이 항상 같은 곳에서 빛을 받을 수 있도록 해주는 기능이다. 임의의 오브젝트의 위치를 입력하면 빛이 그 위치에서만 발하는 것으로 간주하고 계산된다. 따라서 아바타의 색상이 월드마다 미묘하게 다르다라고 하면 Anchor Override 설정에 제대로 데이터가 들어가 있는지 확인하는 것이 좋다.

-Animator

  적용한 오브젝트가 애니메이션을 실행할 수 있도록 하는 컴포넌트이다.

 

  • Controller : 컨트롤러 파일을 적용한다.
  • Avatar : 오브젝트의 Humanoid 설정과 관련된 설정이다. 애니메이션에서 Humanoid 설정을 활용하고 싶다면 적용해야하는 설정이다.

  FBX 파일에 Humanoid 설정을 적용하면 위와 같은 아이콘이 생기므로 저 아이콘을 Avatar에 적용하면 된다.


-Collider(콜라이더)

  오브젝트에 충돌판정을 부여하는 컴포넌트이다. 여러가지 형태를 지원하고

  오브젝트가 복잡한 형태의 콜라이더를 필요로 할 경우 Mesh Collider 컴포넌트를 사용하면 적용한 메시 데이터 대로의 콜라이더가 생성된다.

 

  Collider 컴포넌트에서는 2가지 설정만 다룰 수 있으면 대부분의 것은 할 수 있다.

  • Edit Collider : 콜라이더의 형태를 Scene 탭에서 수정할 수 있도록 한다.
  • Is Trigger : 활성화할 경우 콜라이더끼리 부딫혀도 튕겨나가지 않고 통과한다.

  다만 이 콜라이더라는 기능은 'VRChat 아바타'에서 사용하기에는 조금 미묘한 점이 있다. 이는 밑에서 설명한다.


-Rigidbody

  적용된 오브젝트에 물리엔진을 적용한다.

  • Mass : 질량
  • Drag, Angular Drag : 각각 이동과 회전에 공기저항이 얼마나 영향을 미치는지 설정할 수 있다.
  • Use Gravity : 중력의 영향을 받을지를 설정할 수 있다.
  • Is Kinematic : 활성화 하면 오브젝트가 더 이상 물리엔진으로 움직이지 않고 애니메이션으로 움직이게 된다
  • Constraints : 물리엔진으로 움직이는 축을 제한한다. 예를 들어 Freeze Position의 X, Y를 활성화하면 해당 오브젝트는 물리엔진을 통해서는 Z 축으로만 움직이는 것이다.

 

  Rigidbody와 가장 큰 시너지를 낼 수 있는 컴포넌트가 있는데 바로 위에서 설명한 Collider 컴포넌트이다.

  영상에서 보는 것처럼 Rigidbody와 콜라이더를 이용해서 오브젝트간에 충돌이 일어나는 것을 확인할 수 있고 Collider 컴포넌트의 Is Trigger 설정을 활성화하면 충돌하지 않고 통과하는 모습도 볼 수 있다.

 

  언뜻보면 활용할 곳이 많아 보이지만 VRChat내에서는 얘기가 조금 다르다.

  일단 다음과 같이 콜라이더가 적용된 바닥과 Rigidbody와 콜라이더가 적용된 공이 적용된 아바타를 만들어 보겠다. 원래라면 외부힘이 작용하는 것이 없으므로 중력에 의해 공이 바닥에 닿아서 멈춰야 한다.

 

  보았는가. 뭔가 알 수 없는 힘에 의해 Sphere 오브젝트가 자기멋대로 튀어나가고 만다...도대체 어디서 어떤 힘에 의해서 저렇게 되는지 알 수 없으며 월드와 상호작용 하고 있는지도 의문이 드는 부분이 많다.

 

  물리엔진을 이용한 기믹을 만들기엔 불확정한 요소가 너무 많기 때문에, 즉, 제어가 불가능하기에 사용하는 것은 솔직히 추천하지 않는다.

 

  단, 그렇다고 해서 Rigidbody와 콜라이더라는 컴포넌트가 전혀 쓸모없는 것은 아니다! 콜라이더의 경우 몇몇 월드에서 기믹을 쓰기 위해 아바타의 콜라이더를 요구하는 경우도 있고 Rigidbody도 지금부터 설명할 컴포넌트와 연동할 수 있으므로 일단 기억에서 지우는 것은 하지 않았으면 한다.


-Fixed Joint

  혹시 Connected Body 옆에 None (Rigidbody)가 보이는가? 이렇게 괄호 안에 무언가가 적혀 있으면 해당 칸에 적용한 오브젝트에서 해당 정보만 추출해서 쓴다는 뜻이다. 반대로 말하면 원하는 컴포넌트가 적용되어 있지 않으면 적용할 수 없다는 뜻이다. 여기서 Connected Body는 Rigidbody 정보를 원하고 있다는 뜻이다.

 

  Fixed Joint 컴포넌트는 적용한 오브젝트의 움직임을 다른 오브젝트의 움직임에 의존하게 하는 컴포넌트이다.

 

  일단 다른 설정은 배제하고 우리는 Connected Body에 오브젝트를 적용하면 해당 오브젝트와 컴포넌트가 적용된 오브젝트가 같이 움직인다고 생각하면 된다.

  일단 위와 같이 세팅해서 VRChat에서 확인해보자. 오른손 본과 오브젝트에 Rigidbody의 제한을 적용하는데 손은 물리엔진 영향을 받으면 안되므로 모든 축에 제한을 넣고 Sphere 오브젝트는 움직이기만 하면 되므로 회전축만 제한했다. 설계대로라면 오른손을 따라 오브젝트가 움직여야 한다.

  보이는 대로 Sphere 오브젝트가 오른손을 따라 움직이는 것을 알 수 있다.


-Constraint

  이름 그대로 이름에 해당하는 요소를 제한하는 역할을 한다.

  • Activate / Zero : 해당 오브젝트에 제한을 적용하고 풀 수 있는 버튼이다.
  • Is Active : 제한을 적용한다.
  • Weight : 가중치
  • Constraint Settings>Lock : 현재 상태를 고정해서 현재 상태에서 제한을 받도록 한다
  • Sources : 어떤 오브젝트의 영향을 받게 할지 설정한다.

  이 컴포넌트를 사용하면 Fixed Joint처럼 사용하면서 Rigidbody를 사용하지 않을 수 있다.

  위와 같이 쓰지 물리엔진을 쓰지 않고도 Fixed Joint와 같은 효과를 낼 수 있으므로 잘 활용해 보기를 바란다.

  (참고로 영상에서 쓰인 Parent Constraint는 컴포넌트가 적용된 오브젝트가 Source에 적용된 오브젝트의 자식 오브젝트처럼 움직이게 하는 컴포넌트이다.)


-Light

  빛을 발하게 해주는 컴포넌트이다.

  우클릭으로 생성할 수 있는 조명 오브젝트에는 모두 Light 컴포넌트가 사용되고 있다.

Directional Light 현실의 햇빛과 가장 유사한 조명으로 특정 방향으로 모든 오브젝트에 빛을 비춘다.
Point Light 구형의 조명으로 중심에서 빛이 나와서 가장자리까지 빛을 비춘다.
Spotlight 특정 부분에만 빛을 비추는 이름 그대로 스포트라이트와 비슷한 역할을 하는 조명이다.

  조명의 경우 컴퓨터가 처리하기 가장 까다로워하는 기능중 하나이기 때문에 신중하게 사용하기를 바란다.

 

  각 조명마다 연산 방식이 다르기 때문에 설정에도 조금씩 차이가 있다. 설정 자체는 그리 어렵지 않으니 직접 다뤄보고 사용하면 된다.  


-Particle(파티클) System

  이펙트에 사용하는 파티클을 사용할 수 있게 해주는 컴포넌트이다.

  우클릭으로 파티클 오브젝트를 간단하게 만들 수 있으므로 한 번 사용해 보기를 바란다.

 

  파티클은 대부분의 이펙트에 사용되는 만큼 다룰 수 있는 설정이 매우 많다! 때문에 본 글에서 정리하는 것은 좋은 생각이 아니므로 파티클에 관련된 설정은 후에 다른 글에서 가능한 다루겠다.

 

  파티클도 컴퓨터 사양을 많이 잡아먹는 기능중 하나이므로 VRChat 내에서 사용할 때에는 주의가 필요한 기능이다.


-Camera

  Camera는 긴 설명이 필요없이 말 그대로 카메라이다.

  카메라 역시 오브젝트를 바로 만들 수 있으므로 만들어 보면 알 수 있다.

 

  다만 카메라 컴포넌트는 VRChat 아바타에서는 그다지 쓸 일이 없다. 하지만 여러모로 쓸 일이 없는 것은 아니므로 카메라를 활용하는 방법은 후에 따로 설명하도록 하겠다.


-Audio Source

    Project탭에 불러온 오디오 파일을 재생할 수 있게 해주는 컴포넌트이다.

https://docs.unity3d.com/kr/2021.3/Manual/class-AudioSource.html

 

오디오 소스 - Unity 매뉴얼

오디오 소스(Audio Source) 는 씬에서 오디오 클립을 재생합니다. 이 클립은 오디오 리스너 또는 오디오 믹서를 통해 재생 가능합니다. 오디오 소스는 모든 종류의 오디오 클립을 재생할 수 있으며,

docs.unity3d.com

  오디오와 관련된 설정은 시각적으로 보이는 것도 아니고 사람마다 느끼는 바가 다르기 때문에 위의 링크에서 자세한 사항들을 확인하고 직접 조정해보길 바란다.


  이렇게 해서 VRChat에서 '자주' 사용되는 컴포넌트를 정리해보았다. 컴포넌트 중에는 VRChat에서 사용을 거부하는 컴포넌트도 있으므로 주의하기를 바란다.

 

  컴포넌트는 대부분 애니메이션에 프로퍼티로서 적용이 가능하므로 꼭 숙지하고 있도록 하자. 또한 컴포넌트에 대해서 더 알고 싶다면 Audio Source처럼 Unity 공식 메뉴얼에 자세한 세부사항이 적혀 있으니 참고하기를 바란다.