업그레이드 버튼 스크립트

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


플레이어는 이제 코인을 수집하고 죽을 때 잃을 수 있지만, 코인은 아무것도 하지 않으며 게임 세계의 대부분은 매우 높이 점프할 수 있는 능력이 없으면 액세스할 수 없습니다.이 튜토리얼 섹션에서는 코인을 사용하여 점프 파워를 높이는 화면 버튼을 추가하여 경험의 논리를 완료하는 방법을 가르쳐줍니다.

업그레이드 버튼 생성

Roblox의 2D 인터페이스는 일반적으로 GUI 컨테이너 내의 GUI 구성 요소 컬렉션으로 구성됩니다.이 경우 업그레이드 점프(5코인)를 내부에 말하는 구성 요소만 필요하며, 컨테이너 내에 있습니다.

GUI 생성:

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

이 자습서의 나중 단원에서 플레이어의 GUI에 버튼을 추가하지만, 버튼이 작동하기 위해 필요한 모든 논리와 데이터를 정의해야 합니다.

점프 파워 데이터 정의

현재 코인 수만 플레이어 데이터 모듈 스크립트( PlayerData )에 저장됩니다.점프 파워도 동일한 방식으로 저장하고 업데이트해야 합니다. PlayerData 의 함수는 변경되는 데이터와 특정하지 않으므로, 플레이어 점프 힘을 저장하기 위해 필요한 모든 것은 Jump를 추가하고 초기 값을 DEFAULT_PLAYER_DATA하는 것입니다.

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

  1. 탐색기 창에서 서버 저장소 에서 플레이어 데이터 모듈 스크립트를 열어 서버 저장소 에서 열어 보세요.

  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. 탐색기 창에서 복제된 저장소 에서 인스턴스 폴더를 열어 ReplicatedStorage 에서 열어보세요.

  2. 원격 함수 를 인스턴스 폴더에 삽입한 다음 원격 함수 이름을 IncreaseJumpPowerFunction 으로 변경합니다.클라이언트와 서버 모두 액세스할 수 있어야 하기 때문에 ReplicatedStorage 에서 항상 원격 함수를 생성합니다.

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

  4. 속성 에서 캐릭터 사용 점프 파워 속성을 활성화합니다.기본적으로 캐릭터의 점프 파워 값은 캐릭터가 점프하는 양을 정의하지 않으므로 이 기능을 활성화해야 합니다.

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

  6. 기본 코드를 다음 코드로 바꿉니다: replace the default code with the following code:


    -- 서비스
    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
    -- 플레이어가 연결되기 전에 추가된 모든 플레이어를 초기화합니다.Initialized any players added before connecting to PlayerAdded event
    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() 플레이어와 리더보드의 점프력을 업데이트하여 시각적 피드백을 제공합니다.이 함수는 플레이어 위험 생성에서 플레이어에 피해를 주는 코드와 유사합니다.업그레이드 중인 플레이어에 대한 Character 모델과 Humanoid 이 있으면 함수는 JumpPower 속성을 PlayerData 에 저장된 새 값으로 업데이트하여 30을 증가시킵니다.게임이 약간 더 오래 지속되기를 원하면 이 숫자를 줄일 수 있습니다.

    • 서버 요청 확인 - onPurchaseJumpIncrease() 플레이어가 업그레이드를 구매하는 데 필요한 코인 수를 실제로 보유하고 있는지 먼저 확인합니다.클라이언트에서 서버로의 모든 요청( 모든 요청 )은 나쁜 행위자가 거짓 요청을 제출하고 경험을 악용하는 것을 방지하기 위해 검증 되어야 합니다.

플레이어 GUI에 버튼 추가

A ScreenGui 개체는 플레이어의 PlayerGui 개체에 부모로 지정되는 경우에만 화면에 표시됩니다.기본적으로 이것에는 채팅 창과 같은 시스템 GUI가 포함됩니다.이제 업그레이드 버튼을 각 플레이어의 GUI로 복사하고 누르면 동작을 구현하기 위해 ReplicatedStorage 에 스크립트를 생성해야 합니다.

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

  1. 탐색기 창에서 Explorer 에서 스크립트 를 만들어 ReplicatedStorage 에 복제합니다.

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

    1. 이름점프 버튼 클릭 처리기 에 설정합니다.
    2. 실행 컨텍스트클라이언트 에 설정합니다. 이렇게 하면 엔진이 네트워크 통신을 최적화하기 위해 항상 클라이언트에서 이 스크립트를 실행하도록 지시합니다
  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
    -- 구매하면 성공이 false이면 오류 메시지가 표시됩니다
    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, jumpPurchaseGuijumpButton 에는 나중에 필요한 함수와 GUI에 대한 참조가 포함되어 있습니다.
    • 이벤트 처리기 정의 - onButtonClicked() 사용자가 업그레이드 버튼을 클릭할 때의 논리를 정의합니다.그것은 pcall() (보호된 호출)를 사용하여 RemoteFunction 를 호출합니다.이와 같은 클라이언트-서버 통신은 오류나 연결 문제를 처리하기 위해 pcall() 가 필요합니다.
    • 핸들러를 버튼에 연결합니다 - Activated 이벤트는 마우스, 터치스크린 또는 게임패드 컨텍스트를 포함한 모든 플랫폼에서 호환됩니다.클릭, 터치 또는 게임패드 버튼이 릴리스될 때 트리거됩니다.It triggers when a click, touch, or gamepad button is released.

플레이테스트

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

  1. 도구 모음에서 플레이 버튼을 클릭하십시오. Studio가 플레이테스트 모드로 들어갑니다.

    Play button highlighted in Studio's playtesting options.
  2. 스크립트가 올바르게 작동하면 점프 파워를 구매하는 버튼이 화면에 나타납니다.코인을 수집하기 전에 버튼을 클릭하여 추가 점프 파워를 수여하지 않는지 확인한 다음, 코인을 수집하고 다시 클릭하면 업그레이드가 작동하는지 확인하십시오.

이제 코드가 완료되었으므로 코인의 수량과 위치를 통해 게임의 균형을 시도하십시오.게임이 너무 느린 것처럼 느껴지면 더 많은 코인을 추가하고, 너무 빠르고 쉬운 것처럼 느껴지면 코인을 빼고 도전적인 장소에 넣으십시오.