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

 

 

 

 

 

 

 

 

 

 

 

 

Physics Bone Parameter 이외에도 상대방의 행동에 따라 다양한 변수를 꺼내 올 수 있는데, 그것을 가능 하게 해 주는것이 Receiver 입니다.

 

 

 

 

 

 

 

1. VRC Contact Receiver

 

 

 

 

 

 

 

Hierarchy 에서 빈 GameObject를 생성하고, Inspector 속성 창에서 VRC Contact Receiver 를 추가할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

Receiver 의 메뉴의 속성은 다음과 같습니다.

 

 

 

 

Root Transform : 생성한 Receiver 의 위치를 설정합니다. 비어있을 경우, 해당 객체의 위치를 사용합니다.

 

 

 

Shape

 

Shape Type : 충돌체를 감지 할 범위의 모양을 선택합니다. 원형과 사각형 둘중 하나를 골라 쓸 수 있습니다.

Radius : 충돌체의 범위의 크기를 지정합니다.

Position : 충돌체 축을 부모로 하여, 임의의 위치로 옮길 수 있습니다.

Rotation : 충돌체 축을 부모로 하여, 임의의 회전을 지정 할 수 있습니다.

 

 

 

Filtering

 

Allow self : 이 충돌체를 가진 본인의 아바타만 영향을 받도록 설정합니다. Local.

Allow others : 이 충돌체와 상호작용을 할 수 있는 다른 아바타의 영향도 받게 만들 수 있습니다. Global

Local Only : 오로지 자신의 클라이언트에서만 영향을 받습니다. 해당 Receiver가 영향을 받아 상호작용이 표시되도 다른 유저의 화면에선 보이지 않습니다.

 

Collision Tags : 해당 Receiver 에 영향을 끼칠 Tag를 지정 할 수 있습니다. 목록에 정해진 Tag 이외에 다른 Tag도 넣을 수 있습니다.

영향을 끼칠 객체와 적어도 한 개 이상의 일치하는 Tag가 필요합니다. 대소문자를 구분합니다.

 

 

Receiver 

 

 

Receiver Type

 

- Constant : Collision Tags 에 해당되는 이름을 가진 문자열이나 접촉이 감지 되었을 때를 표시해줍니다.

Bool 에선 True, Float 과 Int 에서는 1.0과 1을 출력합니다.

 

- On Enter : 접촉이 감지된 프레임의 단위를 알려줍니다. 즉, 감지된 시간 만큼의 값을 출력합니다.

On Enter로 설정할 경우 Min Velocity라는 메뉴가 생기며, 트리거에 영향을 미치기 위한 최소 속도를 설정할 수 있습니다.

Bool 에선 True, Float에서는 0~1의 값을 출력합니다.

 

- Proximity : 접촉한 객체가 Receiver 의 중심에서 얼마나 가까운지에 따라 값을 출력합니다.

Receiver 중심에 가까울 수록 1을, 멀어질수록 0의 값을 부동 소숫점으로 출력합니다.

 

 

Parameter - 임의의 이름으로 변수를 생성 할 수 있습니다.

이 매개 변수는 Receiver Type 따라서 Float, Bool , Int로 정의 될 수 있습니다.

충돌이 없으면 변수가 0이 됩니다.

 

 

 

 

 

2. VRC Contact Sender

 

 

 

 

 

 

 

 

VRC Contact Receiver 와 마찬가지로 Hierarchy 에서 빈 오브젝트를 생성해, Addcomponent 로 추가해 주면 됩니다.

 

 

 

VRC Contact Sender 의 속성은 Receiver의 메뉴와 비슷하게 동작하나, Sneder는  Receiver 의 발신자와 같은 역할을 해 주기 때문에 Filtering의 Collision Tags 의 설정이 중요합니다.

 

 

위에서 설명했듯이, Receiver영향을 끼칠 객체와 적어도 한 개 이상의 일치하는 Tag가 필요한데, Sender에 Tag를 지정하여 Receiver 를 작동시킬 수 있습니다.

 

 

 

 

 

 

 

 

 

Receiver, Sender 의 Collision Tags 에 이름을 같은 이름을 지정해 주면 Receiver를 작동시켜 줄 수 있습니다.

 

 

이 Collision Tags 는 굳이 Sender에 지정해주지 않더라도 다른 캐릭터의 손이나 발에 반응하게 만들 수 있습니다.

 

 

 

 

 

 

 

 

 

Receiver를 이용해 상대방이 나를 쓰다듬을 때 천천히 눈을 감게 만들

 

 

 

 

 

 

 

 

Hierarchy 에서 빈 Game Object 를 만들어 이름을 Receiver로 바꿔 준 뒤, 업로드 할 아바타의 자식으로 넣어주고 충돌체를 Shape의 Position으로 캐릭터 머리에 맞게 위치를 조정해줍니다.

 

(Root Transform에 캐릭터의 뼈대 위치를 참조해 1차적으로 Receiver의 위치를 바꿔줍니다.

직접 위치를 바꾸어주어도 되기 때문에 비어있어도 됩니다. )

 

 

 

 

Filtering은 Allow Others 만 체크해 주어도 되지만, 인 게임 내에서 자신의 손으로 반응하는 것 또한 보고싶은 분들은 Allow Self 에 체크 해 주셔도 됩니다.

 

 

상대방 손에 반응하기 위해 Collision Tags 에 Hand 와 Finger를 넣어주고( 목록을 열면 다른 신체 명칭도 나옵니다.)

Reciver Type을 Proximity로, Parameter 에는 본인이 사용할 변수명을 입력해줍니다.

 

 

 

 

 

 

