เพิ่มรอบ ช่วยให้คุณสร้างเกมในระยะเวลาที่มีจุดเริ่มต้นและจุดสิ้นสุดที่ชัดเจนเพื่อให้ผู้เล่นสามารถวัดความคืบหน้าของพวกเขาและมีโอกาสเท่าเทียมกันในสนามเกม
โดยใช้ประสบการณ์ เลเซอร์เวทย์ตัวอย่าง เป็นตัวอ้างอิง ส่วนนี้ของการฝึกซ้อมสอนคุณวิธีการใช้และปรับแต่งคุณสมบัติที่ติดตั้งของ 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 ซึ่งทำสิ่งต่อไปนี้:
- ดึงคะแนนของผู้เล่นแต่ละรายการในกระดานผู้นํา ตารางอันดับ
- เรียกเหตุการณ์ที่ผูกไว้ก่อนหน้านี้ด้วยทีมของผู้เล่นและคะแนนของพวกเขา
มันเก็บผลลัพธ์ของทั้งผู้เล่นและผู้เล่นในทีมได้อย่างมีประสิทธิภาพ
การจัดคะแนน
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: 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 ดังนั้นจึงสามารถ:
- แสดง 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 = truespawnPlayersInLobby(Players:GetPlayers())
หลังจากรอสิบวินาทีสำหรับช่วงพักสักครู่, Rounds สคริปต์เซิร์ฟเวอร์จะเริ่มเครื่องเล่นซ้ำอีกครั้งโดยการรีเซ็ตคะแนนของทุกคนและเรียงพวกเขาเป็นทีมใหม่ ตัวอย่างนี้ทำซ้ำรอบเ
ตอนนี้ผู้เล่นสามารถเรียกตัวเองเข้าสู่แผนที่ด้วยทีมของพวกเขาเองและเล่นรอบเต็มได้ ส่วนต่อไปสอนคุณเกี่ยวกับสคริปต์ที่อยู่เบื้องหลังพฤติกรรมของแต่ละ blaster