유니티 네트워크 (Unity NetworkManager Component)


- 서버없이 클라이언트간 동기화(원격액션)를 통한 네트워크 통신방식을 사용
- 프로젝트를 생성한뒤 동기화에 사용할 프리팹(Network Identity)을 생성한다.
- 해당 프로젝트를 복사한뒤 하나는 Server 다른 하나는 Client로 사용
(프리팹을 복사하지 않고 프로젝트를 통째로 복사하는 이유는 동기화에 Network Identity 프리팹의 에셋 아이디가 같아야 하기 때문)

1. Server, Client
- Hierarchy에 빈오브젝트 생성해서 Network Manager 컴포넌트를 추가한뒤 Player prefab을 설정해준다.
- 인터넷 예제에서는 Network HUD를 사용하지만 여기서는 사용하지 않고 스크립트에서 Network Manager 객체 StartServer( ), StartClient( )호출하는걸로 연결준비는 끝


2. 상태 동기화 방법( NetworkBehaviour 상속)
- 클라이언트와 서버 양쪽에 같은 동기화가 지원되는 변수에 [SyncVar] 적용
- 서버  -> 클라이언트 로만 동작함


3. 원격 액션 방법( NetworkBehaviour 상속)
- 같은 이름의 함수를 클라이언트와 서버의 같은 프리팹에 만들어 놓으면 원격액션기능으로 서버에서 해당함수를 호출하면 클라이언트의 해당함수가 실행되거나 그 반대로 동작하기도 한다.

[Command] : 클라이언트 -> 서버
[ClientRpc] : 서버 -> 클라이언트 (확인안함)


Client : NetworkClient.active가 true일때 클라이언트에서 실행 (Client-only 적용)
ClientCallback : Client와 동일(경고 안나오는것만 차이)
ClientRpc : 서버에서 호출
Command : 함수는 접두사 Cmd로 시작, 클라전송 서버호출
NetworkSettings : 클래스단위로 네트워크 설정구성(채널, 전송 빈도 등)
Server : 서버에서 실행 (NetworkServer.active가 true), server-only, command기능에 대해 중복
ServerCallback
SyncEvent : event sync... 서버전송 클라호출 접두사 Event로 시작
SyncVar : 멤버변수에 넣는 특성(허용되는 유형만)
TargetRpc : 하나의 개별대상 클라이언트에서 호출



4. 제한 사항(버퍼나 채널수를 늘리는 방법을 못찾았음)
- 많은 양의 데이터 전송이 안됨 : 한번에 동기화될수 있는 byte 수는 1400 을 넘으면 에러발생
Failed to send big message of 14733 bytes. The maximum is 1400 bytes on this channel.
https://docs.unity3d.com/ScriptReference/Networking.NetworkMessage.MaxMessageSize.html

- 한번에 여러번 나누어 보내지 못함 (코루틴을 이용해서 프레임(WaitForEndOfFrame)으로 나누어서 보내도 마찬가지임 : 채널버퍼 제한 16패킷
ChannelBuffer buffer limit of 16 packets reached




관련 url:
https://docs.unity3d.com/kr/current/Manual/UNet.html
https://docs.unity3d.com/kr/current/Manual/UNetActions.html

댓글

이 블로그의 인기 게시물

유니티 텍스쳐 생성 (Unity Texture Create from bytes)

유니티 네트워크 (Unity Socket)