Receiver를 테스트 할 Sender를 생성해 줍니다.

 

Hierarchy 에서 새로운 Sphere 오브젝트를 생성 한 뒤 이름을 Sender로 바꿔주고 Add Component 로 VRC Contact Sender를 넣어 Collision Tags 를 위에 생성한 Receiver의 Collision Tags 와 동일한 Tags를 넣어 줍니다.

 

 

 

 

 

 

 

이후 Receiver가 위치한 곳에 Sender 이동시키고 유니티를 Play 시켜줍니다.

 

 

 

 

 

 

 

 

Sender의 위치를 조금씩 변화시켜, 앞서 작성한 Receiver의 Parameter의 변수에 숫자값이 제대로 출력되고 있는지 확인합니다.

 

 

위에서 설명했듯이, Receiver Type이 Proximity 일 경우엔 Receiver의 충돌체를 감지해 0~1의 부동소수점을 출력합니다.

 

 

완전히 가까워지지 않았음으로 0.6가량의 숫자를 출력하는 것을 확인 할 수 있습니다.

 

 

 

 

 

 

 

 

VRC Avatar Descriptor의 Playable Layers - Base - FX 에 존재하는 Animation Controller 를 더블 클릭하여 열어줍니다.

 

이후 Aniamtion Controller 내부의 Parameters 에 Receiver에 기입했던 Parameter 변수의 값을 추가해 줍니다.

 

변수의 타입은 Float으로 생성합니다.

 

 

 

 

 

 

 

Aniamtion Controller 에서 Layers 탭으로 이동해, 새로운 Layer를 만들어 준 뒤, 이름을 바꾸고 해당 레이어의 Weight 값을 1로 만들어 줍니다.

 

 

 

 

 

 

이후 Layer 의 화면에서 빈 Aniamtion State를 작성합니다.

 

이것은 충돌체에 아무런 신호가 없을 때 아바타가 원래 상태로 돌아가게 하기 위해 빈 State를 만들어 줍니다.

 

 

 

 

 

 

 

 

 

이번엔 새로운 State를 작성하는데, From New Blend Tree 라는 State를 작성합니다.

 

 

 

 

 

 

Blend Tree 의 State를 클릭해, Inspector 창에서 Motion Time을 설정합니다.

 

만들어 주었던 Parameter 의 이름을 똑같이 기입하고, Parameter  체크박스에 체크를 해줍니다.

 

 

 

 

 

 

 

 

이후 Blend Tree부분을 더블 클릭해, Blend Tree 의 속성으로 들어가 Motion탭에 원래 상태의 얼굴 - 눈을 감는 얼굴의 Animation Clip을 넣어줍니다.

 

Threshold 는 Receiver에 설정한 Parameter의 값에 따라서 해당 애니메이션이 얼마나 재생되느냐를 보여줍니다.

 

필자가 설정한 Threshold 가 0.8은 다른 유저가 아바타 머리 안쪽까지 만져야 눈을 완전히 감는걸 방지하고자 0.8로 설정했습니다.

 

이러면 Receiver에 완전히 가까워지지 않아도 적당한 위치에서 본인의 아바타가 눈을 감게 될 것입니다.

 

 

 

 

 

다시 Animation Controller의 화면으로 돌아와 빈 State 에서 우클릭해 Make Transition 만들어 Blend Tree에 서로 이어 준 뒤, Transition 화살표를 클릭해 속성창에 들어갑니다.

 

 

속성창에 들어가면 Conditions 설정을 Receiver의 Parameter 이름을 찾아 적용 해 준 뒤, Greater 0 로 설정해 줍니다.

 

 

 

 

 

 

나머지 Transition 화살표에서는, Conditions 의 Prameter의 속성을 Less 0.1로 바꿔줍니다.

 

 

이것은 Receiver에 들어간 Parameter의 값이 0보다 크면 Blend Tree의 값을 출력하고, 0.1보다 작아지면 원래대로 돌아오도록 설정하는 것 입니다.

 

 

 

 

 

 

 

 

 

Blend Tree 의 State 를 더블 클릭해, Parameter값의 슬라이더를 직접 움직여보면, 어떻게 애니메이션이 변화하는지 알 수 있습니다.

 

0일 경우엔 빈 State를 출력함으로 Aniamtion Controller에 들어간 Layer는 비활성화 되어 다른 표정도 정상적으로 출력할 수 있도록 합니다.

 

 

 

 

 

 

 

Aniamtion Controller의 작성이 끝났다면, 테스트를 위해 작성한 해당 FX Controller를 아바타 최상위 Animator의 Controller 부분에 넣어줍니다.

 

 

 

 

 

 

이후 유니티를 Play 시키고, 아바타 위의 Sender를 움직여 머리와 가까워지는 만큼 눈을 감는지 확인합니다.

 

 

 

 

이렇듯 Receiver에 출력되는 값들을 이용하여 Animation을 출력시켜 상대방과 상호작용 할 수 있습니다.

 

VRC Contact Receiver 의 Parameter 의 값을 이용하면 표정 뿐만 아니라 다른 애니메이션도 상호작용 할 수 있으며,

 

Sender의 Collision Tags에 임의의 이름을 넣어 타인이 아닌 자신의 움직임에 반응하는 상호작용도 만들어 낼 수도 있습니다.

 

VRC Contact 에 대해서 알아봤습니다. 

 

 

다음에도 좀더 흥미로운 포스팅으로 찾아뵙겠습니다.

profile

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

@Tintana'k