Thêm vòng trò chơi cho phép bạn cấu hình gameplay thành các giai đoạn với một điểm khởi đầu và điểm kết thúc rõ ràng để người chơi có thể đo lường tiến độ của họ và có cơ hội bình đăng trên sân chơi bằng cách thay đổi lối chơi của
Sử dụng trải nghiệm Laser Tag trên ví dụ làm một ví dụ, bài này của hướng dẫn cho bạn cách sử dụng và tùy chỉnh các tính năng tích hợp của Roblox để cấu hình mỗi vòng, bao gồm hướng dẫn về việc lập trình trong:
- Bắt đầu một vòng bằng cách đặt lại các điểm cá nhân và đội, sau đó tạo người chơi vào các khu vực người chơi của họ.
- Tùy chỉnh các biến đổi đặt mục tiêu cho vòng ở đầu màn hình của mỗi người chơi.
- Theo dõi đóng góp điểm của người chơi cho điểm số của đội của họ.
- Kích hoạt các màn hình UI độc đáo tùy thuộc vào nếu đội người chơi thắng hoặc thua trò chơi.
- Kết thúc một hiệp bằng cách mất kết nối người chơi và tạo chúng trong sảnh chờ trung tín.
Sau khi hoàn thành phần này, bạn sẽ học cách thực hiện hành vi người chơi làm cho người chơi cảm thấy an toàn và chính xác.
Bắt đầu Loop
ServerScriptService > Gameplay > Rounds > 0> startRoundLoopAsync()0> để thực hiện các vò
Đánh giá
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
Bây giờ mọi người đang b
Đối với người chơi đang ở trong sảnh, startRoundLoopAsync() điều chỉnh tất cả người chơi hiện tại trong trải nghiệm lên chức năng spawnPlayersInMap trong ServerScriptService > 1> Game
Đối với bất kỳ người chơi mới nào tham gia trải nghiệm sau khi nhóm lớp được sắp xếp thành một đội, startRoundLoopAsync() lắng nghe sự kiện
Vòng
-- Tạo tất cả người chơi trên bản đồ
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- Tạo những người chơi mới trên bản đồ khi họ tham gia
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)
Đặt Mục Tiêu
Bây giờ mỗi người chơi đã ở trong đấu trường với những đồng đội của họ, trải nghiệm cần cung cấp hướng dẫn cho những gì cần làm để thành công trong trò chơi. Samples trải nghiệm laser tích hợp tại đỉnh của mỗi người chơi để cung cấp hướng dẫn rõ ràng
Mặc dù bạn có thể tìm hiểu thêm về cách tùy chỉnh và hiển thị UI mục tiêu component trong UI Curriculum, bản này tập trung vào cách thực hiện mục tiêu mục tiêu như một vòng bắt đầu, bắt đầu với cách thiết lập số điểm mà mỗi đội cần phải hoàn thành vòng.
Mặc dù yêu cầu mục tiêu tại thời điểm chạy thông báo cho người chơi cần phải ghi ba điểm để giành chiến thắng, nhưng nếu bạn xem yêu cầu ở StarterGui > HUDGui , bạn có thể thấy rằng nó thực sự chứa một cấu hình có thể tùy chỉnh "
“%d%d” là một chuỗi người dùng để bạn có thể tăng hoặc giảm bất kỳ lúc nào để đáp ứng các yêu cầu gameplay của riêng bạn bằng cách cập nhật biến TEAM_SCORE
TEAM_SCORE_LIMIT
local TEAM_SCORE_LIMIT = 200 -- đã cập nhật dòng, hãy chắc chắn để thay đổi quay lạireturn TEAM_SCORE_LIMIT
Đơn giản hóa biến này hoạt động trên lúc khởi động vì khi vòng bắt đầu, ReplicatedStorage > HUDGuiSetup > SetObjective > 1> TEAM_SCORE_LIMIT1> > 4> module script so that it can swap the placeholder string in the UI Objective's 7>
TEAM_SCORE_LIMIT
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
Điểm dừng
Bây giờ khi người chơi có một mục tiêu cho vòng này, trải nghiệm cần theo dõi từng điểm của mỗi đội cho đến khi họ đạt được mục tiêu của họ. Khi người chơi ghi
Để đảm bảo điều này không xảy ra và mọi đóng góp đối với mục tiêu của đội đều đượ
Khi nó tìm thấy TeamACounter và TeamBCounter , nó nhận được đặc tính teamColor của họ, liên quan với các khu vực phát triển đội: TeamACCounter hiển thị điểm của đội xanh, và TeamBCCounter theo dõi điểm của đội hồng.
Bắt đầu đồng bộ hóa điểm
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)
Kế tiếp, mã nhân bản module gọi chức năng của mình getTeamFromTeamColor để xác minh rằng thuộc tính mint của TeamACount và thuộc tính carnation pink
Bắt đầu đồng bộ hóa điểm
local function getTeamFromTeamColor(teamColor: Color3): Team?
for _, team in Teams:GetTeams() do
if team.TeamColor == teamColor then
return team
end
end
return nil
end
Khi điều này xảy ra, startSyncingTeamPoints thiết lập các đối tượng TextLabel của cả hai đội đến giá trị tương ứng của họ, và tiếp tục cập nhật chúng khi một người chơi ghi điểm bằng cách nhắn một người chơi kh
Bắt đầu đồng bộ hóa điểm
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
team:GetAttributeChangedSignal(GuiAttribute.teamPoints):Connect(function()
teamPointCounter.TextLabel.Text = team:GetAttribute(GuiAttribute.teamPoints)
Mọi thứ trong phần này cho đến nay đã tập trung vào cách theo dõi điểm trên màn hình người chơi, nhưng quan trọng là xem xét logic xử lý điểm theo dõi trên máy chủ để biết khi nào một đội đạ
Đánh giá
local teamScoreChangedBindable = Instance.new("BindableEvent")local Scoring = {teamScoreChanged = teamScoreChangedBindable.Event,}
Nó sau đó gọi chức năng incrementScore, thực hiện các hành động sau:
- Lấy điểm số của cá nhân người chơi trên bảng xếp hạng, và thêm một điểm.
- Kích hoạt sự kiện liên quan đã đề cập ở trên với cả team người chơi và số điểm của họ.
Nó giữ hiệu quả cả client và server về cả các điểm của các người chơi và điểm của nhóm của họ.
Đánh giá
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
Hiển Thị Kết Quả
Khi các người chơi thẻ nhau và ghi điểm cho đội của họ, ServerScriptService > Gameplay > Rounds kiểm tra để xem liệu đội đã ghi điểm có đạ
Tuy nhiên, một khi điểm số của một đội đạt đến biến TEAM_SCORE_LIMIT, script sẽ kích hoạt một instace roundWinnerRemote với tên người chơi và tên đội của họ.
Vòng
-- Kiểm tra xem vòng đã kết thúc sau mỗi điểm sốlocal team: Teamlocal score: number = 0while score < TEAM_SCORE_LIMIT doteam, score = Scoring.teamScoreChanged:Wait()end-- Hiển thị đội chiến thắngfor _, player in Players:GetPlayers() do-- Gửi đội mà người chơi đang ở vào cuối trò chơi-- vì đội của người chơi đang chuẩn bị bị xóa, vì vậy client-- sẽ không thể kiểm tra đội của riêng mìnhroundWinnerRemote:FireClient(player, team, player.Team)end
Script ReplicatedStorage > RoundResultsGuiSetup trên mỗi danh sách khách hàng lắng nghe sự kiện này roundWinnerRemote để có thể:
- Hiển thị một màn hình độc đáo StarterGui > RoundResultsGui UI để thông báo kết quả của vòng và nếu người chơi đang ở trên đội chiến thắng.
- Chơi một đoạn âm thanh chiến thắng hoặc đánh bại.
Ví dụ, nếu một người chơi đang ở trên đội nào đó đã ghi điểm chiến thắng, họ sẽ nhận nhiều hình dạng phản hồi về kết quả của vòng trong dạng một UI hiển thị chữ và một cái âm thanh oai nghiêm, và một cái gậy tay oai n
Cài đặt RoundResultsGui
local function onRoundWinner(winner: Team, localTeam: Team?)
local victoryDefeatText = "Round ended!"
if localTeam then
-- Nếu đội của chúng tôi thắng, chúng tôi sẽ hiển thị Chiến thắng! Ngược lại, nếu đội của bạn thắng, chúng tôi sẽ hiển thị Sự thua thứ ...
local isVictory = winner == localTeam
if isVictory then
victorySound:Play()
victoryDefeatText = VICTORY_TEXT
else
defeatSound:Play()
victoryDefeatText = DEFEAT_TEXT
end
end
Đổi mới đội
Ở cùng một thời điểm mà ServerScriptService > Gameplay > Rounds > 1> Rounds1> > 4> Rounds4> > 7> Rounds7> > 0> Rounds0> > 3> Rounds3> > 6> Rounds6> > 9> Rounds 9> >
Sử dụng cùng một logic ở Tùy chỉnh vị trí phát triển, Vòng sau đó đặt Neutral vị trí phát triển của 1> Class.SpawnLocation.Neutral|Neutral1> đến 4> true4>
Vòng
-- Gửi mọi người đến sảnh đợiplayerAddedConnection:Disconnect()neutralSpawn.Neutral = truespawnPlayersInLobby(Players:GetPlayers())
Sau khi đợi mười giây cho một giải laoim, Rounds server script sau đó bắt đầu lại hàng loop bằng cách thiết lập lại tất cả các điểm số của mọi người và sắp xếp chúng thành những đội mới. Mẫu lặp lại quá trình này liên tục cho đến khi không có người máy chủnà
Bây giờ khi người chơi có thể xuất hiện trên bản đồ với đội của họ và chơi một trò chơi tròn đầy, bài viết này dạy bạn về các tập lệnh đằng sau hành vi của mỗi blaster.