본문 바로가기

로블록스 개발 기초

로블록스 코딩 - UI로 점수 보여주기(1/3)

앞선 튜토리얼에서 게임 아바타가 떨어지면 죽는 용암서서히 사라지는 블럭에 관련된 내용과 코드에 대해서 살펴보았다. 서서히 사라지는 블럭 위를 뛰어 다니면서 초당 1점을 얻는 게임을 만들어 보자. 이 게임의 점수를 화면에 UI로 보여주는 과정을 살펴보겠다.

맵 구성

앞서 만들어 놓은 떨어지는 죽는 용암블럭을 좍 깔고 그 위로 서서히 사라지는 블럭(Fading Platform)들을 바둑판처럼 배치한다. Fading Platform은 복제(Duplicate, Ctrl+D)하여 여러개를 준비한다. 플레이어는 Fading Platform 위를 건너면서 점수를 얻고 최대한 많은 점수를 획득한 유저가 이기는 게임이다. 바둑판같은 Fading Platform 옆에는 스폰 포인트를 만들어서 플레이어가 점프해서 넘어가면서부터 게임이 시작되게 만들자

오브젝트의 복제는 간편하다. 다만, 각 FadingPlatform의 스크립트들도 다 같이 복제가 된다. 그 말은 똑같은 기능을 하는 스크립트들이 오브젝트 수만큼 존재한다는 말이다. 리소스의 낭비도 문제지만 만일, 스크립트에 버그가 발생하여 수정을 해야한다고 가정해보자. 하나만 고쳐서는 안되고 FadingPlatform의 수만큼의 스크립트를 다 고쳐줘야한다. 결론적으로 이런 방식으로 오브젝트를 복제해서는 안된다. 안되지만, 여기는 튜토리얼이므로 그냥 그렇게 사용한다. 중급 튜토리얼에서 여러 오브젝트에 사용되는 스크립트를 어떻게 관리할 지에 관련된 튜토리얼이 있다. 참고하자.

게임 점수

플레이어의 상태를 보여주기 위해서 로블록스 게임엔진에서 자체적으로 제공하는 리더보드(Leaderboard)라는 것이 있다. 이 리더보드는 아래 이미지처럼 우상단에 아래의 이미지와 같은 모습으로 플레이어의 어떤 값을 보여주는 UI이다.

추후에 여러가지로 멋지게 UI를 바꿀 수 있는 법을 알려주겠지만, 이런 방식의 리더보드 형태는 로블록스에서 직접 제공해주고 있고, 그래서 개발자 입장에서는 바로 사용할 수 있는 가장 심플한 방법이 되겠다. 

지금껏 게임 스크립트들은 그냥 게임 오브젝트에 추가시켜서 게임 오브젝트가 로드될 때 실행되는 형태였었다. 하지만, 플레이어 점수같은 플레이어의 상태를 변경하는 소스 코드는 서버에서 실행되는 것이 가장 좋다.

왜 서버에서 실행되야 좋을까? 

여러 플레이어들과 함께 즐기는 게임이 기본인 로블록스 게임에서는 기본적으로 서버와 여러 클라이언트와의 긴밀하게 연결되어 있다. 점수와 같이 게임에 핵심적인 요소는 서버에서 변경하고 각 플레이어들에게 보여주는 구조가 심플하고 이해가 빠르며 안정적일 것이다. 

예를 들어 반대로 클라이언트에서 점수를 변경한다고 가정해보자. 로블록스는 서버-클라이언트 모델을 사용하므로, 클라이언트가 점수를 +1 시킨다고 가정하면,이 점수를 다른 플레이어들에게도 해당 플레이어가 점수+1 되었다는 것을 알리기 위해서 서버에 전달하고, 서버는 다시 각 클라이언트들에게 알려야 할 것이다. 쓸데없는 리소스도 들어가고 보안에도  의문이 생길 것이다.

그래서 클라이언트에서는 점수를 획득하는 행위를 했으면 서버에게 그 행위를 했다는 이벤트를 보내고 그 이벤트를 받아서 서버가 직접 해당 플레이어의 점수를 +1 해주는 구조를 사용하는 것이다.

 

하지만, 그 내용은 중급 과정의 내용이다. 여기서는 내용이 너무 길어지므로 그런 이벤트 보내는 방법이나 내용에 대해서는 패쓰하고, 서버에서 1초 간격으로 각 유저들의 점수를 +1 해주는 방법으로 사용한다. 

게임 시작하고 나면 자동으로 1초마다 각 플레이어들의 점수를 계속 올려준다. 게임이 시작될 때 자동으로 시작될 서버 스크립트는 ServerScriptService에 자식으로 추가하면 된다. 탐색기에서 ServerScriptService를 찾아서 스크립트를 추가하고 SetupPoints라고 이름을 바꾸자.

플레이어의 이벤트를 기다리는 서버

로블록스에서 "서비스(Service)"는 다양하고 유용한 기능을 수행하는 객체이다. 이 객체를 통해 여러가지를 할 수 있는데 여기서 우리는 Players라는 서비스를 통해 각 플레이어들이 게임에 입장했다는 이벤트를 받는 기능을 사용한다.

Players서비스에서는 플레이어 입장시에 PlayerAdded라는 이벤트를 발생시킨다. 이 이벤트에 onPlayerAdded라는 함수를 연결하여 해당 플레이어의 점수를 초기화하는 기능을 코딩하자.

로블록스에서 서비스는 어디에서든 game 오브젝트의 GetService() 함수를 사용하여 얻어 낼 수 있다. 싱글레톤 패톤처럼 어디서든 원하는 곳에서 사용한다. game 오브젝트는 게임에 필요한 거의 모든 것들을 포함하고 있으므로 자주 접하게 될 것이다. 

local Players = game:GetService("Players")
 
local function onPlayerAdded(player)
	
end
	
Players.PlayerAdded:Connect(onPlayerAdded)

leaderstats 폴더 만들기

리더보드에 플레이어의 점수를 보여주기 위해서 할 일은 player 객체에 새로운 Folder를 만들어서 추가해주는 것이다. Folder는 로블록스 객체들을 담아서 모아주는 컨테이너 역할을 한다. 우선, player 객체에 leaderstats라는 이름의 Folder를 추가하고 그 폴더 안에 우리가 넣고 싶은 점수를 IntValue 형태로 집어 넣으면 된다.

 

우선, "Folder"를 만들어서 이름을 leaderstats로 바꾼다. 그리고 player 의 자식으로 추가한다.

local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
end
앞선 튜토리얼들에서 설명하였지만, 여기서 player 파라메터는 서버입장에서 Players서비스의 이벤트 PlayerAdded를 통해 얻어진 새로 입장한 플레이어의 객체가 된다. 즉, PlayerAdded 이벤트를 발생시킨 플레이어 오브젝트가 onPlayerAdded() 함수의 파라메터로 보내지게 되는 것이다.

☆여기서 폴더의 이름은 정확하게 leaderstats 만 사용해야 한다. 지금 사용하는 리더보드는 로블록스가 자체적으로 제공하는 것이다. 우리가 해야할 일은 leaderstats 폴더에 값을 넣어주는 일이다. 즉, leaderstats 라는 폴더에 값이 있으면 로블록스 게임엔진이 알아서 꺼내고 리더보드에 사용하 것이 룰인 것이다. 로블록스 엔진이 알아서 처리하게끔 룰은 지켜주자.

 

다음글

2021.04.19 - [로블록스 개발 기초] - 로블록스 코딩 - UI로 점수 보여주기(2/3)