[Unity] Photon Network - Destroy, RPC

박민주·2022년 5월 31일
0

Unity

목록 보기
28/40

https://youtu.be/vURIykhil2c
이영호 교수님의 강의를 들으면서 정리한 노트입니다.

네트워크 상의 오브젝트를 없애는 법

PunRPC

다음 코드와 같이 [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);
    }
profile
Game Programmer

1개의 댓글

comment-user-thumbnail
2022년 9월 29일

if(photonView.IsMine)
{
PhotonNetwork.Destroy(this.gameObject);
}
이렇게 해보세요.

답글 달기