Thêm Vòng

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

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ại
return 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 TeamACounterTeamBCounter , 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 giá trị đội của người chơi và đội hiện tại của họ trên Team đối tượng trong dịch vụ Teams, sau đó thêm một.
  • 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: Team
local score: number = 0
while score < TEAM_SCORE_LIMIT do
team, score = Scoring.teamScoreChanged:Wait()
end
-- Hiển thị đội chiến thắng
for _, 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ình
roundWinnerRemote: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

Phản hồi chiến thắng
Đánh giá bạn bè
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 đợi
playerAddedConnection:Disconnect()
neutralSpawn.Neutral = true
spawnPlayersInLobby(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.