https://youtu.be/vURIykhil2c
이영호 교수님의 강의를 들으면서 정리한 노트입니다.
네트워크 상의 오브젝트를 없애는 법
다음 코드와 같이 [PunRPC] 애트리뷰트를 선언하고 함수를 정의하면
해당 함수는 원격에서 호출할 수 있는 함수가 된다.
[PunRPC]
public void Damage()
{
PhotonNetwork.Destroy(this.gameObject);
}
ServerSetting에서 Rpc List를 보면 위에서 선언한 Damage가 추가된 것을 알 수 있다
(만약 안 뜨면 Refresh RPCs 버튼 눌러볼 것)
호출할 때는 이렇게 하면 된다
PhotonView.RPC(nameof(Damage), RpcTarget.All);
데이터를 실시간으로 주고받아야 하는 경우 RPC를 사용하지는 않고,
채팅같이 한 번씩 주고받는 경우에 사용한다
실시간으로 주고 받아야 하면 OnPhotonSerializeView를 사용하면 된다
이렇게 하면 Enemy를 hit했을 때 Enemy가 없어지긴 하는데, 에러는 여전히 뜬다
이제 해결해야 함..
Tip.
Development Build에서는 이렇게 Development Console이 떠서 에러 나면 알 수 있음
void Update()
{
// 나 자신이 아니라면 입력 무시
if(photonView.IsMine == false)
{
return;
}
if(Input.GetButtonDown("Fire1"))
{
Ray ray = new Ray(cam.transform.position, cam.transform.forward);
RaycastHit hitInfo;
int layerMask = 1 << gameObject.layer;
if(Physics.Raycast(ray, out hitInfo, 1000, ~layerMask)) // 플레이어만 빼고
{
// 없애자!
//Destroy(hitInfo.transform.gameObject);
// 그냥 Destroy하면 네트워크 상태에서는 사라지지 않음
// PhotonNetwork.Destory()로 없애야 하는데 단, PhotonView가 있는 객체만 없앨 수 있음
PhotonView pv = hitInfo.transform.GetComponent<PhotonView>();
if(pv)
{
// RPC에 등록된 Damage라는 함수를 이 방안에 있는 모두에게 전송
pv.RPC(nameof(Damage), RpcTarget.All);
}
}
}
}
[PunRPC] // 이 밑의 함수는 RPC함수가 되고, 원격에서 호출할 수 있는 상태가 됨
public void Damage()
{
// 자기가 스스로를 삭제
PhotonNetwork.Destroy(this.gameObject);
}
if(photonView.IsMine)
{
PhotonNetwork.Destroy(this.gameObject);
}
이렇게 해보세요.