업그레이드 버튼 스크립트

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.


플레이어는 이제 코인을 수집하고 죽을 때 코인을 잃을 수 있지만, 코인은 작동하지 않으며 대부분의 게임 세계는 높게 점프할 수 없는 상태에서 액세스할 수 없습니다. 이 튜토리얼의 나머지 부분에서는 플레이어가 놀이 세계에 대한 로직을 완료하는 방법을 보여줍니다

업그레이드 버튼 생성

Roblox의 2D 인터페이스는 일반적으로 하나의 GUI 컨테이너 내에 있는 여러 개의 GUI 구성 요소로 구성됩니다. 이 경우 TextButton 을 포함한 하나의 Class.TextButton 구성 요소만 필요합니다.

GUI를 생성하려면:

  1. In the 탐색기 창에, ReplicatedStorage 에 새로운 폴더를 추가한 다음 폴더를 Instances 로 이름을 변경합니다. 1> ReplicatedStorage1> 의 모든 개체는 각 플레이어의 Roblox 클라이언트에서 액세스할 수 있습니다. 이는 GUI가 표시되는 곳입니다.
  2. ScreenGui 개체를 인스턴스 폴더에 추가합니다.
  3. 선택 ScreenGui 개체, 그리고 속성 에서,
    1. Set 이름 to JumpPurchaseGui .
    2. ResetOnSpawn 을 사용하여 플레이어가 재생성될 때 GUI가 부모로 남도록 합니다.
  4. 탐색기 창에서 텍스트 버튼을 JumpPurchaseGui 컨테이너에 삽입한 다음 텍스트 버튼을 JumpButton으로 이름을 변경하십시오.
  5. (옵션) 버튼의 모양과 위치를 구성하여 버튼을 사용자 정의합니다. 간단한 제안은 다음과 같습니다.
    • 텍스트 속성을 업그레이드 점프(5코인) 로 설정합니다.
    • 텍스트 크기 속성을 25 로 설정합니다.
    • 앵커포인트를 1, 1 로 설정하고 위치를 1, 0,1, 0 로 설정하여 버튼을 하단 오른쪽 모서리로 이동합니다.

이 튜토리얼의 나중에 버튼에 버튼을 추가하지만, 버튼이 작동하려면 버튼에 필요한 모든 논리 및 데이터를 정의해야 합니다.

점프 파워 데이터 정의

현재 PlayerData 모듈 스크립트에 대해 각 플레이어에 대해 코인 수만 저장됩니다. 플레이어 점프 파워를 저장하고 업데이트하는 방법도 동일해야 합니다. 데이터가 변경되는 함수는 PlayerData 에 대해 특정

PlayerData 모듈 스크립트를 업데이트하여 점프 파워를 저장하려면:

  1. In the 탐색기 window, open the PlayerData module script in ServerStorage .

  2. 각 플레이어의 기존 Jump 값과 함께 각 플레이어의 새 Coins 값을 초기화하는 다음 코드를 스크립트에 대체하십시오.


    local PlayerData = {}
    PlayerData.COIN_KEY_NAME = "Coins"
    PlayerData.JUMP_KEY_NAME = "Jump"
    local playerData = {
    --]]
    [userId: string] = {
    ["Coins"] = coinAmount: number,
    ["Jump"] = jumpPower: number
    }
    --}]
    }
    local DEFAULT_PLAYER_DATA = {
    [PlayerData.COIN_KEY_NAME] = 0,
    [PlayerData.JUMP_KEY_NAME] = 0,
    }
    local function getData(player)
    local data = playerData[tostring(player.UserId)] or DEFAULT_PLAYER_DATA
    playerData[tostring(player.UserId)] = data
    return data
    end
    function PlayerData.getValue(player, key)
    return getData(player)[key]
    end
    function PlayerData.updateValue(player, key, updateFunction)
    local data = getData(player)
    local oldValue = data[key]
    local newValue = updateFunction(oldValue)
    data[key] = newValue
    return newValue
    end
    return PlayerData

점프 파워 데이터 업데이트

이제 PlayerData 는 점프 힘을 추적할 수 있으므로 서버에서 로직을 구현하여 플레이어의 클라이언트 요청에서 점프 힘을 업그레이드해야 합니다.

