네트워크 동작
개요
NetworkBehaviour
는 Unity의 MonoBehaviour
클래스를 상속받고 확장하여 다음을 포함합니다:
Runner
속성으로 관련된NetworkRunner
에 대한 참조.Object
속성으로 관련된NetworkObject
에 대한 참조.- 네트워크 속성을 처리하는 기능.
- 원격 프로시저 호출(을 처리하는 기능.
Spawned()
,Despawned(NetworkRunner runner, bool hasState)
,FixedUpdateNetwork()
,Render()
에 대한 가상 이벤트 콜백.- 흐름 제어를 위한 권한 처리.
HasStateAuthority
,HasInputAuthority
,IsProxy
.
NetworkBehaviour
컴포넌트는 네트워크 객체와 그 자식 변환에 여러 개 추가할 수 있습니다.
각 NetworkBehaviour
인스턴스는 네트워크 객체의 상태(Networked Properties)와 시뮬레이션(FixedUpdateNetwork()
)의 일부를 나타냅니다.
NetworkBehaviourId
첨부된 네트워크 객체의 각 NetworkBehaviour
컴포넌트는 고유한 네트워크 식별자를 가집니다.
이 식별자는 네트워크 속성(Networked Property)이나 원격 프로시저 호출(Remote Procedure Call)을 통해 NetworkBehaviour
를 참조하는 데 사용될 수 있습니다. 고급 네트워크 속성을 참조하세요.
네트워크 속성 (상태)
네트워크 속성 은 NetworkBehaviour
에서 [Networked]
특성으로 정의된 속성입니다.
이 속성들은 네트워크 객체의 상태를 나타내며, 그 값은 상태 권한을 가진 피어에서 다른 관심 있는 피어로 복제됩니다.
서버 모드에서는 서버가 항상 상태 권한을 가집니다. 공유 모드에서는 플레이어가 상태 권한을 가집니다.
이 속성들은 구현 없이 자동 구현된 속성으로 정의되며(빈 { get; set; }
형태로만 정의됨),
NetworkBehaviour
에서 Spawned()
가 호출될 때까지 네트워크 속성에 접근할 수 없습니다.
이벤트 함수
NetworkBehaviour
는 여러 개의 가상 생애 주기 이벤트 함수를 제공하며, 이들은 모두 구현을 추가하기 위해 오버라이드 할 수 있습니다.
함수 | 설명 |
---|---|
FixedUpdateNetwork() | Fusion의 고정 시간 간격 콜백. 시뮬레이션 틱 당 한 번 호출됩니다. 핵심 게임 로직의 시뮬레이션에 사용됩니다. Unity의 `FixedUpdate()` 대신 사용하세요. |
Spawned() | `NetworkRunner`에 네트워크 객체가 연결된 후 호출됩니다. 네트워크 객체가 초기화된 후 호출되며, 네트워크 속성과 RPCs를 사용할 수 있게 됩니다. Unity의 `Start()` 대신 사용하세요. |
Despawned(NetworkRunner runner, bool hasState) | 네트워크 객체가 제거되기 전에 호출됩니다. Unity의 `OnDestroy()` 대신 사용하세요. --- `NetworkRunner runner`: 이 네트워크 객체가 속해 있던 `NetworkRunner`입니다. `bool hasState`: 행동의 상태가 여전히 접근 가능한지 여부입니다. |
Render() | 시뮬레이션 후 프레임 렌더링 콜백. 모든 시뮬레이션 단계(`FixedUpdateNetwork`)가 끝난 후 실행됩니다. Unity의 `Update()` 대신 사용하세요. |
FixedUpdateNetwork() (시뮬레이션)
FixedUpdateNetwork()
는 사용자 정의 시뮬레이션 코드가 구현되는 곳입니다. 여기에는 플레이어 입력을 사용하여 현재 상태를 변경하는 코드가 추가됩니다. 만약 NetworkObject.IsInSimulation
이 true
라면, FixedUpdateNetwork()
는 해당 객체의 모든 NetworkBehaviour
에서 매 틱마다 호출됩니다. 모든 FixedUpdateNetwork()
메서드가 호출된 후, 모든 NetworkBehaviour
의 결과 상태는 캡처되어 해당 틱의 객체 스냅샷이 됩니다.
이 샘플 코드는 기본적인 체력 상태 스크립트를 보여줍니다. Health
는 상태를 정의하는 네트워크 속성이며, FixedUpdateNetwork()
의 코드는 그 상태에 대한 시뮬레이션을 구성합니다.
C#
using Fusion;
public class Health : NetworkBehaviour
{
// NetworkInput is collected elsewhere and is not covered by this section.
public struct MyNetworkInput : INetworkInput
{
public bool DrinkPotion;
}
// Networked Properties represent Object State.
[Networked]
public int Health { get; set; }
// FixedUpdateNetwork() is your Simulation code.
// This is where you apply inputs to a previous Tick State,
// to produce a new Tick State result.
public override void FixedUpdateNetwork()
{
// GetInput will return true on the StateAuthority and the InputAuthority.
// Check to see if the player drank.
if (GetInput<MyNetworkInput>(out var input))
{
// If the player input indicates they drank this tick,
// then simulate drinking. Changes to the health value
// on the State Authority will automatically replicate.
if (input.DrinkPotion)
{
Health += 25;
}
}
}
}
Render() (보간)
Fusion은 고정된 틱 기반 네트워킹 엔진이기 때문에, 유니티의 FixedUpdate()
가 물리 엔진과 함께 작동하는 방식처럼 고정된 간격으로 시뮬레이션 결과(상태 스냅샷)를 생성합니다. 하지만, 이러한 스냅샷 결과를 매 유니티 Update()
에서 최신 스냅샷 결과를 보여주는 방식으로 렌더링 한다면, 결과는 매우 끊길 수 있습니다. 왜냐하면 스냅샷이 연속해서 여러 번 렌더링 되거나, 일부 스냅샷은 건너뛰어지면서 표시되지 않기 때문입니다. 보간은 두 개의 이전에 시뮬레이션된 스냅샷 사이를 선형 보간하여 부드러운 렌더링 결과를 생성합니다.
{% if Fusion_v2 %}
콜백 인터페이스
주요 Spawned()
, FixedUpdateNetwork()
, Render()
오버라이드 메서드 외에도 다른 특정 타이밍 이벤트에 대해 구현할 수 있는 더 구체적인 인터페이스들이 있습니다.
IAfterSpawned
IBeforeTick
IBeforeAllTicks
IAfterTick
IAfterAllTicks
IStateAuthorityChanged
IPlayerJoined
IPlayerLeft
제네릭
NetworkBehaviour
에서 파생된 제네릭 클래스를 생성할 수 있습니다. [Networked]
속성과 원격 프로시저 호출은 제네릭 기본 클래스나 그로부터 파생된 클래스에서 정의하고 구현할 수 있습니다.
C#
// 이것은 유효합니다.
class ValidGenericClass_With_NonGenericProperty<T> : NetworkBehaviour {
[Networked] public int Prop { get; set; }
}
하지만 제네릭 [Networked]
속성 타입 <T>
는 사용할 수 없습니다.
C#
// This is INVALID
class InValidGenericClass_With_GenericProperty<T> : NetworkBehaviour {
[Networked] public T Prop { get; set; }
}
Back to top