내일배움캠프 48일차 TIL, 포톤2

황오영·2024년 6월 25일
0

TIL

목록 보기
48/56
post-thumbnail
post-custom-banner

포톤과 동기화 로직들

  • 오늘은 작업하면서 사용한 코드 + 배운것들을 간단히 정리하고자 한다.

동기화와 Synchronization

  • 포톤의 동기화르 위해 포톤뷰 스크립트가 필요한데 작업을 하는데 총알이 정확한 위치에 동기화가 되지 않는 문제가 있었다.
  • 해결방법으론 포톤의 동기화 옵션인 Synchronization을 바꾸는것이었는데 총 4가지가 있다.
  1. off : RPC만사용
  2. Reliable Delta Compressed : 받은 데이터를 비교해 같으면 보내지 않음.
  3. Unreliable : 계속 보냄, 손실 가능성 있음.
  4. Unreliable On Change : 변경이 있을 때 계속 보냄.
  • 여기서 2번째 옵션인 Reliable Delta Compressed을 사용해 정확성을 높이니 어느정도 문제가 해결되었다.

씬은 조심스럽게 옮겨야한다.

  • 포톤서버에서 씬전환은 방과 같은 개념이라 다같이 들어오고 다같이 나와야 한다고 알려주셨는데 그걸 몰르고 그냥 개개인으로 씬전환을 했더니문제가 있었다.
    [PunRPC]
    private void RPC_GameOver()
    {
        //턴을 넘기기전에 플레이어가 한명 남았는지 체크
        int aliveCount = 0;
        foreach (Photon.Realtime.Player player in PhotonNetwork.PlayerList)
        {
            Debug.Log(player.CustomProperties["isDie"]);
            if (player.CustomProperties.ContainsKey("isDie") && !(bool)player.CustomProperties["isDie"])
            {
                aliveCount++;
            }
        }
        Debug.Log(aliveCount);
        // 생존한 플레이어가 한 명인지 체크
        if (aliveCount == 0)
        {
            Debug.Log("한 명의 플레이어만 생존했습니다.");
            PhotonNetwork.LeaveRoom();
        }

    }
    public override void OnLeftRoom()
    {
        Managers.Scene.LoadScene(Define.SceneType.LobbyScene);
    }
  • 죽었을때 방에 나가기위해 다같이 나가는 로직인 PhotonNetwork.LeaveRoom()을 실행하고 방을 나갔을때 다같이 이동하기 위해서 OnLeftRoom 를 override해서 동시에 로드씬을 실행시켜주는것으로 문제를 해결할 수 있었다. 씬관리가 정말 중요한 것을 배웠다.

photonView.RPC의 실행

  • 프로시저 공간에서 실행되는 함수인데 이것 역시 인자를 넘길수 있는 함수처럼 사용가능하다.
  • 다만 trasnform, vector같은 복잡한 구조체들은 인자로 전달할 수 없고, float, int같은 간단한 변수들만 인자로 넘겨서 실행시켜줄 수 있다고 한다.
   private void RPC_Fire()
   {
       if (!photonView.IsMine)
           return;

       isPressed = false;
       PhotonNetwork.Instantiate(Path.Combine("Prefabs", "bullet"), gunbarrel.transform.position, gunbarrel.transform.rotation)
       .GetComponent<Bullet>().photonView.RPC("RPC_Start", RpcTarget.All , gunbarrel.transform.eulerAngles.z, force);
       ResetGauge();
   }
  • 그래서 초기 Trasform을 넘겨주는것을 각각 필요한 변수로 변환해서 넘겨주는 방식으로 문제를 해결했다.. 복잡한 데이터는 손실가능성이 있어서 전달하지 못한다고 배웠다!

오늘의 회고

  • 오늘은 팀프로젝트 마무리 하루 전날, 어제오늘 포톤에 대해 정리하고 공부하면서 많이 배우긴 했는데 포톤적응이 생각보다 너무 어려워서 작업 시간이 길었다... 그래서 조금 프로젝트 완성도가 낮은것이 살짝 아쉽다. 포트리스 느낌은 나는데 디테일적인 UI나 전체적인 플로우가 아쉬웠다.
  • 그래도 포톤에 대해 제대로 공부할 수 있어서 좋긴했다. 동기화의 개념 포톤을 어떤식으로 써야할지 메소드, 프로시저 클라이언트 등등등에 대한 이해가 있어서 생각보다 서버작업이 재미있어서 더 열심히 했던것같다.
  • 내일 발표하고 피드백 + 마무리 회고를 진행해야겠다.
profile
게임개발을 꿈꾸는 개발자
post-custom-banner

0개의 댓글