서버와 클라이언트는 원격 이벤트를 통해 통신할 수 있습니다. 원격 이벤트는 발생한 때 생성되지 않으며 방향 통신에 적합합니다. 원격 함수는 대답을 받을 때까지 생성되지 않으며, 이는 양방향 통신을 위해 서버가 플레이어의 점프 파워를 성공적으로

점프 업그레이드를 구현하려면:

  1. In the 탐색기 창, open the 인스턴스 폴더 in ReplicatedStorage .

  2. 원격 함수를 인스턴스 폴더에 삽입한 다음 원격 함수를 IncreaseJumpPowerFunction 로 이름을 변경합니다. 모든 클라이언트와 서버가 액세스할 수 있어야 합니다. 원격 함수는 항상 1> ReplicatedStorage1>에서 만듭니다.

    Studio's Explorer window with the IncreaseJumpPowerFunction script highlighted under the Instances folder.
  3. 탐색기 창에서 스타터플레이어를 선택합니다.

  4. 속성 창에서 CharacterUseJumpPower 속성을 활성화하십시오. 기본적으로 캐릭터의 점프 파워 값은 캐릭터가 점프하는 금액을 정의하지 않으므로 이 기능을 활성화해야 합니다.

  5. 탐색기 창에서 서버스크립트서비스 에 새 스크립트를 삽입한 다음 이름을점프서비스로 변경합니다. 이 스크립트는 점프 업그레이드의 논리를 포함합니다.

  6. 다음 코드로 기본 코드를 대체합니다.


    -- 서비스
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local ServerStorage = game:GetService("ServerStorage")
    local Players = game:GetService("Players")
    -- 모듈
    local Leaderboard = require(ServerStorage.Leaderboard)
    local PlayerData = require(ServerStorage.PlayerData)
    -- 이벤트
    local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
    local JUMP_KEY_NAME = PlayerData.JUMP_KEY_NAME
    local COIN_KEY_NAME = PlayerData.COIN_KEY_NAME
    local JUMP_POWER_INCREMENT = 30
    local JUMP_COIN_COST = 5
    local function updateJumpPower(player, updateFunction)
    -- 점프 파워 테이블 업데이트
    local newJumpPower = PlayerData.updateValue(player, JUMP_KEY_NAME, updateFunction)
    -- 플레이어의 점프 파워 업데이트
    local character = player.Character or player.CharacterAdded:Wait()
    local humanoid = character:FindFirstChildWhichIsA("Humanoid")
    if humanoid then
    humanoid.JumpPower = newJumpPower
    -- 점프 리더보드
    Leaderboard.setStat(player, JUMP_KEY_NAME, newJumpPower)
    end
    end
    local function onPurchaseJumpIncrease(player)
    local coinAmount = PlayerData.getValue(player, COIN_KEY_NAME)
    if coinAmount < JUMP_COIN_COST then
    return false
    end
    -- 플레이어의 점프 파워 증가
    updateJumpPower(player, function(oldJumpPower)
    oldJumpPower = oldJumpPower or 0
    return oldJumpPower + JUMP_POWER_INCREMENT
    end)
    -- 코인 테이블 업데이트
    local newCoinAmount = PlayerData.updateValue(player, COIN_KEY_NAME, function(oldCoinAmount)
    return oldCoinAmount - JUMP_COIN_COST
    end)
    -- 코인 리더보드
    Leaderboard.setStat(player, COIN_KEY_NAME, newCoinAmount)
    return true
    end
    local function onCharacterAdded(player)
    -- 캐릭터가 추가된 경우 플레이어의 점프 파워를 재설정
    updateJumpPower(player, function(_)
    return 0
    end)
    end
    -- PlayerAdded 이벤트에 추가된 플레이어를 초기화하십시오
    for _, player in Players:GetPlayers() do
    onCharacterAdded(player)
    end
    -- PlayerAdded 이벤트에서 플레이어 초기화
    local function onPlayerAdded(player)
    player.CharacterAdded:Connect(function()
    onCharacterAdded(player)
    end)
    end
    local function onPlayerRemoved(player)
    updateJumpPower(player, function(_)
    return nil
    end)
    end
    IncreaseJumpPowerFunction.OnServerInvoke = onPurchaseJumpIncrease
    Players.PlayerAdded:Connect(onPlayerAdded)
    Players.PlayerRemoving:Connect(onPlayerRemoved)

    다음 섹션에서는 코드를 자세히 설명합니다.

    • 점프 파워 데이터 업데이트 - updateJumpPower() 업데이트

    • 서버 요청 유효성 검사 - onPurchaseJumpIncrease() 첫 번째로 플레이어가 업그레이드를 구매할 코인 수를 가지고 있는지 확인합니다. 모든 요청 클라이언트에서 서버로 보내는 것은 0>유효0>하게 검사되어 나쁜 액터가 업그레이드

