* 로블록스 클라이언트 서버 모델

 

- 로블록스 게임 접속

 

여러 기기에서 게임에 시작할 때 로블록스 컴퓨터에 접속하게 된다. 기기는 클라이언트 로블록스 컴퓨터는 서버다. 

 

 

- 서버 => 클라이언트

 

게임 플레이하는 동안 서버는 지속적으로 클라이언트를 업데이트 한다. 

예를 들어 서버용 스크립트인 Script가 시간을 바꾸면 서버는 클라이언트에게 통보해준다.  

 

 

- 클라이언트 => 서버

 

클라이언트에서 입력이나 제어(채팅 등)가 발생했을 때 클라이언트는 서버에게 업데이트 요청을 보내고 서버는 업데이트를 수행하고 모든 플레이어에게 통보해준다.

 

@ 예시1 : 이동 입력 처리

 

클라이언트에서 입력을 처리하는 과정은 다음과 같다.

  • 게임을 시작하면 로블록스 플레이어 스크립트에는 PlayerModule이라는 것이 생성된다.
  • PlayerModule 내부에 ControlModule이 있고 이 모듈에서 입력 처리도 담당한다.
  • ControlModule 내부에는 Keyboard가 있는데 Keyboard에서 입력을 받아서 MoveVector를 계산하여 보관해둔다.
  • ControlModule의 OnRenderStepped 함수에서 Keyboard에서 미리 계산해 두었던 MoveVector를 사용하여 LocalPlayer의 Move함수를 호출한다.
  • Player.Move는 코드가 가려져있지만 아마 서버에게 MoveVector로 시뮬레이션을 요청하는 코드가 들어가 있을 것이다. 

 

 

@ 예시2 : 채팅

 

  • 게임을 시작하면 로블록스 플레이어 스크립트에는 ChatScript라는 것이 생성된다.
  • ChatScript 내부에 ChatMain가 있고 ChatMain은 채팅 바가 포커스를 잃을 때 chatBarFocusLost라는 함수로 바인딩하여 처리하고 있다.
  • 채팅 바가 포커스를 잃을 때 엔터키가 눌러진 상황이라면 채팅 바에 있는 메시지를 가공한다.
  • 가공된 메시지는 MessageSender에서 MessageSender의 SendMessage를 호출한다.
  • SendMessage에서 ReplicatedStorage에 존재하는 SayMessageRequest 원격 이벤트(RemoteEvent(RPC와 비슷))를 통해서 메시지와 채널을 넣어서 서버로 요청한다.
  • SayMessageRequest 원격 이벤트를 바인딩하고 있는 서버는 해당 정보를 기반으로 채팅을 처리해준다.

 

 

- 클라이언트 코드와 서버 코드 작성

 

@ 클라이언트

클라이언트에서는 플레이어 입력을 추적해야하고, 정보를 특정 플레이어(본인 LocalPlayer)에게 Gui를 통해 보여줘야 한다. 클라이언트 코드는 LocalScript에서 수행된다. 당연히 서버와 관련된 ServerScriptService와 같은 곳에는 LocalScript를 수행할 수 없다.

 

@ 서버

서버에서는 게임 로직, 데이터 저장(DB), 각종 업데이트, 생성 등을 수행하고 모든 클라이언트에게 통보해야한다. 서버 코드는 Script에서 수행된다. 클라이언트와 관련된 PlayerGui와 같은 곳에서 사용할 수 없다.

 

 

- RemoteFunction, RemoteEvent

 

RemoteFunction, RemoteEvent는 각 서버와 클라이언트에서 클라이언트와 서버로 통신하기 위한 수단이다. 서버와 클라이언트에서 모두 접근할 수 있는 ReplicatedStorage에 넣고 해당 이벤트나 함수가 들어왔을 때 어떻게 처리할 것인지 적절하게 함수를 바인딩하면 된다. 다만 클라이언트에서 서버로 올라온 이벤트나 함수는 믿을 수 없기 때문에 한번 검증 후 사용한다. 예를 들어 플레이어가 스킬 사용을 서버에게 요청하면 해당 플레이어가 스킬을 사용할 수 있는 상태(플레이어 상태, 착용한 도구 상태, 소모 자원 상태 등)인지 서버에 있는 데이터 기반으로 검증 후 허가 해야한다.

 

 

 

 

+ Recent posts