Details
유니티 엔진에서 사용되는 미드레벨 네트워킹 라이브러리이다. => 유니티 넷코드 공식 레포지토리
유니티 넷코드를 활용하면 비교적 네트워크 지식이 전문가들보다 떨어지더라도 네트워크 관련 기술을 라이브러리로 부터 가져와 쓸 수 있고 어려운 실시간 네트워크 통신 기술 구연들을 조금 더 쉽게 해볼 수 있다.
넷코드에서 사용되는 대표적인 기능들 소개
Can be invoked by the server to be executed on a client.
서버가 자신에게 연결된 클라이언트들에게 원격 함수 호출을 해야할 때 사용하는 Attribute.
사용을 위해선 함수위에 반드시 [ClientRpc] Attribute가 붙어 있어야 하며 함수 이름은 ClientRpc로 끝나야 한다!
클라이언트 RPC는 일반적으로 서버에서만 호출될 수 있다!!
[ClientRpc]
private void PongClientRpc(int somenumber, string sometext) { /* ... */ }Can be invoked by a client to be executed on the server.
클라이언트가 서버에 있는 함수 호출을 요청 혹은 작업을 요청할 때 사용하는 Attribute.
사용을 위해선 함수위에 반드시 [ServerRpc] Attribute가 붙어 있어야 하며 함수 이름은 ServerRpc로 끝나야 한다!
서버 RPC는 일반적으로 클라이언트나 호스트에서만 호출될 수 있다!!
[ServerRpc]
private void PingServerRpc(int somenumber, string sometext) { /* ... */ }다른 접속 클라이언트들과 주기적으로 동기화 되는 변수 형식
// everyone can read, only owner can write
public NetworkVariable<Vector3> NetPosition = new NetworkVariable<Vector3>(
default,
NetworkVariableBase.DefaultReadPerm, // Everyone
NetworkVariableWritePermission.Owner
);주기적으로 다른 클라이언트들과 값을 계속 동기화해야 하는 변수가 있다면 위의 NetworkVariable 를 사용하면 된다.
완전히 실시간으로 동기화 되는 것도 아니며 동기화 주기가 일정한 것도 아니다. 다만 계속 값을 교환할 뿐이다.
NetworkVariableBase. 에서 읽기 권한을 NetworkVariableWritePermission. 에서 쓰기 권한을 설정할 수 있다.
RPC 와 Network Variables 의 동작 차이
using Unity.Netcode;
public class TestNetworkScript : NetworkBehaviour
{
/// <summary>
/// This is network variable
/// </summary>
public NetworkVariable<bool> IsOpen { get; } = new NetworkVariable<bool>();
// And RPCs
[ServerRpc]
private void TestServerRpc()
{
if(IsServer) TestClientRpc();
}
[ClientRpc]
private void TestClientRpc()
{
// ~
}
}Network Variables 는 주기적으로 값을 동기화 하기 때문에 늦게 접속한 클라이언트들도 그 값을 받아 볼 수 있다!
RPCs 는 호출하는 타이밍에서만 명령이 떨어지기에 늦게 접속하는 플레이어는 그 값이나 명령을 받아볼 수 없다!
즉 요약하자면 명령이나 값 전달을 원하는 시점에 호출 했을 때 Latency의 시간 이후 바로 클라이언트가 그 정보를 받아 보길 원한다면 RPCs를 사용하는 것이 좋다.
주기적으로 값을 동기화 해야 되고 늦게 접속한 플레이어도 값을 봐야 한다면 Network Variable을 사용하는 것이 더 적합하다.
이번 발표를 진행하며 참조한 사이트






