게임에서는 2가지의 통신 프로토콜을 많이 사용한다.
단방향 통신 : 클라이언트가 서버에 요청을 했을 때 응답을 주는 것. Http, Https → 웹 통신
양방향 통신 : 클라이언트와 서버가 서로 연결을 시켜놓고 필요에 따라 서로 정보를 교환하는 것. TCP / UDP → 소켓 통신
게임에서 실시간으로 서버와 통신하여 내가 새롭게 갱신하지 않아도 실시간으로 게임 진행 상황이 갱신되어 최신화될 때 사용한다.
ex) 롤을 할 때, 나와 상대편이 있다고 가정하자. 이 때, 단방향 통신일 경우 상대편이 아무리 움직여도 내가 입력을 하여 최신화하지 않으면 동기화가 되지 않아 상대편의 움직임을 확인할 수 없게 될 것이다. 하지만 양방향 통신일 경우 내가 따로 입력하여 갱신하지 않아도 서버가 계속해서 동기화를 시켜주기 때문에 상대방의 움직임을 확인할 수 있게 된다.
웹 통신 시 중요한 것
클라이언트 PC와 서버 PC는 구동되는 언어가 다를 수도 있다. 따라서 서버와 클라이언트 간 통신에서는 모든 언어에서 사용하는 string을 사용하여 통신을 하게 되는데, 이를 Json이라 한다. 이 때, 실제로 string을 보내는 것이 아니라 바이트로 변경해서 통신을 하게 되는 데, 이를 "직렬화"라고 한다. 유니티에서는 public만 직렬화를 시켜줄 수 있으며, private을 직렬화 시킬 경우 SerializeField를 사용해야 한다.
API Server를 사용하여 통신을 할 수 있다.
이 때 서버 주소로 Post, Get, Put, Delete 타입으로 쿼리?를 날릴 수 있다.
동기와 비동기
동기 : 예를 들어서 아래와 같은 코드가 있다고 생각해보자.
void Start()
{
...
서버요청();
}
이 때, 서버요청()이라는 함수가 서버 요청을 하기 위하서 실행 시간이 2 ~ 3초 정도 된다고 가정을 해보자.
그러면 해당 서버요청()이 완료되지 않으면 다른 코드들이 실행이 되지 않을 것이다. 서버는 위에서 아래로 순서대로 실행되기 때문이다. 따라서 서버요청이 진행되는 동안 프로그램이 멈춰있는 것처럼 보일 것이다. 이를 동기라고 한다.
비동기 : 위의 경우와 반대로 서버요청()이 실행되는 동안 다른 코드들이 실행되도록 만들어줄 수 있는데, 이를 비동기라고 한다.
비동기의 간단한 구현은 코루틴을 활용하여 구현할 수 있다. 하지만 코루틴이 정말로 비동기인 것은 아니기 때문에 유의해야 한다고 한다.