Unity 6000.0.51f 환경에서 진행했고 멀티를 테스트할 수 있는 에셋은 ParrelSync를 사용했습니다.
Observer
Observer는 특정 조건 (오브젝트 거리, 같은 씬에 있는지, owner 인지 등)에 만족해야 네트워크 오브젝트들이 보이면서 네트워크 기능을 이용할 수 있게 해주는 기능입니다.
이걸 사용하는 이유는 최적화 때문인데 예를 들어 내 화면에 없는 네트워크 오브젝트는 보여줄 필요가 없으니 삭제하고 내 화면에 들어왔을 때 다시 소환하는 방식으로 최적화가 이루어집니다.
저는 LOD와 비슷하다는 느낌을 받은 기능입니다.
Observer 미리보기
먼저 특정 조건 (오브젝트 거리, 같은 씬에 있는지, owner 인지 등)을 활용해서 Observer가 뭔지 직접 확인해 보겠습니다.
위 영상은 Observer Condition를 Distance Condition으로 했을 때 나타나는 결과입니다.
거리는 마음대로 조절할 수 있는데 저는 1로 설정해 놨습니다.
클라이언트의 경우엔 내 네트워크 오브젝트와 다른 네트워크 오브젝트 간 거리가 n이상 차이 날 경우 다른 네트워크 오브젝트가 아예 파괴돼버리는 걸 볼 수 있습니다.
근데 호스트 같은 경우엔 좀 다른데 아예 파괴되는 것이 아니라 Renderer만 disable 해서 다른 플레이어의 그래픽만 안 보이게끔 해놨습니다.
왜 그럴까 추측건대 서버는 항상 모든 네트워크의 정보를 가지고 있어야 합니다.
위 사진처럼 플레이어가 파괴되어도 실제로 접속이 끊어진 건 아닙니다.
서버가 원본 데이터를 남겨두고 Observer Condition를 만족했을 때 조건을 만족한 오브젝트를 생성해라고 클라이언트에 명령을 내려야 다른 플레이어가 다시 생성됩니다.
그래서 클라이언트 겸 서버인 호스트에선 서버에서 어떤 일이 벌어지는지 시각적으로 보여준다고 생각합니다.
ObserverManager, NetworkObserver
Network Manager와 같이 붙어 있는 ObserverManager는 게임 전체 Observer를 관할합니다.
Update Host Visibility | False면 호스트에서 조건에 만족하지 못한 오브젝트들의 Renderer를 비활성화 시키지 않음 |
Maximum Timed Observers | 낮을 수록 서버가 Observer 업데이트 하는 시간이 더 빨라짐 (빨리 확인 할 수 있지만 서버 과부하가 생길 수 있음) |
Default Conditions | 게임 전체 기본 Condition |
NetworkObserver는 오브젝트 별로 Condition을 지정할 수 있습니다.
Override Type | Add Missing : ObserverManager의 Condition 중 NetworkObserver가 가지고 있지 않은 Condition을 추가 Use Manager : ObserverManager의 Condition을 사용 Ignore Manager : ObserverManager의 Condition을 무시하고 NetworkObserver의 Condition 사용 |
Update Host Visibility | False면 호스트에서 해당 오브젝트의 Renderer를 비활성화 시키지 않음 |
Observer Conditions | 해당 오브젝트의 Condition들 |
Condition 종류
이제 Observer Condition의 종류를 알아보겠습니다.
기본적으로 제공하는 Condition은 ScriptableObject 6개인데 얘네들을 직접 수정하는 것보단 새로운 Condition을 추가하는 게 더 좋습니다.
위 사진처럼 Project에서 우클릭으로 Condition들을 생성할 수 있습니다.
공통 속성
Add Order | Condition이 여러 개 일 경우 적용되는 순서 |
Is Constant | True면 런타임에서 Condition의 설정이나 데이터를 못 바꾸게 끔 변경 |
Host Only Condition
특정 네트워크 오브젝트를 호스트만 볼 수 있게끔 하는 Condition
Match Condition
특정 Match 끼리만 볼 수 있는 Condition?
이 Match는 Class MatchCondition 이 사이트에 나와 있는 함수들로 추가하거나 삭제할 수 있는 거 같습니다.
public static void AddToMatch(int match, NetworkConnection conn, NetworkManager manager = null, bool replaceMatch = false)
뭐 이런 함수로 match를 추가할 수 있다고 하네요.
Grid Condition
그리드 안에 있을 때만 볼 수 있는 Condition
그리드 범위는 Network Manager 컴포넌트가 있는 오브젝트에 Hash Grid를 추가하면 됩니다.
Owner Only Condition
Client가 Owner를 가진 물체만 볼 수 있도록 하는 Condition
Distance Condition
특정 거리 안에 들어와야 볼 수 있도록 하는 Condition
Maximum Distance | 다른 네트워크 오브젝트를 볼 수 있는 최대 거리 |
Hide Distance Percent | 네트워크 오브젝트가 사라지는 거리 |
Hide Distance Percent 같은 경우엔 예를 들어 maximum distance가 2고 hide가 1로 설정하면
다른 플레이어가 보이기 위해선 내 플레이어와 거리가 2 이내가 되어야 하지만 보였다가 사라지려면 maximum distance + maximum distance * hide distance percent가 되어야 합니다.
즉, 예시에선 보이려면 거리가 2 이내, 안 보일려면 4 이상 돼야 합니다.
Scene Condition
같은 Scene 안에 있어야 볼 수 있는 Condition
Condition을 커스텀으로 만들 수 있다고도 합니다.
Custom Conditions | Fish-Net: Networking Evolved
GuidesFeaturesArea of Interest (Observer System)Custom Conditions Sometimes you may have unique requirements for an observer condition. When this is the case you can easily create your own ObserverCondition. The code below comments on how to create your ow
fish-networking.gitbook.io
아직 필요성을 못 느껴서 해보진 않았지만 쓰게 될 경우 사용법을 올리도록 하겠습니다.
'유니티 > Tutorial' 카테고리의 다른 글
Unity Fishnet[4] RPC (3) | 2025.07.31 |
---|---|
Unity Fishnet[2] Ownership과 Player Move (2) | 2025.07.08 |
Unity Fishnet[1] 네트워크 연결 및 플레이어 스폰 (2) | 2025.06.30 |
Unity Fishnet[0] 소개 및 설치 (0) | 2025.06.24 |
Unity 디자인 패턴 Command (2) | 2025.05.28 |