본문 바로가기
Article/CODING AND SCRIPTS

Roblox Client-Server Model

by Roblox_개발자 2021. 4. 10.

로블록스는 멀티플레이 게임을 위한 기본 프레임워크인 client-server 모델을 사용한다. 당신이 로블록스를 플레이할 때마다, 당신의 개인 컴퓨터, 모바일, 테블릿 또는 콘솔은 client가 된다. 다른 모든 유저들 또한 게임 안에서 클라이언트다.

게임 속 모든 클라이언트(플레이어)들은 server라고 알려진 강력한 로블록스 컴퓨터에 연결되어 있다. 서버는 게임 매니저와 같다. 즉, 서버는 모든 플레이어가 다른 플레이어와 같은 게임 세상을 보고 경험하도록 해준다. 

 

[Client-Server Communication]

게임플레이 동안, 서버는 지속적으로 접속한 클라이언트를 업데이트한다. 예를 들어, 시간을 자정으로 바꾸는 게임 스크립트를 상상해보자. 이 스크립트는 오직 서버에서만 실행될 수 있다. 따라서 서버는 가장 먼저 낮에서 밤으로 바뀌는 것을 볼 수 있다. 이 지점에서, 서버는 모든 클라이언트들에게 시간이 변경되었다는 것을 자동적으로 알려주게 된다. 

 

클라이언트는 또한 서버와 소통할 수 있다. 이것은 전형적으로 당신이 버튼이나 키를 눌렀을 때 일어난다. 클라이언트가 서버에게 공격버튼을 눌렀다는 것을 알려주면 서버는 당신의 게임 캐릭터를 업데이트하여 게임 월드안의 모든 플레이어가 당신이 공격버튼을 눌렀다는 것을 알 수 있게 해준다. 

 

[Understanding Client and Server Scripts]

게임을 위한 스크립트를 만들때, 서버와 클라이언트 모두 아래와 같이 특정한 일들을 처리하도록 하는 것이 중요하다:

Client Code

일반적으로, 클라이언트는 플레이어의 입력을 감지하고, 입력한 플레이어에게 정보를 보여줘야 한다. 예를 들어, 플레이어 도구는 플레이어 입력에 따라 반응하고 서버에 변화를 일으킬수도 있다. 하지만 이러한 도구들은 해당 플레이어(도구를 사용한)에게 즉각적인 피드백을 주기 위해 클라이언트에서 우선적으로 처리되어야 한다. 마찬가지로, client-side menus, maps, 그리고 다른 GUIs 또한 클라이언트 코드에 의해 관리되어야 한다. 

 

클라이언트 코드는 LocalScript안에서 실행된다. 이 코드는 로컬스크립트가 아래 객체들의 자식인 경우에만 작동할 것이다:

 

Server Code

게임 서버는 게임 로직, 플레이어 데이터 저장, 점수 업데이트, part 생성 등을 담당해야 한다. 

이것에 대한 몇가지 이유가 있다. 

  • 만약 스크립트의 코드가 게임 월드(예를 들어, part 생성/제거)를 변화시킨다면, 서버는 모든 클라이언트들이 이러한 변화를 볼 수 있도록 한다.
  • 플레이어의 체력이나 점수가 서버에 의해 컨트롤된다면, 해커가 이러한 변수들을 변화시킬 수 없다.

 

서버 코드는 Script 안에서 실행된다. 서버 코드는 스크립트가 오직 아래 객체의 자식일 경우에만 작동할 것이다.

 

[Remote Functions/Events]

서버는 많은 일들을 자동적으로 처리한다. 하지만 때때로 당신은 서버에게 특정한 명령을 전달할 필요가 있다. 서버로 명령을 전달하는 것은 ScriptsLocalScripts 간에 서로 통신하기 위해 사용되는 객체인 remote functions and events를 통해 수행할 수 있다. 

 

Server-side validation

RemoteEventsRemoteFunctionsclient-server 통신을 위한 최고의 옵션이다. 하지만 그들이 통신하는 채널이 안전하다는 보장은 없다. 영리한 해커가 remote event를 속일 수도 있고, remote event를 통해 전달되는 값들을 바꿀 수도 있다. 이러한 이유들 때문에, 당신은 기본적인 server-side validation을 사용하여 수신 요청이 합법적인지 확인해야 한다. (server-side validation에 대해서 더 알아봐야 함)

상점 시스템을 가진 게임을 생각해보자. 플레이어가 아이템 구매를 원할때, 그들은 클라이언트 측의 인터페이스와 상호작용할 것이다. (예를 들어, Buy 버튼과 같은 ScreenGui) 버튼을 누르면, 클라이언트는 서버로 remote event를 보내고 구입을 요청할 것이다. 하지만 서버는 요청을 보낸 플레이어가 아이템을 사기 위한 충분한 돈이 있는지 점검하는 것이 중요하다.

 

[Exceptions]

서버의 권한이 필요 없이 즉시 복제되는 클라이언트 작업들이 있다. 이러한 것들은 보통 플레이어가 지금 당장 봐야하는 것들과 연관이 되어 있다. 

Object Exception
Humanoid Humanoid.JumpHumanoid.Sit 속성들은 클라이언트에서 서버로 즉시 복제된다. 오직 로컬 플레이어의 Humanoid 객체에서만 작동한다. LocalScript가 다른 플레이어의 Humanoid 업데이트를 시도하면 명령이 무시돤다.
Sound Sound.TimePosition  Sound.Playing 속성들은 클라이언트에서 서버로 복제된다. 클라이언트가 음악을 재생하다면, 다른 클라이언트들한테도 그 음악이 재생될 것이다. 더 자세한 내용은 Sound 문서를 보자.
AnimationTrack 클라이언트가  AnimationTrack에서 AnimationTrack:Play() 또는 AnimationTrack:Stop()을 실행한다면, 애니메이션 실행되고 서버로 복제된다.
BasePart part 속성은 기술적으로 복제되지 않지만 몇가지 예외가 있다. part가 클라이언트에 의해 생성되거나, 클라이언트가 part에 물리를 가한다면, 해당 결과가 서버로 복제된다. 
ClickDetector 대부분의 ClickDetector 이벤트는 클라이언트와 서버 양쪽에서 모두 실행된다. MouseClick, MouseHoverEnter, MouseHoverLeave, RightMouseClick 과 같은 입력 이벤트들도 마찬가지다.

참고링크

developer.roblox.com/en-us/articles/Roblox-Client-Server-Model

 

Roblox Client-Server Model

This Platform uses cookies to offer you a better experience, to personalize content, to provide social media features and to analyse the traffic on our site. For further information, including information on how to prevent or manage the use of cookies on t

developer.roblox.com

 

추가로 공부해야 할 사항

Server-side validation - 보안과 관련된 것 같음

'Article > CODING AND SCRIPTS' 카테고리의 다른 글

Understanding CFrames  (0) 2021.04.10
BodyPosition  (0) 2021.04.06
BodyMovers  (0) 2021.04.06
Basic String Patterns (정규식)  (0) 2021.04.06
Argument와 Parameter  (0) 2021.04.06

댓글