이것 저것 개발하고 만들어보기
article thumbnail

 

 

 

 

 

 

 

 

VRC는 Physics Bone 업데이트 이후로 서로의 오브젝트에 간섭이 가능해지면서 많은 상호작용을 할 수 있게 되었습니다. 

 

그와 동시에 SDK는 이 상호작용 데이터를 Unity와 VRC 내부에서 활용하는 것 또한 가능합니다.

 

 

 

 

 

유니티에서 재생 버튼을 누른 후 Inspector 창에서 보여지는 Physics Bone의 설정값 입니다.

 

Physics Bone 의 Inspector 창에 들어가면 맨 아래의 Options 항목의 Parameter는 공백으로 나타납니다.

 

여기에 임의의 이름을 넣고 유니티를 플레이 시키면 자신이 지정한 Paramter의 이름과 이름 뒤에 _IsGrabbed / _Angle /_Stretch 라는 또다른 Parameter 가 생깁니다.

 

이 Parameter들은 다음과 같은 성질을 가집니다.

 

 

 

 

 

 

 

 

 

(지정한 이름)_IsGrabbed 

Physics Bone이 상호작용 상태로 들어가면 1, 아무런 상호작용이 없을때는 0입니다

데이터형은 Bool으로, 1이면 참이고 0이면 거짓입니다.

 

유니티를 재생하고, Game 창에서 해당 Inspector 에 표시된 Root Transform 의 본 위치를 확인해 클릭하면, 이 값이 0과 1로 변하는 것을 알 수 있습니다.

 

 

 

(지정한 이름)_Angle 

Physics Bone이 상호작용 상태로 들어가고, bone의 오브젝트가 회전함에 따라 0~1사이의 숫자를 반환합니다.

데이터형은 float으로, 기존 Local축의 각도가 180도를 기준으로 회전한 값을 0~1로 반환합니다.

 

Physics Bone의 최대 회전 각도는 180도로 제한되어 있는데, 이것을 설정하여 최대 회전값이 180도가 아니더라도 무조건 설정된 최대 각도 기준으로 0~1의 숫자만 반환합니다.

 

 

 

 

(지정한 이름)_Stretch 

Physics Bone이 상호작용 상태로 들어가고, Physics Bone의 Max Stretch 설정값에 따라 0~1사이의 숫자를 반환합니다.

데이터형은 float으로, Max Stretch 설정값이 1 이상이여도 0~1사이의 숫자만 반환합니다.

 

 

 

 

Physics Bone에 있는 Prameter 들을 Aniamtion Controller의 트리거들과 연동시킬 수 있음으로,

특정 조건에서 애니메이션을 출력하는 것이 가능합니다.

 

 

 

 

 

 

유니티 Game 화면에서 해당Physics Bone의 Parameter 값의 이름을 Animation Controller 의 Parameter 에 넣어줄 수 있습니다. 

 

사진처럼 캐릭터가 상호 작용 시 SickFace0(n)_IsGrabbed 의 체크박스가 활성화/비활성화 되는것을 알 수 있습니다.

 

이처럼 Physics Bone 의 Parameter 값을 애니메이션의 Parameter 값으로 이용할 수 있습니다.

 

 

 

 

이를 응용하면, 인게임 내에서의 Physics Bone 상호작용을 캐릭터의 애니메이션 발생 트리거로 이용하여 보다 많은 표현이 가능해집니다.

 

상대방이 자신의 캐릭터의 Physics Bone과 상호작용 트리거를 이용해 애니메이션을 출력하여

 

마치 상대방 행동에 반응하는 것 처럼 만들어 줄 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

예시 ) Physics Bone의 Prameter 를 사용하여 Animation과 연동하기

 

 

 

Rindo 아바타의 귀가 타인에게 잡혔을 때, 아파하는 표정을 출력하는 상호작용을 만들려고 합니다.

 

 

 

 

 

아바타 최상위 오브젝트에 해당 아바타의 FX Animation Controller를 넣어줍니다.

 

아바타마다 다르지만, 보통 VRC Avatar Descriptor 에 Playable Layers 에 FX 란에 Animation Controller가 있습니다.

 

Animator의 Controller는 본래 비워둬야 하지만, VRC에 업로드 하기 전에 유니티 Game 화면에서 테스트를 하기 위해 레이어를 삽입해 줍니다. 테스트용 Aniamtion Controller를 새로 작성해도 좋습니다.

 

 

 

 

 

 

