분류 전체보기 (54) 썸네일형 리스트형 [내배캠] 본캠 86 Photon pun2 hashtable 관련 이슈 해결 ft: remove Photon 룸 프로퍼티 갱신 규칙넘겨주는 Hashtable 형태서버에서의 처리{ key : value }key 가 존재하면 값 덮어쓰기, 없으면 새로 추가{ key : null }key 삭제(=제거)키가 없음그 키에 대해 아무 변화도 없음 SetCustomProperties() 는 “넘겨준 키만 보고” 처리한다.따라서,var roomProps = PhotonNetwork.CurrentRoom.CustomProperties; // ← 전체 사본 roomProps.Remove("MatchStartingLock"); // ← C# 변수에서 삭제 PhotonNetwork.CurrentRoom.SetCustomProperties(roomProps); // ← (키 없음) 전송 클라이언트가 서버로 보내는 Hash.. [내배캠] 본캠 81 게임 씬 카운트다운 및 게임 타이머 동기화 via Photon RPC 배경기존에는 Photon CustomRoomProperties를 사용해:InGameStartReady → 모든 준비 완료 후 프로퍼티에 CountdownStartTime, GameBeginTime을 기록OnRoomPropertiesUpdate 콜백에서 해당 프로퍼티를 읽어 각 클라이언트가 로컬 타이머 시작하지만 네트워크 지연과 씬 로드 타이밍 차이로 클라이언트별 시작 시간이 달라지는 문제가 발생핵심 학습 내용Photon RPC를 활용한 완전 동기화 방식 전환CustomRoomProperties 대신, 호스트(MasterClient)가 두 번의 RPC 호출로:RPC_NetworkedCountdown(double ctStart) → 5초 카운트다운 시작 시각을 모든 클라이언트에 전파RPC_BeginGameT.. [내배캠] 본캠 69 렌더링공부, 페인트칠 공부 1. 멀티-렌더러 페인팅 이슈문제 발견프로젝트 초기엔 구조물 하나에 PaintableObject 컴포넌트를 달고, 자식에 달린 여러 MeshRenderer를 한 번에 순회하면서 그리도록 구현했다. 그런데 실험해 보니, 총알이 자식 A에만 충돌해 페인트가 찍혔음에도 자식 B, C에도 똑같이 칠해지는 현상이 발생했다.원인 분석머티리얼 인스턴스 공유MeshRenderer.material 프로퍼티를 통해 접근하면, Unity는 내부적으로 shared material이 아닌 인스턴스를 만들어 모든 렌더러가 같은 인스턴스를 바라보게 된다.커맨드 버퍼 DrawRenderer 순회CommandBuffer.DrawRenderer 호출 시도 모두 동일 머티리얼 인스턴스를 참조하므로, “A만 그릴” 페인트 셋업과 “B에도 .. [내배캠] 본캠 63 쉐이더공부를 위한 기본이론공부 페인트 물감칠 로직을 가져와서 구조물에 칠할때 구조물의 팀별 점유율을 비교해 어느팀이 우세한지 나타낼 예정이다. 그리고 점유율이 높은 팀이 1포인트를 가져가 구조물당 1포인트씩 더하여 최종결과에서 어느팀이 더많은 포인트를 가져갔냐를 승리 조건으로 만들 예정이다. 그러기위해선, 팀원이 짜놓은 1. 페인트 로직에대한 이해 ( 셰이더, uv, 텍스쳐2d, 메테리얼 관련 api 이용 방법, 이론이해) 2. 구조물 설계를 위해 UV를 어떻게 펴야할건지. 3. 해당 구조물 제작에있어서 효율적이고, 최적화 되는 방향은 없을지 4. 구조물 점수계산 로직 이렇게 절차가 필요하다. 기존의 테스트에서는 정육면체의 모델의 UV전개도로 펼쳤을때 이어져있는 UV맵을 mark seam을 통해 블렌더에서 6면으로 나누어놓은상태다... [내배캠] 본캠 57 pun2 공부5 RPC와 RaiseEvent RPC는 원격 프로시져 호출(Remote Procedure Calls) 복습, 원격호출할 메서드는 [PunRPC] 속성 적용 [PunRPC]void ChatMessage(string a, string b){ Debug.Log(string.Format("ChatMessage {0} {1}", a, b));}RPC로 표기된 함수를 호출하기위해선 PhotonView 컴포넌트가 필요하다. 호출예시PhotonView photonView = PhotonView.Get(this);photonView.RPC("ChatMessage", RpcTarget.All, "jup", "and jup!");뒤에 인자들(jup, andjup!은 PunRPC를 붙인 메서드의 파라메터로 받는 인자들 값.. [내배캠] 본캠 60 pun2 공부7, 시간 로컬이라면 시간이 흘러가면 게임 종료팝업을 띄운다고 해보자. 쉽게 예재 생각하면 public float gameTime = 20f;void Update(){ gameTime -= Time.deltaTime; if (gameTime 이런식으로 작성하면된다. 하지만 네트워크 동기화시에는 모든플레이어의 타이머가 정확히 같은 순간 같은 속도로 흘러가야한다. 그렇지만 씬로드 타이밍차이, 프레임 레이트차이 재접속, 스펙테이터 관리등으로 틀어지는 시간때문에 로컬변수로만으로는 체크가 힘들다. PhotonNetwork.Time은 Photon Cloud 서버에 부팅된 이후로 흐른 총시간을 초단위(double)로 나타낸값이다. 클라이언트는 주기적으로(0.1초~0.2초 간격)서버로부터 최신 타임스탬프를 받아와, 그.. [내배캠] 본캠 57 pun2 공부4 구조물 랜덤생성 및 페인팅, 점수 계산 관련 로직. 왜 중립 오브젝트(Neutral Object)를 쓰는가? Ownership 고정(Fixed) 플레이어가 아닌 “씬(Scene)” 소유로 만들어 두면, 그 오브젝트에 대해 TransferOwnership·RequestOwnership 같은 호출이 절대 일어나지 않습니다. MasterClient 전환 안전 Photon 룸의 MasterClient가 바뀌면(방장이 나갈 때 등), 만약 Surface가 단순 PhotonNetwork.Instantiate 로 MasterClient 소유로 생성되었다면 → 새 방장이 되기 전까지 그 오브젝트에 대한 제어·RPC가 불가능해집니다. 반면, 신(Scene) 소유로 만든 씬 객체는 방장이 바뀌어도 그대로 남아 있고, 누구.. [내배캠] 본캠 57 pun2 공부3 AutomaticallySyncScene : awake 나 start에서 true로 만들어두면 방장이 씬을 이동하면 모두 같이 이동한다. LoadLevel(int levelNumber) : 로 씬 전환한다. IsConnected : 연결됐는지 InLobby : 로비에 있는지(마스터서버아님) InRoom : 방에 있는지 NetworkClientState : 본인의 상태 체크가능 switch(PhotonNetwork.NetworkClientstate) 로해서 누락된것 붙여주기하면 case ClientState.PeerCreated: break; case Clientstate.Authenticating: break; ... OfflineMode : start에서 true로 하면 멀티코드가 싱글에서도 버그가 안.. 이전 1 2 3 4 ··· 7 다음