분류 전체보기 30

스근한 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

Factory Pattern

이번엔 Factory Pattern을 사용해봤다.  사진을 보면 알다시피 itemFactory가 다양한 아이템들을 만들고 있다.  왜 이런 방식이 필요한 걸까? 이론Design principle 2"Program to an interface, not to an implementation"- by 대학교 4학년 강의 자료.  디자인 2 원칙이 뭐냐면 코딩할 때 new 연산자를 사용하지 말라는 거다.   엥? 이게 무슨 소릴까???  이해하기 위해 아래 예제 코드를 보자.Item Buy(string name){ if(name == "WoodenSword") return new WoodenSword(); else if(name == "StoneSword") return new Sto..

Two-Pointer 연습

Two-Pointer는 배열같은 자료구조를 효율적으로 탐색하기 위해 두 개의 포인터를 활용하는 알고리즘이다.   보통 O(n^2)을 O(n)으로 단축시킬 수 있고 자료구조 양 끝에서 시작해 중앙으로 향한다. 42. Trapping Rain Water 문제를 가져왔다.  아쉽게도 문제 푸는 도중 우연찮게 해답을 봐버렸다. 여러분은 그런 일 없도록 주의 바란다. n 개의 양수로 이루어진 배열이 주어진다.n 개의 양수는 각각 벽의 높이를 의미한다.n개의 벽으로 이루어진 구조물에 비가 온다면 물은 얼마나 고였을까?  예를 들어, 입력으로 {0, 1, 0, 2, 1, 0, 1, 3, 2, 1, 2, 1}의 배열이 들어왔다고 해보자.  이 배열을 토대로 만든 구조물에는 다음 그림처럼 빗물이 고인다.  그럼 정답은 ..