유니티 NetCode : NetworkBehaviour와 MonoBehaviour

심지태
∙∙조회 6

NetworkBehaviour는 MonoBehaviour를 상속한 멀티플레이어용 확장 클래스입니다. 따라서 Update, Start, 코루틴 같은 기존 기능을 그대로 사용하면서 네트워크 동기화 기능을 추가로 사용할 수 있습니다.

구분MonoBehaviourNetworkBehaviour
주 용도일반적인 로컬 게임 로직네트워크로 동기화되는 게임 로직
상속 관계Unity 컴포넌트의 기본 클래스MonoBehaviour를 상속
필요 패키지Unity 기본 제공Netcode for GameObjects 필요
NetworkObject필요 없음네트워크 기능 사용 시 필요
생명주기Awake, Start, Update, OnDestroy 등기존 생명주기 + OnNetworkSpawn, OnNetworkDespawn
변수 동기화직접 구현해야 함NetworkVariable<T> 사용 가능
원격 함수 호출기본 제공하지 않음[Rpc]를 통해 서버·클라이언트 간 호출 가능
서버/클라이언트 구분직접 관리해야 함IsServer, IsClient, IsHost 제공
소유권 확인개념 없음IsOwner, OwnerClientId 제공
오브젝트 생성Instantiate()서버에서 NetworkObject.Spawn() 필요
실행 범위현재 실행 중인 게임 인스턴스서버와 연결된 클라이언트에서 각각 실행
적합한 예UI, 카메라, 이펙트, 로컬 입력플레이어, 적, 체력, 네트워크 상호작용

간단한 비교 예시는 다음과 같습니다.

csharp
// 일반 로컬 컴포넌트
public class LocalPlayer : MonoBehaviour
{
    private void Start()
    {
        Debug.Log("로컬 오브젝트 시작");
    }
}
csharp
using Unity.Netcode;

public class NetworkPlayer : NetworkBehaviour
{
    public NetworkVariable<int> Health = new(100);

    public override void OnNetworkSpawn()
    {
        if (IsServer)
            Debug.Log("서버에서 네트워크 플레이어 생성");

        if (IsOwner)
            Debug.Log("이 클라이언트가 소유한 플레이어");
    }
}

핵심 선택 기준은 간단합니다.

  • 네트워크 상태를 동기화하지 않는 UI·카메라·로컬 연출 → MonoBehaviour
  • 플레이어·적·체력처럼 서버와 클라이언트가 공유해야 하는 대상 → NetworkBehaviour
  • 네트워크 오브젝트의 초기화는 Start()보다 OnNetworkSpawn()을 사용하는 편이 안전합니다.