<< 트러블슈팅 내역 >>
1. PunRPC Attribute를 이용한 메서드 내용 다른 클라이언트에 전달할 때 발생한 에러
1) 에러 발생 상황
탄환, 이펙트는 자주 호출
> 로컬 오브젝트 풀에서 관리
> 로컬 오브젝트 풀에서 호출할 때, 다른 클라이언트에서도 풀에서 꺼내서 초기화하라고 요청 보내기 (RPC 메서드)
> (에러!)
2) 에러 원인: RPC 메서드의 매개변수로는 유니티 API 자료형은 들어갈 수 없습니다.
(GameObject, Transform, Color 등)
3) 현재 구조
대기방에서 입장 전 팀을 나누어 각 플레이어에 팀 색상을 뿌려주는 방식
4) 해결
(1) DataManager 싱글톤 추가
지금의 구조를 크게 바꾸지 않으면서도 어디서나 참조할 데이터들을 넣어둘 수 있는 장점
이후에도 동일한 접근을 해야할 데이터들. 예를 들어, 대기방에서 각 플레이어가 선택한 무기를 게임으로 가져온다던지 하는 기능 확장 때도 동일하게 사용 가능
(2) DataManager에 팀 색상 데이터 넣어두기
BnB 대기방에서의 팀 색상 선택을 생각하고 팀 색상 프리셋 생성
(3) 기존 구조 변경
대기방에서 게임으로 들어갈 때,
플레이어에 컬러 타입을 넘겨주는 것이 아닌
DataManager에 A, B팀이 각각 선택한 팀 컬러를 저장
(지금은 0,1번 디폴트. 이후 대기방 팀 컬러 선택 기능 추가 시 변경 가능하게끔)
(4) 무기, 탄환에 색상 대신 팀 인덱스 값만 가지도록 스크립트 수정
(5) 팀 인덱스 값만 있다면 DataManager 를 통해 색상을 꺼내 사용할 수 있는 매개변수 단순화가 완료
즉, RPC를 통해 팀 인덱스만 넘겨주면 색상을 넘겨줄 수 있게끔 구조 변경 완료
DataManager.Instance.TeamColors[index]
2. 오브젝트풀의 프리팹 변경에 따른 개편
1) 기존의 문제들
(1) 플레이어, 무기, 탄환, 이펙트 등 게임 시작 이후 생성할 것들을 PhotonNetwork.Instantiate()로 생성 > 해당 구문으로 생성하는데 PhotonView 컴포넌트 필요 > 각 컴포넌트마다 실시간으로 통신 부하 > 다 포톤뷰를 가지고 있다면 네트워크 부하가 매우 커짐
(2) RaiseEvent로 곳곳에서 처리하려다 보니 로컬/멀티 경계가 모호한 부분이 많이 생겨 탄환 발사 시 방향이 튄다던지 하는 문제가 쉽게 잡히지 않음 > 코드 유지 보수 어려움 및 로직의 꼬임 문제
2) 해결 방안
(1) 각 플레이어, 색칠 가능한 오브젝트들 각자 ViewID를 통한 멀티 플레이 중 객체 인식이 필요한 오브젝트들만 PhotonView 사용
그 외 무기, 탄환, 이펙트 등에 부착한 PhotonView 는 전부 제거
(2) 개발 가성비가 뛰어난 PunRPC로 전환
RaiseEvent처럼 값을 넘겨주고 처리할 로직을 다 짜서 갈래를 나눠줄 필요가 없어짐(단순화)
다른 클라이언트에 전달할 내용들을 [PunRPC] 속성을 붙여(MonoBehaviourPun 상속 필요) RPC 메서드로 만들고
// 해당 무기의 총알 1발 발사
RPCManager.Instance.photonView_RPCManager.RPC(nameof(RPCManager.Instance.SpawnBullet), RpcTarget.AllViaServer,
teamID,
(int)weaponData.bullet,
firePos.position,
Quaternion.LookRotation(firePos.forward));
예시로 위와 같이 아주 간단하게
일반적인 메서드를 동일하게 여럿의 클라이언트에 발송할 수 있어
직관적, 독립적이며 책임 소재의 판별이 용이하여 유지 보수에 유리
(3) 위의 코드블럭에서 보이다시피 다른 곳에서 제거한 PhotonView 들 대신 그들의 브로드캐스트가 필요한 메서드들을 모아놓을 RPCManager 스크립트 및 오브젝트 생성. 해당 오브젝트에 PhotonView 컴포넌트를 포함하여 하나만으로 모든 브로드캐스트를 처리하여 통신 부하 대폭 감소
문제가 생길까 하여 PunRPC를 처리하는 API 확인
> 구조를 보니 버퍼처럼 List로 통신 요청을 넣고 처리
> 여러 군데에서 호출하더라도 해당 구조를 통해 순차적으로 처리하여 순서의 문제가 없음
3. 탄이 구조물에 맞으면 점유율 올라가나 시각적으로 색칠이 안됨
원인: 인스펙터에 Color 타입이 노출될 때 기본 투명도가 0
즉, 마스크에 탄환이 맞은 자리에 스탬프가 찍힘으로 인한 점유율은 상승했으나
그 색이 투명하였기에 보이지 않았던 것
4. 각 팀 플레이어 스폰 위치의 배리어에 총알이 맞으면 오브젝트 풀로 돌아가는 부분에서 인덱스 에러 발생
public enum PrefabIndex_Bullet
{
Bullet_Shooter,
}
해당 프로젝트에서는 무기, 총알, 이펙트 등
enum을 통해 해당 데이터들의 인덱스를 지칭하여 경량화 및 구조화를 꾀함
enum 타입이 인스펙터에 등장하면 드롭다운으로 기입된 데이터 내에서만 선택 가능하여 휴먼 에러 줄일 수 있다는 장점도 있음
enum과 함께 switch-case 문을 통해 데이터 값에 따른 변화를 주었는데
인스펙터의 enum 드롭다운이 아무 값도 지정하지 않고 있어 인덱스 에러
알맞은 데이터를 할당하여 해결
4. B팀의 총이 y축 기준 180도 돌아가 있는 문제
총 생성 이후 local 각도 0도로 초기화로 임시 해결
이후 무기가 다양해지고 무기에 초기 각도에 대한 데이터가 각각 들어가면 이에 맞춰 초기화하도록 변경하기
'스파르타코딩클럽_Unity개발과정' 카테고리의 다른 글
최종 프로젝트 7/16 작업노트 (1) | 2025.07.16 |
---|---|
최종 프로젝트 7/15 작업 노트 (0) | 2025.07.15 |
7/11 작업노트 (1) | 2025.07.11 |
최종 프로젝트 작업 내용 7/10 (3) | 2025.07.10 |
묑모장 > 코코낸내 후 정리 (0) | 2025.07.04 |