본문 바로가기

Unity 개발 공부

[내배캠] 본캠 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); // ← (키 없음) 전송

클라이언트가 서버로 보내는 Hashtable 에 MatchStartingLock 키 자체가
포함돼 있지 않으므로

Photon 은 “아, 변경할 게 없군” 하고 그냥 무시해 버린다.
결과적으로 서버에는 여전히 MatchStartingLock = true 가 남아 있게 된다.


올바른 삭제 패턴 두 가지

복사편집
// ① null 로 보내서 ‘삭제’ 의도를 명시 PhotonNetwork.CurrentRoom.SetCustomProperties( new Hashtable { { CustomPropKey.MatchStartingLock, null } }); // ② 또는 false 같은 다른 값으로 덮어쓰기 PhotonNetwork.CurrentRoom.SetCustomProperties( new Hashtable { { CustomPropKey.MatchStartingLock, false } });
  • “null” 을 보내면 Photon 서버가 해당 키를 완전히 제거
  • 다른 값(예: false)으로 덮어쓰면 키는 남지만 잠금 논리가 작동하지 않도록
    할 수 있음.

정리

  • Remove() 만으로는 서버에 반영되지 않는다.
    (SetCustomProperties() 가 “없는 키”는 건드리지 않기 때문)
  • 삭제하려면 그 키를 null(또는 원하지 않는 새 값)로 명시해서
    SetCustomProperties() 에 넘겨줘야 한다.

그러므로 기존 코드에서

roomProps.Remove(CustomPropKey.MatchStartingLock); PhotonNetwork.CurrentRoom.SetCustomProperties(roomProps);

를 아래처럼 바꿔 주면 원하는 대로 작동한다.

PhotonNetwork.CurrentRoom.SetCustomProperties( new Hashtable { { CustomPropKey.MatchStartingLock, null } });