* 로블록스 클라이언트 서버 모델
- 로블록스 게임 접속
여러 기기에서 게임에 시작할 때 로블록스 컴퓨터에 접속하게 된다. 기기는 클라이언트 로블록스 컴퓨터는 서버다.
- 서버 => 클라이언트
게임 플레이하는 동안 서버는 지속적으로 클라이언트를 업데이트 한다.
예를 들어 서버용 스크립트인 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에 넣고 해당 이벤트나 함수가 들어왔을 때 어떻게 처리할 것인지 적절하게 함수를 바인딩하면 된다. 다만 클라이언트에서 서버로 올라온 이벤트나 함수는 믿을 수 없기 때문에 한번 검증 후 사용한다. 예를 들어 플레이어가 스킬 사용을 서버에게 요청하면 해당 플레이어가 스킬을 사용할 수 있는 상태(플레이어 상태, 착용한 도구 상태, 소모 자원 상태 등)인지 서버에 있는 데이터 기반으로 검증 후 허가 해야한다.
'Lua in Roblox' 카테고리의 다른 글
| [Lua / Roblox] 미니 배틀 로얄 게임 #9 : Rojo로 포팅 / 버전 관리 (0) | 2022.07.28 |
|---|---|
| [Lua / Roblox] 미니 배틀 로얄 게임 #8 : 중간 완료된 작업(기록용) (0) | 2022.07.21 |
| [Lua / Roblox] 미니 배틀 로얄 게임 #7 : 데미지 로직 수정 (0) | 2022.07.18 |
| [Lua / Roblox] 미니 배틀 로얄 게임 #6 : 구조 정리, 모듈 추가 (0) | 2022.07.15 |
| [Lua / Roblox] 미니 배틀 로얄 게임 #5 : 게임 데이터 매니저 (0) | 2022.07.14 |