top of page

Study] Photon Cloud(Unity)-18

  • 작성자 사진: 김영호
    김영호
  • 2023년 2월 8일
  • 1분 분량

최종 수정일: 2023년 4월 25일

  • Game Score 동기화 하기

public class UIManager : MonoBehaviour
{
    public Text score;
    
    void Update()
    {
        score.text = GameManager.instance.gameScore.ToString();
    }
}

간단하게 UIManager를 만들어 게임 화면에 점수를 표기해주었다.



  • Test

위의 테스트 사진처럼 GameManager를 Singleton으로 불러왔다고 해도 클라이언트별로 GameManager가 존재하기 때문에 Photon Cloud에 의해 동기화 되어 있지 않은 GameManager.score는 클라이언트 별로 다른 값을 가진다. (AddScore() 함수는 MasterClient에서만 작동 중)



이를 해결하기 위해 Interface IPunObservable 를 사용하였다.

Interface IpunObservable의 함수로

public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)가 있다.

  • 기본 틀

public class GameManager : MonoBehaviourPunCallback, IPunObservable
{
    ...
    ...
    ...
    
    //IPunObservable Interface
    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        //SendNext 순서와 동일하게 ReciveNext 해야됨
        if (stream.IsWriting)   //쓰는 입장
        {
            //데이터(변수 값 네트워크 전송)
            stream.SendNext(score);
        }
        else                     //받는 입장
        {
            //데이터(변수 값 네트워크 수신)
            score = (int)stream.ReceiveNext();
        }
    }
}

해당 함수(void OnPhotonSerializeView(...))가 잘 동작되려면 Photon View Component도 잊지 말고 추가해줘야한다.

해당 함수를 사용할 때 주의할 점은 SendNext를 한 순서대로 ReceiveNext를 해주어야한다.



  • Test

정상적으로 동기화가 되는 것을 확인 할 수 있다.



  • RPC 함수 사용

using Photon.Pun;
using Photon.Realtime;

public class GameManager : MonoBehaviourPunCallbacks, IPunObservable
{
    ...
    ...
    ...
    
    //Increse the game score
    public void AddScore(int point)
    {
        GetComponent<PhotonView>().RPC("AddScoreRPC", RpcTarget.All, point);
    }

    [PunRPC]
    public void AddScoreRPC(int point)
    {
        score += point;
    }
}

다른 방법으로는 위와 같이 RPC를 사용해도 된다.

  • Facebook
  • Twitter
  • LinkedIn

©2021 by 김영호_포트폴리오. Proudly created with Wix.com

bottom of page