1인 개발/PushAndSlash

푸쉬앤슬래시 개인 프로젝트 22일차

잼잼재미 2024. 6. 12. 02:31

구현 내용


1. 멀티 플레이 캐릭터 동기화


 

캐릭터 프리팹에 PhotonView 컴포넌트와 PhotonTransformView 컴포넌트를 추가해서 캐릭터 동기화 

 

 

 

Position과 Rotation를 동기화하기 위해 PhotonTransformView를 다음과 같이 설정

 

 

RoomManager

private void Update()
{
    if(PhotonNetwork.IsMasterClient)
    {
        if (_myIsReady && _enemyIsReady && !_isGameStart)
        {
            _isGameStart = true;
            PhotonNetwork.LoadLevel("MultiBattleScene1");
        }
    }
}

 

Room의 두 Player가 모두 Ready 상태라면 PhotonNetwork.LoadLevel() 함수를 통해 씬 이동. PhotonNetwork.LoadLevel() 함수는 마스터 클라이언트에서만 실행 가능하기 때문에 위 코드와 같이 조건문 작성.

 

https://kkln2486.tistory.com/433

 

포톤의 씬 이동

private void Awake(){ PhotonNetwork.AutomaticallySyncScene = true;}if(PhotonNetwork.IsMasterClient){ PhotonNetwork.LoadLevel("MultiBattleScene1"); } Room의 모든 Player가 서버 연결을 유지하면서 씬을 이동할 때, PhotonNetwork.LoadLevel()

kkln2486.tistory.com

 

 

NetworkManager

private void Start()
{
    if (GameManager.I.ScenesManager.CurrentSceneName == "MultiBattleScene1")
    {
        if (PhotonNetwork.IsMasterClient)
        {
            GameObject playerPrefab = PhotonNetwork.Instantiate("Prefabs/Characters/" + _playerData.Tag, _startposition1.position, Quaternion.identity);
            GameManager.I.PlayerManager.Player = playerPrefab;
        }
        else
        {
            GameObject playerPrefab = PhotonNetwork.Instantiate("Prefabs/Characters/" + _playerData.Tag, _startposition2.position, Quaternion.identity);
            GameManager.I.PlayerManager.Player = playerPrefab;
        }
    }
}

 

마스터 클라이언트라면 왼쪽, 아니라면 오른쪽에 PhotonNetwork.Instantiate() 함수를 통해 프리팹 생성

 

https://kkln2486.tistory.com/429

 

동기화

동기화 1.  PhotonView갱신이 빈번한 경우에 사용ex) 위치 이동, 상태 변경캐릭터의 동기화에 사용캐릭터에 PhotonView, PhotonTransformView 스크립트 추가  Setting OwnershipFixed : Ownership 고정Takeover : Ownership

kkln2486.tistory.com

 

 

회고


오늘은 멀티 플레이의 배틀맵에서 캐릭터 동기화를 구현했다. PhotonView 컴포넌트와, PhotonTransformView 컴포넌트를 통해 동기화하는 가장 간편한 방법을 선택했다. Room에서 Ready를 하면 씬을 이동하도록 게임을 설계했기 때문에 일반적인 씬 이동을 사용하면 한번씩 상대 player가 입장하지 못하는 버그가 발생했다. 그래서 PhotonNetwork.LoadLevel() 함수를 통해 씬 이동을 했다. 그리고 DataManager의 저장된 Data가 PC1, PC2가 동일해지는 버그가 발생했다. 그래서 다른 캐릭터를 선택해도 동일한 캐릭터가 선택되서 멀티 대전이 시작됐다. 이유는 아마도 같은 PC에서 게임을 실행했기 때문에 저장된 Json이 중복되기 때문에 생긴 버그라고 예상된다. 아마도 개발을 완료하고 모바일과 PC로 테스트를 하면 해결 될 것 같다. 아직 캐릭터의 Position과 Rotation만 동기화를 했고, 애니메이션이나 점프, 스킬 등 동기화도 따로 진행해야 한다. 아직 갈 길이 멀지만 열심히해서 다음주까지 구글 스토어에 출시할 수 있도록 노력해보겠다!