라운드 추가 구조화된 게임 플레이를 단계별로 수행하여 플레이어가 진행 상황을 측정하고 평등한 플레이 기회를 가질 수 있도록 합니다. 이는 특히 팀 기반 게임 플레이에 중요합니다. 이는 플레이 스타일을 변경하여 팀 내에 누가 있는지에 따라 플레이 방식을
이 튜토리얼의 참조로 사용하는 샘플 레이저 태그 경험 을 사용하여 Roblox의 내장 기능을 구조화하는 방법을 배우려면 이 섹션의 교육에서 스크립트 가이드를 포함하여 각 라운드에 대한 지침을 제공합니다.
- 개별 및 팀 포인트를 초기화한 다음 플레이어를 팀 스폰 영역으로 생성하기 시작합니다.
- 각 플레이어의 화면 상단에 있는 목표를 설정하는 변수를 사용자 정의합니다.
- 팀 점수에 대한 플레이어의 기여도를 추적합니다.
- 플레이어의 팀이 라운드를 승리했는지 여부에 따라 독특한 UI 화면을 트리거합니다.
- 플레이어를 연결 해제하고 중立 로비에 생성하여 라운드를 종료합니다.
이 섹션을 완료하면 플레이어에게 정확하고 만족스러운 블래스터 동작을 구현하는 방법을 배울 수 있습니다.
루프 시작
ServerScriptService > 게임플레이 > 라운드 핸들은 라운드 루프의 시작을 표시하기 위해
점수
function Scoring.resetScores()
for _, player in Players:GetPlayers() do
player.leaderstats.Points.Value = 0
end
for _, team in Teams:GetTeams() do
team:SetAttribute(GuiAttribute.teamPoints, 0)
end
end
이제 모든 사람이 0 스폰 위치
현재 로비에 있는 플레이어를 위해, startRoundLoopAsync() 패스는 현재 경험 내의 모든 플레이어를 spawnPlayersInMap 함수로 전환합니다. Gameplay 1>Rounds1> 4>Rounds4>
플레이어가 로비 그룹이 정렬된 팀에 새로 오면 모든 플레이어를 플레이어 목록에 추가하려면 startRoundLoopAsync() 목록을 경청하고, 다시 Players.PlayerAdded:Connect
라운드
-- 맵에 있는 모든 플레이어 생성
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- 플레이어가 참여할 때 맵에서 새로운 플레이어 생성
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
목표 설정
이제 각 플레이어가 팀원과 함께 아레나에 있으므로 경험은 라운드에서 성공하기 위해 할 일에 대한 지침을 제공해야 합니다. 샘플 레이저 태그 경험은 이 요구 사항을 해결하기 위해 각 플레이어의 화면 상단에 명확한 가이드가 있는 목표 프롬프트를 제공합니다.
UI 교육 과정에서 목표 UI 구성 및 표시 방법에 대해 자세히 살펴보면서도 이 섹션에서는 목표 목표를 라운드가 시작되면 라운드에 필요한 포인트 수를 설정하는 방법부터 시작하여 라운드를 완료하는 방법에 대해 설명합니다.
플레이어가 승리하려면 세 점을 획득해야 하지만, StarterGui > HUDGui에서 프롬프트를 검토하면 대신 구성 가능한 "%d "가 포인트 값에 대해 포함되어 있음을 알 수 있습니다.
“%d”는 게임 플레이 요구 사항을 충족하기 위해 언제든지 증가하거나 감소할 수 있는 자리 표시자 문자열입니다. 예를 들어, “TEAM_SCORE_LIMIT”를 “200”으로 설정하면 즉시
팀_점수_제한
local TEAM_SCORE_LIMIT = 200 -- 업데이트된 라인, 뒤로변경하세요return TEAM_SCORE_LIMIT
이 간단한 변수 업데이트는 둥이 시작되면 ReplicatedStorage > HUDGuiSetup > SetObjective > 1> 4>Class.TextLabel4> 개체의 대체 문자열을 교체하기 위해 7> 0>목표 설정0> 모듈 스크립트를 교체하므로
팀_점수_제한
local TEAM_SCORE_LIMIT = require(ReplicatedStorage.TEAM_SCORE_LIMIT)
local function setObjective(gui: ScreenGui)
local bodyTextLabel = gui.Objective.ObjectiveDisplay.Body.BodyTextLabel
bodyTextLabel.Text = bodyTextLabel.Text:format(TEAM_SCORE_LIMIT)
end
트랙 포인트
이제 플레이어가 라운드에 대한 목표를 가졌으므로 경험은 각 팀의 포인트를 추적해야 합니다. 목표에 도달할 때까지 각 플레이어의 기여도를 각 팀 점수에 추가하고 각 플레이어의 기여도를
이렇게 하여 팀 목표에 대한 모든 기여를 보관하고 이 목표에 대한 모든 기여를 보장하려면 ReplicatedStorage > H
팀 팀수치 및 팀 팀수치 를 찾을 때, 그것은 그들의 teamColor 특성을 가져와, 팀 생성 영역과 관련이 있습니다. 팀 1>팀수치1> 는 녹색 팀의 포인트를 표시하고, 팀 4>팀수치4> 는 분홍색 �
시작 동기화 팀 포인트
local function startSyncingTeamPoints(gui: ScreenGui)
for _, teamPointCounter in gui.Objective.TeamPointCounter:GetChildren() do
if not teamPointCounter:IsA("GuiObject") then
continue
end
local iconTeamColor = teamPointCounter:GetAttribute(GuiAttribute.teamColor)
모듈 스크립트는 다음 getTeamFromTeamColor 함수를 호출하여 TeamACounter의 mint 특성 및 TeamBCounter의 teamColor 특성을 확인하고 해당 서비스 아래에 있는 2>
시작 동기화 팀 포인트
local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end
이 경우 startSyncingTeamPoints 는 둘 다의 팀 카운터의 TextLabel 개체를 해당 팀의 teamPoints 값으로 설정하고 플레이어가 다른 팀에서 포인트를 얻을 때마다 업데이트합니다.
시작 동기화 팀 포인트
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
이 섹션의 모든 것은 플레이어 화면에서 포인트를 추적하는 방법에 집중했지만, 서버에서 포인트를 처리하는 로직을 검토하는 것이 중요하므로 팀이 목표 목표를 달성하고 라운드를 승리하는지 알 수 있습니다.
점수
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
그런 다음 incrementScore 함수를 호출하여 다음과 같은 작업을 수행합니다.
- Class.Team 개체에 있는 플레이어의 팀과 현재 팀포인트 값을 가져와 Teams 서비스에 추가합니다.
- 리더보드플레이어의 개별 점수를 가져와 하나를 추가합니다.
- 이전에 언급한 바와 같이 플레이어 팀과 점수로 이벤트를 발생시킵니다.
이 프로세스는 클라이언트와 서버가 각 플레이어의 개별 점수와 팀 점수에 대해 동일하게 정렬되도록 효과적으로 유지합니다.
점수
function Scoring.incrementScore(player: Player, amount: number)
local team = player.Team
assert(team, `Player {player.Name} must be on a team to score a point, but has no team`)
local teamPoints = team:GetAttribute(GuiAttribute.teamPoints)
teamPoints += amount
team:SetAttribute(GuiAttribute.teamPoints, teamPoints)
local leaderstat = player.leaderstats.Points
leaderstat.Value += amount
teamScoreChangedBindable:Fire(team, teamPoints)
end
결과 표시
플레이어가 서로 태그하고 팀에 대한 점수를 얻으면, ServerScriptService > 게임플레이 > 라운드 검사를 확인하여 팀이 라운드 목표를 달성했는지 확인합니다.
그러나 팀의 점수가 TEAM_SCORE_LIMIT 변수에 도달하면 스크립트는 플레이어의 이름과 팀과 함께 플레이어의 이름을 가진 이벤트 인스턴스를 roundWinnerRemote 호출합니다.
라운드
-- 각 점수 후에 라운드가 끝났는지 확인하십시오local team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- 우승 팀 표시for _, player in Players:GetPlayers() do-- 라운드가 끝날 때 플레이어가 어떤 팀에 있는지 보내기-- 플레이어 팀이 곧 제거될 예정이므로 클라이언트-- 자신의 팀을 확인할 수 없습니다roundWinnerRemote:FireClient(player, team, player.Team)end
각 클라이언트 목록에 있는 ReplicatedStorage > RoundResultsGuiSetup 스크립트는 이 roundWinnerRemote 이벤트 인스턴스를 감지하여 다음을 수행할 수 있습니다.
- 라운드의 결과를 발표하고 플레이어가 승리 팀에 있는지 여부를 표시하는 독특한 StarterGui > RoundResultsGui UI 화면을 표시합니다.
- 승리 또는 패배 오디오 클립을 재생합니다.
예를 들어, 승리 포인트를 획득한 플레이어가 있다면 승리 라운드 결과에 대한 다양한 피드백을 포함하여 다양한 형태의 피드백을 받습니다. 반대로, 승리 포인트를 획득하지 않은 플레이어는 승리 텍스트를 표시하는 UI 화면과 오미스 사운드를 재
RoundResultsGui 설정
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- 우리 팀이 승리하면 승리를 표시합니다! 그렇지 않으면 패배를 표시합니다...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end
팀 재설정
서버스크립트 서비스 게임플레이 게임플레이 룰 게임플레이 룰 게임플레이 룰 게임플레이 룰 게임플레이 룰 게임플레이 플레이어게임플레이 룰 게임플레이 룰 게임플레이 룰 게임플레이 룰 게임플레이 룰 게임플레이 룰
생성 위치 구성, 라운드 및 중화 생성 위치의 Neutral 속성을 설정하여 플레이어가 네이티브 생성 위치를 생성할 수 있도록 합니다. 이를 통해 플레이어는 라운드에 연결되지 않더라도
라운드
-- 모든 사람을 로비로 보내기playerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
중간 휴식을 위해 10초를 기다린 후, Rounds 서버 스크립트는 모든 사람의 점수를 재설정하고 순위를 새로운 팀으로 정렬하여 루프를 다시 시작합니다. 샘플은 서버에 플레이어가 없으면 순차적 라운드 프로세스를 반복하기 위해 계속해서 반복됩니다.
이제 플레이어는 자신의 팀과 함께 맵에 생성되고 전체 라운드를 플레이할 수 있으므로 다음 섹션에서는 각 블래스터의 동작 뒤에 있는 스크립트를 가르쳐 줍니다.