일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 앱 배포
- 오큘러스
- 오브젝트 풀링
- 유니티
- 팀프로젝트
- 유니티 GUI
- 드래곤 플라이트
- 유니티 Json 데이터 연동
- ChatGPT
- Photon Fusion
- input system
- CGV
- 길건너 친구들
- 개발일지
- XR
- HAPTIC
- OVR
- 포트폴리오
- 멀티플레이
- 팀 프로젝트
- VR
- 유니티 UI
- Oculus
- 연습
- 개발
- meta
- 드래곤 플라이트 모작
- meta xr
- 모작
- 가상현실
- Today
- Total
EasyCastleUNITY
CGV 개발일지 9(잡은 물체 위치 동기화) 본문
https://easycastleunity.tistory.com/207
저번 개발일지에서는 가상현실 플레이어의 손,머리 위치 동기화에 대해 다루었습니다.
이번에는 OVR의 HandGrabInteractor를 통해 잡은 물체의 위치를 동기화 해보겠습니다.
또한 이 물체는 물리적으로 던질 수도 있는 물체입니다.
그러므로 OVR의 Throw Object도 하도록 해보겠습니다.
https://easycastleunity.tistory.com/187
해당 방법은 전에 작성한 포스트를 바탕으로 구현했습니다.
위 방법을 통해, 기본적인 HandGrab을 구현합니다.
그 다음에, 네트워크 위치 동기화를 하기 위해, Photon View와 Photon Rigidbody View를 부착합니다.
그리고, 동기화할 오브젝트에 NetworkGrabbable 이라는 스크립트를 작성했습니다.
using Oculus.Interaction;
using Photon.Pun;
using Photon.Realtime;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class NetworkGrabbable : MonoBehaviour
{
public InteractableUnityEventWrapper eventWrapper;
public PhotonView pv;
private Rigidbody rb;
[SerializeField] private bool isPhysics = false;
[SerializeField] private Collider col;
void Awake()
{
this.rb = GetComponent<Rigidbody>();
}
private void Start()
{
this.eventWrapper.WhenSelect.AddListener(() =>
{
Debug.Log("<color=lime>Grab</color>");
this.col.enabled = false;
this.rb.useGravity = false;
if (isPhysics)
this.pv.RPC("WhenSelect", RpcTarget.Others, null);
});
this.eventWrapper.WhenUnselect.AddListener(() =>
{
Debug.Log("<color=lime>UnGrab</color>");
this.col.enabled = true;
this.rb.useGravity = true;
if (isPhysics)
this.pv.RPC("WhenUnSelect", RpcTarget.Others, null);
});
}
void OnEnable()
{
PhotonNetwork.AddCallbackTarget(this);
}
void OnDisable()
{
PhotonNetwork.RemoveCallbackTarget(this);
}
[PunRPC]
private void WhenSelect()
{
this.rb.useGravity = false;
this.col.enabled = false;
}
[PunRPC]
private void WhenUnSelect()
{
this.rb.useGravity = true;
this.col.enabled = true;
}
}
이 스크립트에서 중요한 부분은 InteractableUnityEventWrapper 입니다.
이 wrapper를 사용하면 상호작용이 가능한 물체의 상태를 받을 수 있습니다. (ex. 물체가 잡혔다, 물체를 놓았다)
이 wrapper를 이용하여, PunRPC를 통해 리모트 오브젝트의 상태를 바꿀 수 있습니다.
ovr을 통해 물체를 잡으면, 물체는 중력이 없는 것처럼 작용을 하고, 콜라이더도 isKinemetic 처럼 작동합니다.
하지만 생성된 Remote 오브젝트는 위치 동기화는 되지만, 중력은 그대로 작용하고, 콜라이더도 그대로 작용합니다.
그렇기에 RPC 함수를 통해 Remote 오브젝트의 중력과 콜라이더를 꺼줍니다.
그리고 놓으면 다시 RPC 함수를 통해 중력과 콜라이더를 활성화 합니다.
시연영상
'CGV(Castle Giant Virtual) 프로젝트 일지' 카테고리의 다른 글
CGV 개발일지 11 (잡은 물체로 pc 플레이어 치기) (0) | 2023.12.14 |
---|---|
CGV 개발일지 10 (잡은 플레이어 위치 동기화) (0) | 2023.12.14 |
CGV 개발일지8 (VR 플레이어 손, 머리 위치 동기화) (0) | 2023.12.13 |
CGV 개발일지 7 (주제 변경) (1) | 2023.12.11 |
CGV 개발일지 6 (멀티, 랜덤한 방 번호 만들기) (1) | 2023.11.29 |