내일배움캠프/TIL

Netcode - NetworkObject, NetworkBehaviour

서보훈 2024. 12. 3. 19:13

NetworkObject 

  • 서버를 통해 작동해야하는 오브젝트에 붙여주는 컴포넌트
  • 호스트측에서 Instantiate 를 한 뒤, Spawn을 해서 클라이언트측에서 해당 오브젝트가 생성됨

  • 클라이언트측에서는 오브젝트를 생성, Spawn 할 권리가 없음
  • Spawn(false) 를 할 경우, DontDestroyOnLoad 가 붙은 오브젝트로 생성됨(기본값이 true, 씬을 넘어가면 파괴됨)
  • 호스트측에서 오브젝트를 생성하고, SpawnWithOwnerShip() 을 사용하여 입력한 클라이언트 ID 의 소유로 생성해 줄 수 있다
  • Spawn시 유니티 생명주기중 Awake 이후에 스폰된다, 따라서 Awake를 사용할 수 없다

NetworkBehaviour

  • NetworkManager 와 별도로 IsHost, IsClient 등의 플래그 변수를 저장하고 있다.
  • 스폰되기전에는 해당 플래그변수들이 모두 false인 상태이다
  • 스폰이 되면IsServer, IsHost, IsClient 등의 정보를 NetworkManager로부터 가져오게된다.
  • Rpc 를 여기에서 사용하게된다
  • ClientRpc를 사용할때, 스폰이되어있지 않으면 자신이 서버인지 알 수 없기때문에 작동하지 않는다(IsServer 기본값 false)
  • Rpc 내에서 다른 함수를 호출할 수 있다....정확한건 좀 더 테스트를 해야할듯 하지만

어쨋든 작동한다!


Netcode를 통해 멀티플레이 구현시 주의해야하는점

  • 오브젝트의 생성은 호스트에서만 진행한다. 클라이언트에서 생성을 원할경우 ServerRpc를 통해서 생성을 요청하자
  • 추가로 생성되는 NetworkObject 들은 프리팹이 NetworkManager에 등록되어있어야 한다. 등록이 되어있지 않을경우 호스트에서 Spawn 메서드를 사용해도 클라이언트들에서 그 오브젝트가 생성되지 않는다.

스크립터블 오브젝트에 프리팹을 등록하게 되어있다.

 


Rpc

ServerRpc

  • 클라이언트로부터 서버로 전달
  • 클라이언트도 사용이 가능하다

ClientRpc

  • 서버로부터 클라이언트로 전달
  • 기본적으로 연결된 모든 클라이언트에게 내용을 전달한다.
  • ClientRpcParams 를 매개변수로 사용하여 특정 클라이언트에게만 내용을 전달하는것이 가능하다 (이때, 전달할 클라이언트의 ID를 사용해야함)
  • 서버에서만 호출이 가능하다.