EasyCastleUNITY

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

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

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

EasyCastleT 2023. 12. 14. 18:29

https://easycastleunity.tistory.com/209

 

CGV 개발일지 10 (잡은 플레이어 위치 동기화)

https://easycastleunity.tistory.com/208 CGV 개발일지 9(잡은 물체 위치 동기화) https://easycastleunity.tistory.com/207 CGV 개발일지8 (VR 플레이어 손, 머리 위치 동기화) 전에 개발일지6 번에서는 Photon Fusion을 사용하

easycastleunity.tistory.com

개발일지 10에서 잡은 플레이어 위치를 동기화를 해보았습니다. 

이번에는 물체를 잡아 플레이어를 쳐보도록 하겠습니다. 

 

가장 중요한 점은,

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

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

 

https://easycastleunity.tistory.com/203

 

CGV 개발일지 4 (OVR Grab을 통해 잡은 물체를 통해 다른 물체 치기)

여태까지는, OVR에서 제공하는 기본적인 기능들을 사용하여 테스트를 했습니다. 이번 포스트에서는, OVR 을 활용하여, 조금 다른 기능을 구현해 보도록 하겠습니다. 바로 집은 물체를 통해, 다른

easycastleunity.tistory.com

치는 것은 위 포스트에서 설명하고 있습니다. 

 

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

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

 

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

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

 


1번 이유

이런점을 유의하여, 마스터라면, 실질적으로 충돌하는 Rigid를 가지고 있지만, 클라이언트라면, Rigid를 가지고 있지 않도록 하였습니다. 

GameMain 부분

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

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

 

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


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

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

각각의 Action들과 연결

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

Action 구현부분,PlayerNetworkGrabbable 일부분

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

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

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

 

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

 

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

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

속도가 1미만인 경우 바로 다시 onPlayerRequestAction 호출


위의 2가지 가정을 거쳐서, 아래와 같은 영상이 됩니다. 

VR 시점
pc 시점

 

이렇게 잡은 물체로 PC 플레이어 치기 구현이 완료되었습니다.