일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 2D슈팅게임
- Animation State Machine
- CSharp #자료구조
- 플레이어 방향전환
- Hp바
- pccp 기출문제 2번
- 오브젝트 풀링
- LayerMark
- 플레이어 이동
- Algorithm
- C#
- 프로그래머스
- Unity
- 백준 c++ 9375번
- 충돌위험 찾기
- 유니티
- Lv.3
- Ainimation Blending
- dfs
- heap tree
- 연속 펄스 부분 수열의 합
- Back Tracking
- Lv2
- pccp 기출문제 1번
- pccp 기출문제 3번
- 양과 늑대
- 9375번
- 미로 탈출 명령어
- Blend Type
- dp 알고리즘
- Today
- Total
주녘공부일지
[더 챌린저스] 동기화(RPC) & 네트워크(Photon) 본문
1. 동기화 처리
서버 프로그래머 파트에서 제공한 RPC 함수를 필요에 따라 클라이언트에서 제어하며 사용함
1) 포톤에게 동기화 생성 요청
모노비헤이비어포톤 클래스를 베이스 클래스로 상속받는 클래스를 가진 프리팹을 대상으로 해야 함
- 생성된 오브젝트는 활성화되는 시점에 고유한 ID를 받고, 활성화시킨 클라이언트가 자신인지 확인할 수 있음
- 동일한 프리팹을 방 안의 모든 클라이언트에 생성하고 완료 시점을 확인할 수 있음 ( 동기화 완료 )
> 같은 오브젝트가 모든 클라이언트에 존재함을 보장받음
2) 브로드캐스트 함수를 호출
- 포톤을 통해 브로드캐스트 함수를 호출해 모든 클라이언트에 동일한 함수가 호출되게 함으로써 동기화
3) 변수 동기화
FixedUpdate 주기를 기준으로 변수를 동기화하는 기능을 하기 위해 변수를 등록, 해제하는 함수
+ 필요에 따라 Rigidbody2D, Transform, Animation Parameter 등을 동기화 할 수 있음
protected override void OnMineSerializeView(PhotonWriteStream stream)
{
stream.Write(currHP);
stream.Write(currState);
stream.Write(teamType);
stream.Write(jumpState);
stream.Write(invincibility);
stream.Write(superArmour);
base.OnMineSerializeView(stream);
}
protected override void OnOtherSerializeView(PhotonReadStream stream)
{
currHP = stream.Read<float>();
currState = stream.Read<ENUM_PLAYER_STATE>();
teamType = stream.Read<ENUM_TEAM_TYPE>();
jumpState = stream.Read<bool>();
invincibility = stream.Read<bool>();
superArmour = stream.Read<bool>();
base.OnOtherSerializeView(stream);
}
2. 네트워크 순차 연동 실행
두 명의 유저가 동시에 게임을 시작하기 위해 필요한 조건을 실행 순서를 지정하여 정보를 공유하고 해당 정보에 따라 완료된 시점을 받아 실행 순서에 따른 로직을 실행하기 위한 순차 실행기
- 방에 B(유저)가 입장하면 A(방장)에서 실행됨
- 플레이어 프로퍼티, 등을 이용해 A, B의 상태를 확인
+ 게임에 돌입할 때 생성되는 클래스(UserSyncMediator)
->모든 클라이언트에게 동일한 로직의 함수를 호출하는 브로드캐스트 함수를 사용하기 위한 포톤객체
protected IEnumerator INetworkSequenceExecuter()
{
// 0. 데이터 싱크
PhotonLogicHandler.Instance.RequestSyncDataAll();
// 1. 연결 확인
yield return new WaitUntil(() => Get_PhotonCheck(ENUM_PLAYER_STATE_PROPERTIES.DATA_SYNC));
// 2. 레디 확인 (방장의 레디 -> 시작 / 방장의 레디조건 : 입장한 유저의 준비완료)
yield return new WaitUntil(() => Get_PhotonCheck(ENUM_PLAYER_STATE_PROPERTIES.READY));
PhotonLogicHandler.Instance.RequestGameStart(); // 방 정보 - 게임 시작 상태로 변경
// 게임 돌입할 때 UserSyncMediator 생성
Managers.Resource.InstantiateEveryone("UserSyncMediator");
// 3. 동기화객체 생성 체크
yield return new WaitUntil(IsConnect_UserSyncMediator);
userSyncMediator.Sync_ShowGameInfo(); // 캐릭터 선택 창 돌입
// 4. 캐릭터 선택 확인
yield return new WaitUntil(() => Get_PhotonCheck(ENUM_PLAYER_STATE_PROPERTIES.CHARACTER));
userSyncMediator.Sync_ShowGameStartInfo(); // 양 쪽의 정보를 보여주고 배틀씬 이동
// 5. 씬 로드 확인
yield return new WaitUntil(() => Get_PhotonCheck(ENUM_PLAYER_STATE_PROPERTIES.SCENE_SYNC));
// 캐릭터 소환은 이 시점에 BattleScene의 Start문에서 처리됨
// 6. 캐릭터 로드 확인
yield return new WaitUntil(() => Get_PhotonCheck(ENUM_PLAYER_STATE_PROPERTIES.CHARACTER_SYNC));
userSyncMediator.Sync_GameStartEffect(); // 게임 실행
// 7. 커스텀 플레이어 프로퍼티 데이터 값 초기화
userSyncMediator.Sync_RequestUnSyncDataAll();
}
3. 네트워크 공유 데이터
- 현재 속해있는 방의 정보와 방에 있는 유저(플레이어)의 정보를 얻기 위해 콜백함수를 등록, 해제하는 함수
( 인터페이스 클래스로 다중 상속받아 정보가 필요하다면 어디서든 사용할 수 있음 )
protected override void OnEnable()
{
base.OnEnable();
this.RegisterRoomCallback();
PhotonLogicHandler.Instance.onEnterRoomPlayer -= OnEnterRoomCallBack;
PhotonLogicHandler.Instance.onLeftRoomPlayer -= OnExitRoomCallBack;
PhotonLogicHandler.Instance.onEnterRoomPlayer += OnEnterRoomCallBack;
PhotonLogicHandler.Instance.onLeftRoomPlayer += OnExitRoomCallBack;
}
protected override void OnDisable()
{
base.OnDisable();
PhotonLogicHandler.Instance.onEnterRoomPlayer -= OnEnterRoomCallBack;
PhotonLogicHandler.Instance.onLeftRoomPlayer -= OnExitRoomCallBack;
this.UnregisterRoomCallback();
}
// 방의 정보가 갱신되면 호출 - 방장에게만 변경 가능한 권한이 있음
public void OnUpdateRoomProperty(CustomRoomProperty property) { ... }
// 방에 있는 플레이어의 정보가 갱신되면 호출
public void OnUpdateRoomPlayerProperty(CustomPlayerProperty property) { ... }
4. Attack, Effect Object
- 동기화되는 오브젝트들의 공통적인 기능들을 추상화하기 위해 상속 구조도를 설계해 구현함
'GameDevelopment > [Unity] Project' 카테고리의 다른 글
[해피스케치] 카메라 인스펙터 툴 (0) | 2024.11.03 |
---|---|
[마법사의 길] 캐릭터 상태 관리 (0) | 2024.09.09 |
[더 챌린저스] 캐릭터 (0) | 2024.09.09 |
[더 챌린저스] 게임 플레이 영상 (2) | 2024.09.04 |
[페인트 맨] 파이어베이스 DB 관리 (0) | 2024.03.29 |