유니티 NetCode : NetworkBehaviour와 MonoBehaviour
NetworkBehaviour는 MonoBehaviour를 상속한 멀티플레이어용 확장 클래스입니다. 따라서 Update, Start, 코루틴 같은 기존 기능을 그대로 사용하면서 네트워크 동기화 기능을 추가로 사용할 수 있습니다.
| 구분 | MonoBehaviour | NetworkBehaviour |
|---|---|---|
| 주 용도 | 일반적인 로컬 게임 로직 | 네트워크로 동기화되는 게임 로직 |
| 상속 관계 | 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, 카메라, 이펙트, 로컬 입력 | 플레이어, 적, 체력, 네트워크 상호작용 |
간단한 비교 예시는 다음과 같습니다.
// 일반 로컬 컴포넌트
public class LocalPlayer : MonoBehaviour
{
private void Start()
{
Debug.Log("로컬 오브젝트 시작");
}
}
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()을 사용하는 편이 안전합니다.