플레이어 인터페이스에 버튼 추가

Class.ScreenGui 개체는 플레이어의 PlayerGui 개체에 부모로 지정된 경우에만 화면에 표시됩니다. 기본적으로 이것은 채팅 창과 같은 시스템 GUI를 포함합니다. 이제 업그레이드 버튼을 복제 스토리지의 각 플레이어에 대해

플레이어가 참여할 때 버튼을 GUI에 추가하려면:

  1. In the 탐색기 창에서, 스크립트ReplicatedStorage 에 만듭니다.

  2. 스크립트를 선택한 다음 속성 창에서

    1. 이름을 점프버튼 클릭 처리기 에 설정합니다.
    2. RunContext를 클라이언트 에 설정합니다. 이렇게 하면 엔진이 항상 클라이언트에서 이 스크립트를 실행하도록 지시하여 네트워크 통신을 최적화합니다.
  3. 열린 스크립트에서 다음 코드로 기본 코드를 대체합니다:


    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local Players = game:GetService("Players")
    local player = Players.LocalPlayer
    local playerGui = player.PlayerGui
    local IncreaseJumpPowerFunction = ReplicatedStorage.Instances.IncreaseJumpPowerFunction
    local jumpPurchaseGui = ReplicatedStorage.Instances.JumpPurchaseGui
    local jumpButton = jumpPurchaseGui.JumpButton
    local function onButtonClicked()
    local success, purchased = pcall(IncreaseJumpPowerFunction.InvokeServer, IncreaseJumpPowerFunction)
    if not success then
    -- 성공이 거짓인 경우 구매는 오류 메시지가 됩니다.
    error(purchased)
    elseif success and not purchased then
    warn("Not enough coins!")
    end
    end
    jumpButton.Activated:Connect(onButtonClicked)
    -- 플레이어의 Gui에 JumpPurchaseGui 추가
    jumpPurchaseGui.Parent = playerGui

    다음 섹션에서는 코드를 자세히 설명합니다.

    • GUI 및 서버 함수에 대한 참조 얻기 - 변수 IncreaseJumpPowerFunction , jumpPurchaseGui 및 0> jumpButton0> 에는 함수 및 GUI에서 나중에 필요할 함수를 호출하는 참조가 포함되어 있습니다.
    • 이벤트 처리기를 정의합니다. - onButtonClicked() 는 사용자가 업그레이드 버튼을 클릭할 때 로직을 정의합니다. 이 로직은 pcall() (보호 호출)를 사용하여
    • 처리기를 버튼에 연결하십시오. - Activated 이벤트는 모든 플랫폼에서 마우스, 터치 화면 또는 게임 패드 컨텍스트에서 호환됩니다. 이 이벤트는 마우스, 터치 화면 또는 게임 패드 버튼을 클릭할 때 트

플레이테스트

이제 코인을 사용하여 점프 업그레이드를 구매할 수 있어야 합니다. 프로젝트를 테스트하려면:

  1. 메뉴 바에서 플레이 버튼을 클릭합니다. Studio가 플레이테스트 모드로 들어갑니다.

    Studio's Home tab with the Play button highlighted in the menu bar.
  2. 스크립트가 올바르게 작동하는 경우 화면에 점프 파워를 구입할 수 있는 버튼이 표시됩니다. 코인을 수집하기 전에 버튼을 클릭하여 점프 파워를 확인하고, 코인을 수집하고 업그레이드가 작동하는지 확인하면 다시 클릭하십시오.

이제 코드가 완성되었으므로 게임을 균형 잡기 위해 코인의 양과 위치를 시도하십시오. 게임이 너무 느낌이 나거나 코인을 더 추가하거나 도전적인 장소에 넣으십시오.