전체 글 32

[Git] 야나두

오랜만에 소소한 포스팅 하나 써야지. 다 같이 디렉토리 정리하던 도중 병합 충돌이 났다. (ㅠㅠ) 일단 로컬 브런치를 새로 만들어 내 작업물을 백업해두고, develop에서 땡겨와 덮어씌웠다. 그러자 프로젝트가 펑!하고 Missing Reference가 300개씩 나오는 것 아니겠는가? 호러물이 따로 없다. 해결하기 위해 우선 git reset으로 내가 커밋하기 전으로 버전을 되돌렸다. develop에서 먼저 커밋을 땡겨와 이상 없는 거 확인하고, 그 다음 cherry-pick으로 내 커밋을 가져왔다. 이런 충돌이 발생한다. develop에서 위치를 옮긴 파일을, 내가 삭제하거나 또 다른 위치로 옮겨서 충돌이 발생한 거다. 이건 뭐 어떻게 해결한담... 뭐, 둘 중에 하나는 희생해야..

그 외/클래식 2025.08.05

float를 모르면 사람이 죽는다구요

출처: https://www.truenorthfloatingpoint.com/problem 1991년 걸프 전쟁 때, 패트리어트 미사일 방어 시스템이 스커드 미사일을 요격하지 못해 28명이 사망하고 100명이 부상하는 큰 사고가 발생한다. 이는 100시간동안 누적된 float 오차가 원인으로 파악되었으며, 0.34초까지 늘어난 시간 오차 때문에 미사일을 정확히 요격하지 못했다. float 때문에 발생한 인명 사고는 이 뿐만이 아니다. 어쩌면 내 손에 의해 이러한 사고가 발생할 수도 있는 노릇이다. 때문에 나는 이를 교훈 삼아 float를 이해해야만 한다. 원인은?인명사고를 일으킨 float의 결함은 과연 어디서 비롯한 걸까? 그 해답은 float 구조 (IEEE 754)를 파해치면 알 수 있다. ..

그 외/클래식 2025.06.13

스근한 TIL : Fusion2는 OnTrigger가 싫어요

Fusion2를 사용한 프로젝트에 상점에 진입하는 기능이 필요하다. 흠... 오! 상점에서 물건 구매했을 때만 네트워크로 뿌려주면 되겠구나! 그래서 상점 진입하고 나가는 것 자체는 Local에서 작동하게끔 설계가 되었다. 때문에 OnTriggerEnter와 OnTriggerExit 함수를 사용했고, 여기서 문제가 발생한다. OnTriggerEnter 메소드가 계~속해서 호출되는 것 아니겠는가? 분명히, 100%, 퍼펙틀리 OnTriggerEnter다. OnTriggerStay가 아니라... 많은 경우의 수를 하나하나 테스트하기 시작. 콜라이더가 잘못 되었나? 어... 콜라이더가 아예 없네? 그럼 왜...OnTriggerEnter가 작동하지? 아하!... 캐릭터 컨트롤러에 내장 콜라이더가 있다고?..

TIL 2025.04.15

Fusion2 Leg Compensation Null 오류

LegCompensation을 사용하는데 Null이 뜬다. 초기화를 잘못 해줬다? 클라이언트는 Null이 맞다? 여러 가지 해결책이 있었는데 전부 듣지 않았다. 우습게도 NetworkProjectConfig에서 Lag Compenmstation Enable 옵션을 꺼서 발생하는 문제였다.  아래는 개념입니다. - 출처: Fusion2 매뉴얼  지연 보상은 빠른 속도의 멀티플레이어 게임에서 근본적인 문제를 해결합니다. 즉, 클라이언트를 완전히 신뢰할 수 없는 상황에서도 클라이언트에게 '보이는 대로' (What You See Is What You Get) 경험을 제공하는 것입니다.  문제는 네트워크상의 어느 머신도 게임의 정확히 동일한 틱에 있지 않다는 점입니다. 한 클라이언트가 보는 것과 그에 기반해 행동..

TIL 2025.04.10

[Unity] Fusion 2 공부 # 네트워크 객체를 만들고 제어하기까지

