유니티를 사용하여 온라인 서버를 구현하는 방법은 크게 다음과 같습니다.
- 서버 호스팅
- 서버 프로그래밍
- 클라이언트 프로그래밍
- 네트워크 통신
이 중 서버 및 클라이언트 프로그래밍에 대해 알아보겠습니다.
아래는 유니티 서버 구현 ② 서버 및 클라이언트 프로그래밍 하는 구체적인 방법 입니다.
유니티로 온라인 게임을 만들 때 서버 프로그래밍을 하기 위해서는 서버 소프트웨어를 선택하고
해당 소프트웨어에서 제공하는 API를 이용하여 서버 프로그래밍을 해야 합니다.
대표적인 서버 소프트웨어로는 Unity Networking, Photon, Mirror 등이 있습니다.
이 중에서 Unity Networking을 예시로 들어서 서버 프로그래밍 방법을 설명하겠습니다.
1. Unity Networking 패키지 설치
Unity Networking 패키지를 다운로드하고 설치해야 합니다.
유니티에서는 UNET이라는 네트워크 모듈을 제공합니다.
Unity 2019 이상에서는 Unity Networking 패키지가 기본으로 포함되어 있습니다.
이전 버전을 사용하는 경우 패키지 매니저에서 Unity Networking 패키지를 설치해야 합니다.
* 서버 프로그래밍 언어 선택
서버 프로그래밍 언어로는 Java, C#, Python, Node.js 등 다양한 언어를 사용할 수 있습니다.
유니티 엔진은 C# 언어를 사용하므로 C#을 이용해서 서버 프로그래밍을 하면 유니티와 호환성이 높아져 편리합니다.
2. 서버 구현
Unity Networking은 서버-클라이언트 모델을 기반으로 합니다.
서버는 클라이언트의 연결 요청을 받아들이고 게임의 진행 상태를 관리합니다.
클라이언트는 서버와 연결되어 게임을 진행하며,
서버에게 게임의 상태를 보내고 서버로부터 다른 클라이언트의 상태를 받습니다.
서버 구현을 위해서는 다음과 같은 작업이 필요합니다.
- 서버 설정: Unity Networking 패키지를 이용하여 서버를 구현할 때는 서버 설정을 먼저 해야 합니다.
서버 설정은 NetworkManager 컴포넌트에서 가능합니다.
- 클라이언트 연결: 클라이언트가 서버에 연결하기 위해서는
NetworkManager의 StartServer()나 StartClient() 함수를 호출해야 합니다.
- 네트워크 메시지 처리: 서버와 클라이언트 간에 데이터를 주고받기 위해서는 네트워크 메시지를 처리해야 합니다.
이를 위해서는 NetworkBehaviour를 상속받은 스크립트를 작성하고,
이 스크립트에서 Cmd 함수와 Rpc 함수를 구현해야 합니다.
Cmd 함수는 클라이언트에서 호출되어 서버로 데이터를 전달하는 함수이고,
Rpc 함수는 서버에서 호출되어 클라이언트로 데이터를 전달하는 함수입니다.
3. 클라이언트 구현
클라이언트 구현을 위해서는 다음과 같은 작업이 필요합니다.
UNET을 이용하여 클라이언트를 구현하고, 서버에 연결한 후 네트워크 메시지를 처리하는 방법은 다음과 같습니다.
1) NetworkManager 오브젝트 생성
UNET을 사용하여 클라이언트를 구현하려면 NetworkManager 오브젝트를 생성해야 합니다.
NetworkManager는 네트워크 게임에서 사용되는 매니저 오브젝트로써,
네트워크 설정과 연결, 게임 오브젝트를 네트워크로 동기화하는 역할을 수행합니다.
2) StartClient() 함수 호출
NetworkManager의 StartClient() 함수를 호출하여 서버에 연결합니다.
StartClient() 함수는 서버의 IP 주소와 포트를 지정하고, 연결에 성공했을 때 실행될 콜백 함수를 지정할 수 있습니다.
3) 서버와 클라이언트 간의 메시지 전송
서버와 클라이언트 간에는 메시지를 주고받을 수 있습니다.
클라이언트에서는 서버로부터 받은 메시지를 처리하는 코드를 작성해야 합니다.
이를 위해 다음과 같은 네트워크 메시지 처리 함수를 작성할 수 있습니다.
- OnClientConnect(): 서버에 연결되었을 때 실행됩니다.
- OnClientDisconnect(): 서버와의 연결이 끊어졌을 때 실행됩니다.
- OnClientError(): 네트워크 오류가 발생했을 때 실행됩니다.
- OnClientNotReady(): 클라이언트가 아직 준비되지 않았을 때 실행됩니다.
- OnClientSceneChanged(): 씬이 변경되었을 때 실행됩니다.
4) 네트워크 메시지 처리 함수 작성
서버로부터 받은 메시지를 처리하기 위해, NetworkBehaviour 클래스를 상속받는 스크립트를 작성합니다.
NetworkBehaviour는 네트워크 메시지를 처리하기 위한 함수들을 제공합니다.
이 스크립트에서는 다음과 같은 함수를 작성합니다.
- OnStartClient(): 클라이언트가 시작될 때 실행됩니다.
- OnStopClient(): 클라이언트가 종료될 때 실행됩니다.
- OnServerMessage(): 서버로부터 받은 메시지를 처리합니다.
- OnClientMessage(): 클라이언트로부터 받은 메시지를 처리합니다.
5) 네트워크 메시지 전송
클라이언트에서 서버로 메시지를 전송하기 위해, NetworkClient.Send() 함수를 사용합니다.
이 함수는 서버에서 지정한 메시지 타입과 메시지 데이터를 전송할 수 있습니다.
서버는 이 메시지를 받아서 처리하게 됩니다.
UNET을 이용하여 클라이언트를 구현하는 과정은 다소 복잡합니다.
따라서, UNET을 사용하지 않고 직접 소켓 프로그래밍을 구현할 수도 있습니다.
이 경우에는 C#에서 제공하는 System.Net.Sockets 네임스페이스를 이용하여 클라이언트를 구현할 수 있습니다.
이 방법은 UNET보다 복잡하지만, 더욱 세밀한 컨트롤이 가능합니다.
'유니티 개발일지' 카테고리의 다른 글
유니티 게임 개발 : 유저의 데이터를 자동으로 구글 클라우드에 저장하고 불러오는 방법 (0) | 2023.09.26 |
---|---|
유니티 데이터베이스 저장하기 MySQL (0) | 2023.05.01 |
유니티 서버 구현 ① 서버 호스팅 (0) | 2023.05.01 |
유니티 온라인 서버 구현하기 (0) | 2023.05.01 |
유니티 게임 개발: 구글 아이디로 회원가입 및 로그인하는 코드 (1) | 2023.04.28 |
댓글