이후 유니티 상단 메뉴바 - Window - Animator창을 열어 아바타의 Controller를 열고 Layers 탭에서 새로운 레이어를 작성해 줍니다. 

 

 

 

새로 작성한 레이어를 더블 클릭해 이름을 바꾸고, 톱니바퀴 모양의 설정창에 들어가 Weight를 1로 만들어 줍니다.

 

 

 

 

Any State에서 불러온 Anim파일로 Make Transition을 만들어도 된다.

 

 

 

 

BlendShapers를 사용해 자신이 원하는 표정을 만들어도 되고, 기존에 아바타에 있던 표정을 사용해도 좋습니다.

 

작성한 레이어에서 우클릭으로 새로운 State를 만들어 주고 

 

출력하고자 하는 Anim 파일을 Animation Controller 창 안에 드래그&드롭으로 불러옵니다.

 

이후 State를우클릭 - Make Transition을 클릭해 두 State를 이어줍니다.

 

 

 

 

 

 

이후 유니티 상단 메뉴에서 Window - Animation - Animation 를 클릭해 Animation 창을 열고 Controller 가 들어간 아바타의 최상위 오브젝트를 hierarchy 에서 선택해 준 뒤, 사진에 표시된 애니메이션 목록을 열어 자신이 만들어 넣었던 애니메이션 파일을 선택해 Animation 탭에서 재생버튼을 눌러줍니다.

 

 

 

 

 

 

 

 

 

Scene에서 아바타의 표정이 바뀌었다면 애니메이션 파일을 제대로 인식하고 있는 것 입니다.

 

 

 

 

 

 

 

 

 

 

 

상호작용할 해당 Bone에 들어가 Physics Bone설정의 Options 항목의 Parameter 에 임의의 이름을 적어줍니다.

 

이때 Parameter 의 이름을 서로 다르게 만들어 주어야 하는데,

 

이는 한개의 Parameter 에 2개 이상의 상태가 동시에 들어갈 수 없기 때문에 Physics Bone 한개에 Parameter 한개만 들어가야 합니다.

 

편의상 필자는 숫자로 구분해 놓았습니다.

 

 

 

 

 

이후 Animator로 돌아와 Physics Bone 의 Parameter 를 추가해 주는데, 참과 거짓을 출력하는 데이터형 Bool로 새로운 Parameter 를 작성한 뒤, Physics Bone에서 지정한 이름 뒤에 _IsGrabbed 를 붙여 파라미터를 만들어 줍니다.

 

위에서 먼저 설명하였듯이, Physics Bone에 Parameter 를 추가하면, 자동으로 Physics Bone의 데이터를 생성해 주면서 새로운 이름의 Parameter 가 생깁니다. 

 

그중에서 Bool 값을 가지는 (본인이 설정한 Parameter 이름)_IsGrabbed 를 Animator의 Parameter 입력해 줍시다.

 

 

 

 

 

이후 Animator으로 돌아와, 아까 설정해 두었던 Transition 의 화살표 모양을 클릭해 Conditions 설정을 방금 만들었던 Parameter 로 지정하고, 조건을 ture로 합니다.

 

 

반대로 돌아오는 Transition은 false로 설정합니다.

 

 

 

 

 

Has Exit Time의 체크사항은 선택사항입니다.

 

Has Exit Time은 현재 재생되는 애니메이션이 끝날 때 까지 다음 애니메이션으로 넘어가느냐 아니냐를 지정하는 것 입니다.

 

 

 

 

저의 경우엔 귀가 2개, 설정해둔 파라미터 값이 2개가 되었으므로 State를 복사해 아까와 똑같은 Transition과 Condition 설정을 해 줍니다.

 

 

 

 

 

 

 

이후 유니티를 재생 시킨 뒤, Game 씬으로 돌아와 클릭으로 직접 캐릭터를 터치해서

애니메이션이 잘 작동되는지 확인합니다.

 

 

Physics Bone 의 Parameter 에 대해서 알아봤습니다.

 

(지정한 이름)_IsGrabbed 

(지정한 이름)_Angle

(지정한 이름)_Stretch 

 

이 세가지의 데이터를 가지고 애니메이터 뿐만 아니라 쉐이더에 연동하는 것도 가능하며, 상대방과 상호작용이 가능하다는 점에서 활용도가 굉장히 높아졌습니다.

 

다음번엔 조금 더 좋고 흥미로운 VRC 글로 돌아오겠습니다.

profile

이것 저것 개발하고 만들어보기

@Tintana'k