เพิ่มรอบ

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

เพิ่มรอบ ช่วยให้คุณสร้างเกมในระยะเวลาที่มีจุดเริ่มต้นและจุดสิ้นสุดที่ชัดเจนเพื่อให้ผู้เล่นสามารถวัดความคืบหน้าของพวกเขาและมีโอกาสเท่าเทียมกันในสนามเกม

โดยใช้ประสบการณ์ เลเซอร์เวทย์ตัวอย่าง เป็นตัวอ้างอิง ส่วนนี้ของการฝึกซ้อมสอนคุณวิธีการใช้และปรับแต่งคุณสมบัติที่ติดตั้งของ 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

ตอนนี้ทุกคนกำลังเร

สำหรับผู้เล่นที่อยู่ในล็อบบี้ในขณะนี้ startRoundLoopAsync() ผ่านผู้เล่นทั้งหมดที่อยู่ภายในประสบการณ์ไปยัง spawnPlayersInMap

สำหรับผู้เล่นใหม่ที่เข้าร่วมประสบการณ์หลังจากที่ล็อบบี้กลุ่มจัดเรียงเป็นทีม startRoundLoopAsync() รายกา

รอบ

-- เรียกผู้เล่นทั้งหมดในแผนที่
neutralSpawn.Neutral = false
spawnPlayersInMap(Players:GetPlayers())
-- เรียกผู้เล่นใหม่ในแผนที่เมื่อพวกเขาเข้าร่วม
local playerAddedConnection = Players.PlayerAdded:Connect(function(player: Player)
spawnPlayersInMap({ player })
end)

ตั้งเป้าหมาย

ตอนนี้ผู้เล่นแต่ละคนอยู่ในสนามด้วยเพื่อนร่วมทีมของพวกเขา, ประสบการณ์จำเป็นต้องให้คำแนะนำว่าจะทำอย่างไรเพื่อประสบความสำเร็จในรอบนี้ ตัวอย่างป้ายเลเซอร์ที่ประสบความสำเ

ในขณะที่คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับวิธีการกำหนดและแสดงผล เป้าหมาย UI ส่วนประกอบในหลักสูตร UI ได้รับการโฟกัสในวิธีการใช้เป้าหมายเป็นจุดเริ่มต้นในรอบเริ่มต้นด้วย

แม้ว่าตัวเรียกร้องเป้าหมายในเวลาทำงานจะแจ้งให้ผู้เล่นทราบว่าพวกเขาต้องทำสามคะแนนเพื่อชนะ หากคุณตรวจสอบตัวเรียกร้องใน StarterGui > HUDGui คุณสามารถดูได้ว่ามัน

“%d%d” เป็นสตริงตัวแทนที่คุณสามารถเพิ่มหรือลดได้ตลอดเวลาเพื่อตอบสนองความต้องการในการเล่นเกมของคุณโดยการปรั

คะแนน_ทีม_จํากัด

local TEAM_SCORE_LIMIT = 200 -- เส้นที่ปรับแก้แล้ว ย้อนกลับ
return TEAM_SCORE_LIMIT

การปรับปรุงแก้ไขตัวแปรง่ายๆนี้ทำงานในเวลาทำงานเพราะเมื่อรอบเริ่มต้น, ReplicatedStorage > HUDGuiSetup > SetObjective ต้องการสคริปต์โมดูล 1> TE

คะแนน_ทีม_จํากัด

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

แทร็กพอยน์ท

ตอนนี้ผู้เล่นมีเป้าหมายสําหรับรอบนี้, ประสบการณ์จําเป็นต้องติดตามแต้มของแต่ละทีมจนกว่าพวกเขาจะไปถึงเป้าหมา

เพื่อให้แน่ใจว่าไม่เกิดขึ้นและทุกการบริจาคเพื่อเป้าหมายของทีมจะได้รั