Fusion2에서 네트워크 객체란 각 틱마다 시뮬레이션 되며 피어들에게 동기화 될 수 있는 GameObjct를 가리킨다.  멀티 플레이는 동일한 실제 세계 시간에 정확히 동일한 연산이 이뤄질 수 없다. RTT가 0이 될 수 없기 때문이다. 대신 시뮬레이션 속 동일한 틱에서 동일한 연산이 이뤄지도록 하는 것이 최선이다. 물론 이것도 RTT 때문에 완벽히 수행될 수는 없다. 하지만 로컬 시뮬레이션을 돌려 서버의 다음 시뮬레이션을 예측하는 방법으로 눈속임 할 수는 있다. 원래는 시뮬레이션을 서버에서만 돌리고 클라이언트들에게 통보하는 방식이라 클라이언트의 시뮬레이션에는 딜레이가 있을 수 밖에 없다. 하지만, 클라이언트가 독자적인 시뮬레이션을 돌린 후에 서버로부터 받은 정보를 덮어 씌우는 방식이라면? 이 방법이 ..

TIL 2025.04.09

[Unity] Fusion2 공부 # 로비 매칭

오늘은 로비를 구현해봤다.  아 쉽지 않다. 아직 고쳐야 할 부분이 많은데 엄두가 안 난다. 잘 이해가 안 가는 개념도 여럿 있어서 지속적인 리팩토링이 필요하다.   게임이 실행되면 우선 NetworkRunner를 생성한 다음 Lobby에 접속한다.   호스트 모드로 세션을 생성하는 메소드를 만든 후 버튼에 연결해준다.   생성된 세션들을 업데이트 해준다. 이 과정을 거치면 모든 플레이어의 화면에 세션 리스트 UI와 정보가 뜨게 된다.  생성된 세션들에 클라이언트 모드로 참여할 수 있다.    세션에 참여한 플레이어들의 정보를 담을 객체를 생성해준다. 여기에는 플레이어 닉네임과 직업에 대한 정보가 담겨 있다.  호스트가 개임 시작 버튼을 누르면 세션에 참여한 모든 플레이어가 동시에 게임 플레이 씬으로 넘..

TIL 2025.04.08

[Unity] Fusion2 공부 # 예측

네트워크에는 ping이라고 불리는 개념이 있는데, 특정 장치(예: 서버나 다른 컴퓨터)에 데이터 패킷을 보내고, 응답이 돌아올 때까지의 왕복 시간(RTT, Round Trip Time)을 측정하는 녀석이다. 보통 ms(밀리초) 단위로 표시되고 한국에서는 10 ~ 30ms 정도의 RTT를 가진다. 이 때문에 FPS 게임에서 마우스를 클릭해 총이 발사되기까지 10~30ms 정도의 지연 시간이 발생한다(동작의 처리는 서버에서 하기 때문에, 클라이언트는 동작 요청을 보내고 서버로부터 응답을 받아야 한다.). 근데 멀티에는 다양한 플레이어가 있고 각자 RTT가 다르다. 총을 발사했다는 정보가 각 플레이어게 도달하는 시간이 각자 다르다는 건데, 그러면 누군가에겐 총알이 맞은 것처럼 보이지만 누군가는 피한 것처럼 보..

TIL 2025.04.07

[Unity] Fusion2 공부 # Runner와 Input

2003년 독일 함부르크에 Exit Games라는 회사가 설립되었고, 2008년에 포톤이라는 이름의 제품이 처음 출시되었다. Exit Games는 멀티 플레이 네트워크 솔루션을 연구하고 출시하는데 주력했으며, 지금은 다양한 photon 제품군을 판매하며 90 만의 개발자 고객을 확보하고 월 14억 명 이상의 멀티 플레이 유저를 지원한다.이번에 멀티 플레이 프로젝트를 시작하면서 photon 제품군 중 하나인 fusion2를 사용할 기회를 얻게 되었다. 본 포스팅은  fusion2 documents를 하룻동안 살펴본 내용을 정리하는 글이다. 멀티 게임 프로젝트가 약 두 달은 계속될 예정이니 앞으로 fusion2에 관련한 자세한 포스팅을 추가로 올릴 수 있을 것 같다.  Photon은 고맙게도 약간의 서버 사..

TIL 2025.04.04