This document is about: FUSION 2
SWITCH TO

네트워크 동작

개요

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.IsInSimulationtrue라면, 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