เมื่อตรวจค้น TeamACounter และ TeamBCounter จะได้รับค่านิยาม teamColor ของพวกเขาซึ่งเกี่ยวข้องกับเขตการเรียกร้องของทีม: TeamACounter แสดงจุดของทีมสีเขียวและ TeamBCounter แทร็กจุดของทีมส

เริ่มติดตั้งทีม

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 ของ TeamACount และค่า สีชมพู carnation ของ TeamBCount ตรงกับค่าที่ตร

เริ่มติดตั้งทีม

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 ตั้งทั้ง 2 วัตถุของทั้งสองทีม' 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 ซึ่งทำสิ่งต่อไปนี้:

  • หยิบทีมของผู้เล่นและทีมปัจจุบันของพวกเขาใน 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 > Gameplay > Rounds ตรวจสอบว่า

อย่างไรก็ตามเมื่อคะแนนของทีมถึง TEAM_SCORE_LIMIT ตัวแปรผังโครงของสคริปต์จะเรียกตัวอีเวนต์ roundWinnerRemote ด้วยชื่อของผู้เล่นและทีมของพวกเขา

รอบ

-- ตรวจสอบว่ารอบนี้จบลงหลังจากทุกคะแนน
local team: Team
local score: number = 0
while score < TEAM_SCORE_LIMIT do
team, score = Scoring.teamScoreChanged:Wait()
end
-- แสดงทีมชนะ
for _, player in Players:GetPlayers() do
-- ส่งอะไรทีมที่ผู้เล่นอยู่ในตอนท้ายของรอบ
-- เพราะทีมของผู้เล่นกำลังจะถูกลบออกจึงต้อง
-- จะไม่สามารถตรวจสอบทีมของตัวเอง
roundWinnerRemote:FireClient(player, team, player.Team)
end

สคริปต์ ReplicatedStorage > RoundResultsGuiSetup ในแต่ละรายการลูกค้าฟังสำหรับเหตุการณ์ roundWinnerRemote ดังนั้นจึงสามารถ:

  • แสดง UI เฉพาะ StarterGui > RoundResultsGui ที่ประกาศผลการแข่งขันและว่าผู้เล่นอยู่ในทีมชนะหรือไม่
  • เล่นเสียงชนะหรือเสียงพ่ายแพ้

เช่นเดียวกับผู้เล่นที่อยู่ในทีมที่คะแนนชนะ พวกเขาจะได้รับหลายรูปแบบของข้อเสนอแนะเกี่ยวกับผลสรุปในรอบนี้ในรูปแบบของ 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

รีเซ็ตทีม

ในเวลาเดียวกันที่ ServerScriptService > Gameplay > Rounds ตรวจสอบว่าทีมได้รับเป้าหมายรอบสุดท้ายและเริ่มการแสดงผล UI ที่เหมาะสมสำหรับผู้เล่นแต่ละรายโดยกา

โดยใช้เหตุผลเดียวกันใน ตำแหน่งของการเกิดใหม่, รอบ แล้วตั้งค่า เป็นกลาง สถานที่กำเนิดของ 1>NeutralSpawnLocation.Neutral</

รอบ

-- ส่งทุกคนไปที่ล็อบบี้
playerAddedConnection:Disconnect()
neutralSpawn.Neutral = true
spawnPlayersInLobby(Players:GetPlayers())

หลังจากรอสิบวินาทีสำหรับช่วงพักสักครู่, Rounds สคริปต์เซิร์ฟเวอร์จะเริ่มเครื่องเล่นซ้ำอีกครั้งโดยการรีเซ็ตคะแนนของทุกคนและเรียงพวกเขาเป็นทีมใหม่ ตัวอย่างนี้ทำซ้ำรอบเ

ตอนนี้ผู้เล่นสามารถเรียกตัวเองเข้าสู่แผนที่ด้วยทีมของพวกเขาเองและเล่นรอบเต็มได้ ส่วนต่อไปสอนคุณเกี่ยวกับสคริปต์ที่อยู่เบื้องหลังพฤติกรรมของแต่ละ blaster