본문 바로가기

로블록스 개발 기초

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

IntValue 데이터형

로블록스가 제공하는 리더보드는 leaderstats 라는 폴더에 값을 집어 넣는 것으로 구현된다는 얘기는 이미 했다. 그 값이란 것은 ntValue라는 데이터형이다... 아니, 객체라고 표현해야 더 맞는 말이겠다. Int데이터형을 저장하는 객체이다. Changed 이벤트를 가지고 있어서 IntValue 객체의 값이 변경될 때마다 이벤트를 발생시켜 준다는 점이다. 아무튼, leaderstats폴더에 우리는 점수값을 넣을 것이므로 IntValue의 이름(Name)은 "Points"라고 하고 값(Value)는 0으로 하자. 이름은 리더보드 UI에 같이 표시되는 값이다. Points 말고 원하는 이름도 괜찮다... 하지만, 여기 튜토리얼의 코드에 변경이 필요하니 그냥 Points로 하고 따라가자.

local Players = game:GetService("Players")
 
local function onPlayerAdded(player)
    local leaderstats = Instance.new("Folder")
    leaderstats.Name = "leaderstats"
    leaderstats.Parent = player
 
    local points = Instance.new("IntValue")
    -- IntValue의 이름은 Points
    points.Name = "Points"
    -- IntValue의 값은 0
    points.Value = 0
    -- leaderstats 폴더의 자식으로 설정하는 것을 잊지말자.
    points.Parent = leaderstats
end
	
Players.PlayerAdded:Connect(onPlayerAdded)

 게임을 테스트해보면 화면의 오른쪽위에 Points 와 0이 보일 것이다.

점수 갱신 루프

다시 상기시키지만, 지금의 소스코드는 서버가 실행하는 내용이다. 각자의 디바이스에서 플레이를 시작하면 점수 0에서 부터 1초마다 1씩 증가하고 죽을 때까지 얻은 점수가 높은 순으로 순위가 메겨진다. 

반복문을 통해 1초마다 모든 플레이어의 점수를 갱신시켜야 한다.

앞선 튜토리얼에서 사용했던 while 반복문을 사용하고 실행 후에 wait() 함수로 1초씩 멈추게 해준다.

Players.PlayerAdded:Connect(onPlayerAdded)
 
while true do
    -- 모든 플레이어의 점수 갱신
    wait(1)
end

while 반복문은 조건문이 그냥 true이면, 게임이 실행되는 동안은 벗어나지 않고 계속 반복 실행된다.

게임안의 모든 플레이어에 접근하기

매초 서버는 게임 중인 플레이어의 점수를 모두 +1해줘야 한다. 그러기 위해서 서버는 현재 게임 진행중인 플레이어들의 정보가 필요하다. Players 서비스를 통해 플레이어들의 리스트를 받아올 수 있다.

이번엔 for문을 사용하여 Players 서비스에서 얻은 플레이어 리스트를 반복하여 보자.

while true do
    wait(1)
    local playerList = Players:GetPlayers()
    for currentPlayer = 1, #playerList  do
    
    end
end

Players 서비스에서 GetPlayers() 함수를 통해 게임내의 모든 플레이어의 리스트(playerList)를 알아낸다. playerList의 길이를 알아내기 위해서는 #을 앞에 달아서 표현한다.

for currentPlayer = 1, #playerList do, 의 의미는 currentPlayer 의 변수를 사용해서 1부터 playerList의 길이의 값이 될때까지 1만큼의 단위로 늘려서 반복 실행한다는 말이다. 1만큼의 단위는 기본이라서 위의 for문에서는 생략되었다.

점수 1씩 증가시키기

실제로 각 플레이어의 leaderstats 폴더 안의 Points 객체를 찾아서 +1을 시켜주자. 

우선 반복문을 통해 각 플레이어에 접근해야 한다. currentPlayer이라는 변수로 playerList에서 각 플레이어에 접근하려면, 괄호[]를 사용한다. lua언어에서의 인덱스는 1부터 시작한다.. lua언어의 가장 큰 특징 중 하나이다. 대부분의 언어의 리스트의 인덱스는 0부터 시작하는데 반해, lua언어에서는 1부터 시작하는 것을 기억해두자.

while true do
    wait(1)
    local playerList = Players:GetPlayers()
    for currentPlayer = 1, #playerList  do
        -- 리스트[인덱스]의 문법으로 리스트의 각 요소에 접근이 가능하다.
        local player = playerList[currentPlayer]
        local points = player.leaderstats.Points
        points.Value = points.Value + 1
    end
end

Player 객체들을 playerList에서 하나씩 꺼내서 그 안의 Points에 접근, 그 Points의 Value 에 1을 더하면 된다.

여기까지 오고 테스트를 해보자. 플레이를 시작하면 1초마다 점수가 늘어나는 것을 확인할 수 있다.

 

다음글

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