EasyCastleUNITY

CGV 개발일지 12 (맨손으로 pc 플레이어 치기) 본문

CGV(Castle Giant Virtual) 프로젝트 일지

CGV 개발일지 12 (맨손으로 pc 플레이어 치기)

EasyCastleT 2023. 12. 14. 19:00

https://easycastleunity.tistory.com/210

 

CGV 개발일지 11 (잡은 물체로 pc 플레이어 치기)

https://easycastleunity.tistory.com/209 CGV 개발일지 10 (잡은 플레이어 위치 동기화) https://easycastleunity.tistory.com/208 CGV 개발일지 9(잡은 물체 위치 동기화) https://easycastleunity.tistory.com/207 CGV 개발일지8 (VR 플

easycastleunity.tistory.com

전에 포스트에서는 잡은 물체로 PC 플레이어를 쳤습니다. 

이번에는 그냥 손으로 Pc 플레이어를 쳐보겠습니다. 

 

가장 중요한 점은, 저번 물체로 친것과 동일하게 

1.실질적으로 충돌하는 콜라이더는 vr 플레이어의 프로젝트에만 있어야 하며, 

2.부딫치는 순간, 위치를 동기화 하기 위해, PC 플레이어의 권한을 잠깐 VR 플레이어에게 가져와야 한다는 것입니다.

 

다시한번 더 설명드리자면, 

1번의 중요한 점의 이유는, 부딫치는 콜라이더가 다른 프로젝트에도 있다면, 네트워크 지연으로 인해, 쳐지는 타이밍과 부딫치는 점이 달라지게 되어, 해당 물체가 2번 쳐지는 문제가 발생하며, 위치 동기화는 소유권을 기준으로 하기에, 

날아가다가 방향이 달라지는 현상이 생기기도 합니다. 

 

2번의 중요한 점의 이유는, 1번 이유를 설명할 때, 말씀드렸다시피, 위치 동기화는 소유권을 기준으로 동기화 합니다. 

그렇기에, 쳤을 때의 물리량은 vr 플레이어의 기준으로 생성이 되게 됩니다. 하지만 소유권이 없다면, pc 플레이어의 기준으로 물리량이 결정되기에, 치는 순간 위치동기화를 하기 위해, 플레이어의 소유권을 가져와야 합니다. 


1번 이유

OvrCameraRig의 손의 Collider를 만들것이기에, PC 플레이어에서는 OvrCameraRig를 삭제합니다. 

현재는 방에 들어오는 순간 Action을 받아서, 마스터라면 clientGo들을 삭제하고, 아니라면 masterGo를 삭제합니다. 

이렇게 하면, 들어오는 순간 판단을 하여, 실질적으로 충돌하는 OvrCameraRig를 VR 플레이어 즉, 마스터만 가지고 있을 수 있게 합니다. 

 

이렇게 1번의 중요한 점을 해결하였습니다. 


2번 이유 - 소유권 가져오기 

PC 쪽이 조종하는 Player에 부착되어 있는 PcPlayer의 일부분입니다. 

PcPlayer OnCollisionEnter 부분

Hand라는 태그를 가진 것과 충돌하면 onImactAction을 호출합니다. 

 

소유권을 가져오기 위해 IPunOwnershipCallbacks 을 가지고 있는 PlayerNetworkGrabbable에 Action들을 구현하였습니다. 

Action 구현부분,PlayerNetworkGrabbable 일부분

부딫치는 순간 onImpactAction이 호출이 되며, vr 플레이어가 권한을 요청합니다. 

그리고 쳐져서 날아가다가 땅과 부딫치면, onPlayerRequestAction이 호출이되며, PcPlayerRequest를 RPC로 호출합니다.

그러므로 권한을 요청하는 사람은 PcPlayer가 됩니다. 

 

결론적으로 땅과 부딫치는 순간, 다시 PcPlayer에게 권한이 돌아오게 됩니다. 

 

문제점은 그냥 살짝만 Hand라는 태그를 가진 물체와 부딫쳐도, 권한을 가져오게 된다는 것인데, 

이 문제는, 부딫친 문제의 속도값을 받아 일정치 이하인 경우, 바로 PcPlayer가 권한을 요청하도록 하였습니다. 

PcPlayer OnCollisionExit 부분


물리적인 손을 만들기 위해 사용하는  HandPhysicsCapsules

 

OVR SDK가 가지고 있는 컴포넌트입니다. 

OVR hand나 Controller hand의 콜라이더를 만들어줍니다. 

Synthetic 손 아래의 Visual에 부착하고 

Hand Visual에는 Visual 자기 자신을 

Joints Radius Features 에는 위 사진에서 하이라이트 된 HandFeatures를 assign 하면 됩니다. 

 

그러면 아래 사진과 같이 손을 따라 움직이는 Collider가 생성됩니다. 

손에 생긴 콜라이더들

저는 Tag를 Hand로 맞추기 위해 스크립트를 조금 수정하였습니다. 

HandPhysicsCapsules 콜라이더 생성하는 메서드 collder.tag = "Hand"추가


시연영상 

VR 플레이어 시점
PC 플레이어 시점

 

이렇게 맨손으로 PC 플레이어 치기 구현을 완료하였습니다.