การสร้าง คือกระบวนการสร้างวัตถุหรือตัวละครในประสบการณ์ และ การเกิดใหม่ คือกระบวนการเพิ่มวัตถุหรือตัวละครกลับไปในประสบการณ์หลังจากพวกเขาตอบสนองเงื่อนไขการลบออก เช่น สุขภาพของตัวละครลดเหลือศูนย์หรือล้มออกจากแผนที่ทั้งสองกระบวนการมีความสำคัญเพราะพวกเขามั่นใจว่าผู้เล่นสามารถเข้าร่วมประสบการณ์ของคุณและสามารถเล่นต่อไปเพื่อปรับปรุงทักษะของพวกเขา
ใช้ประสบการณ์แท็กเลเซอร์ตัวอย่าง เป็นการอ้างอิง ในส่วนนี้ของบทแนะนำการสอนคุณวิธีใช้และปรับแต่งคุณลักษณะที่สร้างไว้ของ Roblox เพื่อจัดการการเกิดและการเกิดใหม่ รวมถึงคำแนะนำในการเขียนสคริปต์เกี่ยวกับ:
- กำหนดตำแหน่งการเกิดเพื่อให้ผู้เล่นสามารถเกิดได้เฉพาะในโซนเกิดของทีมของพวกเขาเท่านั้น
- เพิ่มผู้เล่นใหม่และตัวละครของพวกเขาในรอบในขณะที่พวกเขาเข้าร่วมประสบการณ์
- ปรับแรงสนามที่ป้องกันความเสียหายเมื่อผู้เล่นเกิดและเกิดใหม่
- จัดการสถานะของไคลเอนต์เพื่อให้การเล่นเกมทำงานอย่างถูกต้องในเวลาที่เหมาะสม
- ฟื้นฟูตัวละครหลังจากที่พวกเขาถูกแท็กออกจากรอบ
- ทำการดำเนินการเล็ก ๆ ที่หลากหลายที่มีความสำคัญต่อการตั้งค่าพารามิเตอร์การเล่นเกมและตัวละคร
ส่วนนี้รวมถึงเนื้อหาการเขียนโปรแกรมจํานวนมาก แต่แทนที่จะเขียนทุกอย่างจากจุดเริ่มต้นเมื่อสร้างประสบการณ์ มันจะส่งเสริมให้คุณใช้ส่วนประกอบที่มีอยู่แล้วในการเขียนซ้ําอย่างรวดเร็วและค้นหาว่าระบบใดที่ต้องการการจําลองการใช้งานแบบกําหนดเองเพื่อจับคู่วิสัยทัศน์ของคุณหลังจากที่คุณเสร็จสิ้นส่วนนี้แล้ว คุณจะเรียนรู้วิธีการใช้งานการเล่นเกมแบบรอบที่ติดตามแต้มตรวจสอบสถานะผู้เล่นและแสดงผลลัพธ์รอบ
กำหนดตำแหน่งการเกิด
หากคุณทดสอบประสบการณ์ในขณะนี้ ผู้เล่นทั้งหมดจะสุ่มเกิดที่วัตถุ SpawnLocation ในโซนจุดเกิดของทีมสีเขียว หรือวัตถุ SpawnLocation ในโซนจุดเกิดของทีมสีชมพูนี่เป็นปัญหาการเล่นเกมที่ผู้เล่นสามารถแท็กติดตามกันได้ภายในแต่ละโซนเกิดทันทีที่ฟิลด์พลังของคู่ต่อสู้หายไป
เพื่อต่อสู้กับปัญหานี้ประสบการณ์แท็กเลเซอร์ตัวอย่างจะกำหนดตำแหน่งการเกิดทั้งสองด้วยค่า Neutral คุณสมบัติที่ตั้งเป็น false เพื่อจํากัดผู้เล่นของทีมตรงข้ามจากการเกิดในโซนการเกิดที่ผิด และค่า TeamColor คุณสมบัติที่ตั้งเป็น Team.Color ค่าที่เทียบเท่ากับค่า จาก กําหนดสีทีม ในส่วนก่อนหน้าของบทแนะนําการสอน:


เมื่อผู้เล่นเข้าร่วมประสบการณ์ ServerScriptService > เกมเพลย์ > รอบ > spawnPlayersInMap ตรวจสอบเพื่อดูว่ามีผู้เล่นกี่คนอยู่ในแต่ละทีมแล้วจึงส่งทีมที่มีผู้เล่นน้อยที่สุด
สร้างผู้เล่นในแผนที่
local function getSmallestTeam(): Team
local teams = Teams:GetTeams()
-- จัดเรียงทีมในลำดับเพิ่มขึ้นจากเล็กที่สุดไปยังใหญ่ที่สุด
table.sort(teams, function(teamA: Team, teamB: Team)
return #teamA:GetPlayers() < #teamB:GetPlayers()
end)
-- ส่งทีมเล็กที่สุด
return teams[1]
end
เมื่อรู้ทีมที่มีผู้เล่นน้อยที่สุดแล้ว มันจะจัดเรียงผู้เล่นในทีมนั้น ตั้งค่าคุณสมบัติ ของผู้เล่นให้เป็น ปลอม เพื่อให้ผู้เล่นสามารถสร้างและเกิดใหม่ได้เฉพาะที่จุดเกิดของทีมของพวกเขาเท่านั้น จากนั้นตั้งค่า ตำแหน่งของการเกิดใหม่ซึ่งคุณจะเรียนรู้เพิ่มเติมในภายหลังในบทแนะนำการใช้งาน
สร้างผู้เล่นในแผนที่
local function spawnPlayersInMap(players: { Player })
for _, player in players do
player.Team = getSmallestTeam()
player.Neutral = false
player:SetAttribute(PlayerAttribute.playerState, PlayerState.SelectingBlaster)
task.spawn(function()
player:LoadCharacter()
end)
end
end
หากคุณตรวจสอบ พื้นที่ทำงาน > โลก > แผนที่ > จุดเกิดใหม่ , คุณสามารถดูได้ว่ามีจุดเกิดใหม่อีกหนึ่งจุดในแผนที่: NeutralSpawn .ตำแหน่งการเกิดนี้มีเอกลักษณ์จากที่อื่นเพราะมันไม่มีคุณสมบัติ TeamColor ที่กำหนดให้เป็นหนึ่งในสองทีมในประสบการณ์; แทนที่จะมีคุณสมบัติ Neutral ที่เปลี่ยนไปขึ้นอยู่กับว่ารอบใช้งานอยู่หรือไม่
ตัวอย่างเช่น หากรอบใช้งานอยู่ คุณสมบัติ Neutral จะตั้งค่าเป็น ปิด ดังนั้น spawnPlayersInMap จึงสามารถจัดเรียงผู้เล่นเป็นทีมและส่งพวกเขาไปยังสนามได้อย่างไรก็ตาม หากรอบไม่ได้ใช้งาน เช่น เวลาระหว่างรอบหนึ่งและอันถัดไป คุณสมบัติ Neutral จะตั้งเป็น true ดังนั้นผู้เล่นสามารถสร้างได้อย่างไม่ขึ้นกับสถานะทีมของพวกเขากระบวนการนี้คือสิ่งที่ทำให้ตำแหน่งการเกิด เป็นกลาง เป็นล็อบบี้ที่ทำงานได้

เพื่อสาธิตถ้าคุณตรวจสอบ ServerScriptService > เกมเพลย์ > รอบ > SpawnPlayersInLobby , ซึ่งจะทำงานในตอนท้ายของรอบคุณสามารถดูได้ว่าสำหรับผู้เล่นทุกคนที่ถูกส่งไปยังโต๊ะ players: { Player } ที่เป็นสคริปต์:
- ตั้งค่าคุณสมบัติ Player.Neutral ของพวกเขาเป็นจริงเพื่อรีเซ็ตอัตโนมัติ Player.Team ไปยัง nil ทำให้ผู้เล่นสามารถเกิดใหม่ในล็อบบี้เมื่อรอบไม่ได้ใช้งาน เนื่องจากคุณสมบัติ Neutral ตำแหน่งของการเกิดใหม่ true เช่นกัน
- เปลี่ยน PlayerState ผู้เล่นInLobby เพื่อลบภาพบลาสเตอร์และอินเทอร์เฟซผู้ใช้แบบแรก
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโซนจุดเกิดเป็นกลางและฟังก์ชันของมันสำหรับแต่ละรอบดูที่ เพิ่มรอบ ในส่วนถัดไปของบทแนะนำการใช้งาน
สร้างผู้เล่นในล็อบบี้
local function spawnPlayersInLobby(players: { Player })
for _, player in players do
player.Neutral = true
player:SetAttribute(PlayerAttribute.playerState, PlayerState.InLobby)
task.spawn(function()
player:LoadCharacter()
end)
end
end
เชื่อมต่อผู้เล่นใหม่
โค้ด Luau ใน Studio มักจะขับเคลื่อนด้วยอีเวนต์ ซึ่งหมายความว่าสคริปต์จะฟังอีเวนต์จากบริการ Roblox แล้วเรียกฟังก์ชันในการตอบสนองตัวอย่างเช่น เมื่อเพิ่มผู้เล่นใหม่ในประสบการณ์การเล่นหลายคน จะต้องมีอีเวนต์ที่จัดการทุกอย่างที่จำเป็นสำหรับผู้เล่นที่จะเชื่อมต่อสำเร็จในประสบการณ์แท็กเลเซอร์ตัวอย่างนี้เหตุการณ์ที่ตรงกันคือ Players.PlayerAdded:Connect
Players.PlayerAdded:Connect เป็นส่วนหนึ่งของสคริปต์หลายตัวในประสบการณ์หากคุณใช้ลัด Ctrl/Cmd+Shift+F และค้นหา Players.PlayerAdded:Connect ผลลัพธ์จะให้จุดเริ่มต้นที่ดีสำหรับการเข้าใจการตั้งค่าเบื้องต้นของประสบการณ์

เพื่อสาธิต, เปิด ServerScriptService > SetupHumanoid .ความแตกต่างระหว่าง Player และ Character เป็นกุญแจสำคัญในการเข้าใจสคริปต์นี้:
- ผู้เล่น คือไคลเอนต์ที่เชื่อมต่อและตัวละคร คือรูปแบบ
- ตารางอันดับตัวละครต้องสร้างและรับบลาสเตอร์
SetupHumanoid ตรวจสอบทันทีว่าผู้เล่นมีตัวละคร (เพิ่งเข้าร่วม) หรือไม่ (กำลังเกิดใหม่)หลังจากหาได้แล้ว มันจะเรียก onCharacterAdded() รับโมเดล Humanoid จากตัวละคร และส่งไปยัง ServerScriptService > SetupHumanoid > setupHumanoidAsync สําหรับการปรับแต่งหลังจากตั้งค่าค่าเหล่านี้แล้ว สคริปต์จะรอให้สุขภาพของตัวละครถึงศูนย์คุณจะเรียนรู้เพิ่มเติมเกี่ยวกับการเกิดใหม่ในภายหลังในส่วนนี้ของบทแนะนำการใช้งาน
การตั้งค่า HumanoidAsync
local function setupHumanoidAsync(player: Player, humanoid: Humanoid)
humanoid.DisplayDistanceType = Enum.HumanoidDisplayDistanceType.Subject
humanoid.NameDisplayDistance = 1000
humanoid.HealthDisplayDistance = 1000
humanoid.NameOcclusion = Enum.NameOcclusion.OccludeAll
humanoid.HealthDisplayType = Enum.HumanoidHealthDisplayType.AlwaysOn
humanoid.BreakJointsOnDeath = false
humanoid.Died:Wait()
onHumanoidDied(player, humanoid)
end
หมายเหตุสำคัญของสคริปต์นี้คือคุณสมบัติเป็นตัวเลือกอย่างสมบูรณ์ ซึ่งหมายความว่าหากคุณลบบรรทัดแรกหกบรรทัดของฟังก์ชันแล้วประสบการณ์ยังคงทำงานได้อย่างถูกต้องแทนที่จะเป็นความต้องการทางฟังก์ชัน, แต่ละคุณสมบัติช่วยให้คุณสามารถตัดสินใจออกแบบที่ตอบสนองเป้าหมายการเล่นเกมของคุณได้ตัวอย่าง:
- หากต้องการให้ชื่อตัวละครแสดงในระยะใกล้ ลดค่าของ Humanoid.NameDisplayDistance ลง
- หากคุณต้องการเฉพาะสุขภาพของตัวละครที่จะแสดงเมื่อต่ำกว่า 100% ให้ตั้ง Humanoid.HealthDisplayType เป็น แสดงเมื่อเสียหาย * หากต้องการให้ตัวละครแตกออกเมื่อสุขภาพถึง 0 ให้ตั้ง Humanoid.BreakJointsOnDeath เป็น True หากคุณเปลี่ยนค่าของคุณสมบัติเหล่านี้ เป็นสิ่งสำคัญที่ต้องทดสอบเพื่อให้คุณสามารถดูผลกระทบของการตั้งค่าใหม่ได้คุณสามารถสร้างใหม่ประสบการณ์ที่ผู้เล่นได้รับในสภาพแวดล้อมของผู้เล่นหลายคนโดยเลือกอย่างน้อยสองตัวละครในส่วน ไคลเอนต์และเซิร์ฟเวอร์ ของแท็บ ทดสอบ

อีกตัวอย่างหนึ่งของอีเวนต์ Players.PlayerAdded:Connect คือใน ServerScriptService > PlayerStateHandler เช่นเดียวกับในตัวอย่างก่อนหน้านี้ PlayerStateHandler ตรวจสอบตัวอักษรทันทีหากผู้เล่นไม่อยู่ในล็อบบี้ สคริปต์จะตั้งค่าคุณสมบัติผู้เล่นเป็นสถานะ SelectingBlaster สถานะเริ่มต้นสำหรับรอบที่ผู้เล่นสามารถเลือกจากสองประเภทบลาสเตอร์ที่แตกต่างกันหลังจากเกิดในอารีน่าสถานะนี้ยังรวมถึงฟิลด์พลังที่ป้องกันไม่ให้ผู้เล่นได้รับความเสียหายในขณะที่พวกเขากําลังทําการเลือก
ผู้จัดการสถานะผู้เล่น
local function onPlayerAdded(player: Player)
player.CharacterAdded:Connect(function()
if not player.Neutral then
player:SetAttribute(PlayerAttribute.playerState, PlayerState.SelectingBlaster)
onPlayerStateChanged(player, PlayerState.SelectingBlaster)
end
end)
ตัวแปรหนึ่งเฉพาะใน PlayerStateHandler สงวนสิทธิ์ในการพูดคุย: attributeChangedConnectionByPlayer .ตารางนี้เก็บผู้เล่นทั้งหมดและ Connections ของพวกเขาไปยัง GetAttributeChangedSignalเหตุผลในการเก็บการเชื่อมต่อนี้ในตารางคือเพื่อให้ PlayerStateHandler สามารถ ตัดการเชื่อมต่อ เมื่อผู้เล่นออกจากประสบการณ์กระบวนการนี้ให้บริการเป็นการจัดการหน่วยความจําเพื่อป้องกันไม่ให้จํานวนการเชื่อมต่อเพิ่มขึ้นเรื่อยๆ ตามเวลา
ผู้จัดการสถานะผู้เล่น
local attributeChangedConnectionByPlayer = {}
local function onPlayerAdded(player: Player)
-- จัดการการอัปเดตทั้งหมดในอนาคตไปยังสถานะผู้เล่น
attributeChangedConnectionByPlayer[player] = player
:GetAttributeChangedSignal(PlayerAttribute.playerState)
:Connect(function()
local newPlayerState = player:GetAttribute(PlayerAttribute.playerState)
onPlayerStateChanged(player, newPlayerState)
end)
end
-- ตัดการเชื่อมต่อจากคุณสมบัติที่เปลี่ยนการเชื่อมต่อเมื่อผู้เล่นออก
local function onPlayerRemoving(player: Player)
if attributeChangedConnectionByPlayer[player] then
attributeChangedConnectionByPlayer[player]:Disconnect()
attributeChangedConnectionByPlayer[player] = nil
end
end
คุณสามารถดูได้ว่าทั้งสองฟังก์ชันที่เชื่อมต่อกันใน onPlayerAdded() เรียก onPlayerStateChanged()ในระหว่างการติดตั้งครั้งแรกหลังจากผู้เล่นจัดเรียงเป็นทีม onPlayerAdded() ตั้ง PlayerState เป็น SelectingBlaster ดังนั้นคำสั่งแรก if จะประเมินเป็นเท็จและปิดใช้งาน BlasterStateในส่วนต่อไป ใช้งานเบลาสเตอร์ ของบทแนะนำการใช้งานคุณจะได้เรียนรู้รายละเอียดเพิ่มเติมเกี่ยวกับกระบวนการนี้
ผู้จัดการสถานะผู้เล่น
local function onPlayerStateChanged(player: Player, newPlayerState: string)
-- สถานะบลาสเตอร์เป็น 'พร้อม' เฉพาะถ้าสถานะผู้เล่นเป็น 'กำลังเล่น'
local newBlasterState = if newPlayerState == PlayerState.Playing then BlasterState.Ready else BlasterState.Disabled
-- กำหนดเวลาการทำลายฟิลด์โลจิสติกเมื่อผู้เล่นเริ่มเล่น
if newPlayerState == PlayerState.Playing then
scheduleDestroyForceField(player)
end
player:SetAttribute(PlayerAttribute.blasterStateServer, newBlasterState)
end
หากคุณเพิ่มจุดหยุดหรือแม้แต่แค่คําสั่ง print() คุณสามารถดูได้ว่า onPlayerStateChanged() ได้รับการเรียกบ่อยตลอดทั้งประสบการณ์: เช่นในระหว่างการติดตั้งครั้งแรกของรอบ, เพื่อให้ตัวเองอยู่บนเส้นทางโค้ดหลัก, หลังจากที่ผู้เล่นเลือกบลาสเตอร์, และเมื่อผู้เล่นกลับไปที่ล็อบบี้หรือสถานที่เกิด เป็นกลาง นอกจากนี้หลังจากที่ผู้เล่นเลือกบลาสเตอร์แล้ว ServerScriptService > BlasterSelectedHandler ตั้งค่า PlayerState เป็น Playing และ PlayerStateHandler สามารถลบฟิลด์แรงโน้มถ่วงได้โดยการเรียก scheduleDestroyForceField()
ปรับแต่งฟิลด์พลังงาน
แทนที่จะใช้การดําเนินการแบบกําหนดเอง ประสบการณ์แท็กเลเซอร์ตัวอย่างใช้คลาส ForceField ที่สร้างไว้ล่วงหน้าของ Studio เพื่อป้องกันไม่ให้ผู้เล่นได้รับความเสียหายในขณะที่พวกเขากําลังเลือกบลาสเตอร์สิ่งนี้ช่วยให้แน่ใจว่าความต้องการเดียวสำหรับผู้เล่นที่จะเกิดขึ้นพร้อมกับฟิลด์พลังคือการรวมตำแหน่งเกิดที่มีคุณสมบัติ SpawnLocation.Duration ที่มากกว่า 0ตัวอย่างใช้ค่าสุ่มของ 9,999 เพื่อเปิดใช้งานฟิลด์แรง จากนั้นจะจัดการระยะเวลาจริงโดยการโปรแกรมใน ReplicatedStorage > ForceFieldClientVisuals คล้ายกับ setupHumanoidAsync ส่วนใหญ่ของบรรทัดใน ForceFieldClientVisuals เป็นตัวเลือกตัวอย่างเช่น หากคุณแสดงความคิดเห็นเกี่ยวกับเนื้อหาของฟังก์ชันเช่นในสคริปต์ต่อไปนี้ ประสบการณ์จะใช้ฟิลด์พลังงานประกายไฟเริ่มต้นแทนสคริปต์หกเหลี่ยมใน StarterGui > ForceFieldGui
แสดงความคิดเห็นเกี่ยวกับคุณสมบัติใน ForceFieldClientVisuals
local function onCharacterAddedAsync(character: Model)
-- ฟอร์ซฟิลด์ท้องถิ่น = ตัวละคร:WaitForChild("ForceField", 3)
-- ถ้าไม่ใช่ forceField แล้ว
-- กลับ
-- ปิด
-- forceField.Visible = ปิด
-- localPlayer.PlayerGui:WaitForChild("ForceFieldGui") เปิดใช้งานแล้ว = จริง
-- forceField.Destroying: รอ()
-- localPlayer.PlayerGui.ForceFieldGui.Enabled = ไม่มี
end
เนื่องจากฟิลด์พลังที่กำหนดเองเป็น GUI มากกว่าฟิลด์ใหม่ ดังนั้นสคริปต์ จะมีผลต่อภาพการมองเห็นของบุคคลที่หนึ่งสำหรับผู้เล่นแต่ละคนเท่านั้น ไม่ใช่ภาพการมองเห็นของบุคคลที่สามเมื่อผู้เล่นมองไปที่ผู้เล่นคนอื่นภาพวาดมุมมองบุคคลที่สามเก็บรูปลักษณ์เริ่มต้นของ Roblox ไว้สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการแก้ไขฟิลด์แรงดูที่ ForceField.Visible


ฟอร์ซฟิลด์มีประโยชน์เพราะให้เวลาผู้เล่นเพียงพอระหว่างการผลิตและการฟื้นฟูโดยไม่ต้องกังวลเกี่ยวกับผู้เล่นศัตรู แต่ในที่สุดพวกเขาจะต้องหายไปสําหรับเกมเพลย์เลเซอร์หลักสคริปที่จัดการการลบฟิลด์แรงอยู่ใน ReplicatedStorage > scheduleDestroyForceField และตรวจสอบสามเงื่อนไขที่ไม่ซ้ำกัน:
- หลังจากที่ผู้เล่นเลือกบลาสเตอร์แล้ว ฟิลด์แรงจำเป็นต้องอยู่ได้นานพอที่จะให้ผู้เล่นสามารถปรับตัวให้เข้ากับสภาพแวดล้อมได้
- ในระหว่างเวลาปรับตัวนี้ ฟิลด์แรงไม่สามารถเป็นประโยชน์ได้ ดังนั้นพวกเขาจึงต้องหายไปในช่วงเวลาที่ผู้เล่นระเบิดเบลาสเตอร์ของพวกเขา
- ฟิลด์พลังต้องหายไปเมื่อผู้เล่นรีเซ็ตตัวละครของพวกเขาก่อนที่จะระเบิดหรือก่อนที่เวลาฟิลด์พลังจะหมด
แต่ละครั้งของการตรวจสอบเหล่านี้ในการเรียกสคริปต์ scheduleDestroyForceField สำหรับเงื่อนไขเหล่านี้ endForceField()
กำหนดเวลาทำลายฟอร์ซฟิลด์
-- สนามแรงดันสิ้นสุดหากผู้เล่นระเบิด
local blasterStateAttribute = getBlasterStateAttribute()
attributeChangedConnection = player:GetAttributeChangedSignal(blasterStateAttribute):Connect(function()
local currentBlasterState = player:GetAttribute(blasterStateAttribute)
if currentBlasterState == BlasterState.Blasting then
endForceField()
end
end)
-- สนามแรงดึงสิ้นสุดหากผู้เล่นรีเซ็ต
characterRespawnedConnection = player.CharacterRemoving:Connect(endForceField)
-- ฟิลด์แรงสิ้นสุดหลังจาก 8 วินาที
task.delay(MAX_FORCE_FIELD_TIME, endForceField)
endForceField() รวมถึงคำอ้างแปลกประหลาด if รอบ forceFieldEnded บูลีนเนื่องจากการตรวจสอบทำงานตามลําดับ สคริปต์สามารถเรียกฟังก์ชัน endForceField() ได้สองหรือสามครั้งบูลีน forceFieldEnded รับประกันว่าฟังก์ชันจะพยายามทำลายฟิลด์แรงเพียงครั้งเดียว
กำหนดเวลาทำลายฟอร์ซฟิลด์
local function endForceField()
if forceFieldEnded then
return
end
forceFieldEnded = true
attributeChangedConnection:Disconnect()
characterRespawnedConnection:Disconnect()
destroyForceField(player)
end
จัดการสถานะของไคลเอนต์
ในขณะที่ส่วนใหญ่ของส่วนนี้มุ่งเน้นไปที่ ServerScriptService > PlayerStateHandler มีสคริปต์อีกตัวหนึ่งที่มีชื่อเดียวกันใน ReplicatedStorage เหตุผลของการแยกคือสถาปัตยกรรมไคลเอนต์-เซิร์ฟเวอร์:
ลูกค้าต้องเข้าใจข้อมูลสถานะผู้เล่นเพื่อให้สามารถตอบสนองได้อย่างเหมาะสมในเวลาจริง เช่น แสดงองค์ประกอบอินเทอร์เฟซผู้ใช้ที่ถูกต้องหรือเปิดใช้งานให้ผู้เล่นสามารถเคลื่อนที่และระเบิดได้
เซิร์ฟเวอร์ต้องการข้อมูลเหมือนกันทั้งหมดเพื่อป้องกันการโจมตีตัวอย่างเช่น เซิร์ฟเวอร์ยังต้องการสถานะผู้เล่นเพื่อดำเนินการเช่นการสร้างและสวมใส่ตัวละครปิดใช้งานฟิลด์แรงและแสดงลีดเดอร์บอร์ดนี่คือเหตุผลที่สคริปต์นี้อยู่ใน ReplicatedStorage ตารางอันดับ
เพื่อดูโลจิกหลักนี้ ตรวจสอบสคริปต์ต่อไปนี้ใน ReplicatedStorage > PlayerStateHandler ที่ตรวจสอบสถานะปัจจุบันของผู้ใช้แล้วเรียกฟังก์ชันที่เหมาะสมที่จัดการการกระทำที่เกี่ยวข้องกับสถานะนั้น
ผู้จัดการสถานะผู้เล่น
local function onPlayerStateChanged(newPlayerState: string)
if newPlayerState == PlayerState.SelectingBlaster then
onSelectingBlaster()
elseif newPlayerState == PlayerState.Playing then
onPlaying()
elseif newPlayerState == PlayerState.TaggedOut then
onTaggedOut()
elseif newPlayerState == PlayerState.InLobby then
onInLobby()
else
warn(`Invalid player state ({newPlayerState})`)
end
end
คําตอบกิจกรรมทั้งหมดจะถูกจัดเป็นกลุ่มอย่างมีเหตุผลในสคริปต์นี้เนื่องจากต้องการพฤติกรรมที่คล้ายกันในการเปิดใช้งานหรือปิดใช้งานการควบคุมผู้เล่น การเคลื่อนไหวของกล้อง และชั้น UI ที่มองเห็นได้ตัวอย่างเช่นในระหว่างการเลือกบลาสเตอร์ผู้เล่นจะต้องมีทั้งความไม่สามารถถูกทำลายและไม่สามารถย้ายได้เซิร์ฟเวอร์จัดการฟิลด์แรงแล้ว แต่ไคลเอนต์จัดการการเคลื่อนที่เพื่อสาธิตถ้าคุณตรวจสอบโลจิกสำหรับฟังก์ชัน onSelectingBlaster() คุณสามารถดูได้ว่าไคลเอนต์ปิดการเคลื่อนไหวของผู้เล่นในขณะที่พวกเขากำลังเลือกบลาสเตอร์
ผู้จัดการสถานะผู้เล่น
local function onSelectingBlaster()
togglePlayerCamera(true)
togglePlayerMovement(false)
setGuiExclusivelyEnabled(playerGui.PickABlasterGui)
localPlayer:SetAttribute(PlayerAttribute.blasterStateClient, BlasterState.Disabled)
end
ฟังก์ชัน onPlaying() เป็นไปอย่างเรียบง่ายเช่นเดียวกันมันเปิดใช้งานการเคลื่อนไหว การเปลี่ยนเส้นทางไปยังหน้าจอแสดงข้อมูลหลัก (HUD) เปิดใช้งานตัวเร่งและเรียกใช้ฟังก์ชันฟิลด์พลังงานเดียวกับเซิร์ฟเวอร์
ผู้จัดการสถานะผู้เล่น
local function onPlaying()
togglePlayerMovement(true)
setGuiExclusivelyEnabled(playerGui.HUDGui)
localPlayer:SetAttribute(PlayerAttribute.blasterStateClient, BlasterState.Ready)
scheduleDestroyForceField()
end
เลือกตัวละครใหม่
ประสบการณ์แท็กเลเซอร์ตัวอย่างจัดการการเกิดใหม่ของตัวละครกลับสู่รอบผ่านสถานะ onTaggedOut() ใน ReplicatedStorage > PlayerStateHandler เช่นเดียวกับสถานะ onSelectingBlaster() และ onPlaying() สถานะ onTaggedOut() กระตุ้นพฤติกรรมที่ไม่ซ้ำกันตามการเปลี่ยนแปลงของคุณสมบัติ playerStateโดยเฉพาะอย่างยิ่ง มันปิดการเคลื่อนไหวของผู้เล่น นำเสนอ UI การเกิดใหม่ และปิดการใช้งานเบลาสเตอร์
ผู้จัดการสถานะผู้เล่น
local function onTaggedOut()
-- ปิดการควบคุมเมื่อถูกแท็กออก
togglePlayerMovement(false)
togglePlayerCamera(false)
setGuiExclusivelyEnabled(playerGui.OutStateGui)
-- ปิดใช้งานเบลาสเตอร์ในขณะที่ถูกแท็กออก
localPlayer:SetAttribute(PlayerAttribute.blasterStateClient, BlasterState.Disabled)
end
หากต้องการทดสอบพฤติกรรมนี้ คุณสามารถกด Esc ไปที่แท็บ การตั้งค่า จากนั้นคลิกปุ่ม รีเซ็ตตัวละคร สังเกตว่าเมื่อคุณกระตุ้นหน้าจอเกิดใหม่ คุณไม่สามารถย้าย หมุนกล้อง หรือระเบิดเบลาสเตอร์ของคุณได้


เป็นสิ่งสำคัญที่ต้องทราบว่าสคริปต์นี้ไม่ได้จริงๆสร้างตัวละครใหม่อีกครั้ง มันเพียงหยุดพวกเขาจากการกระทำและให้ข้อเสนอแนะทางภาพแก่ผู้เล่นที่เซิร์ฟเวอร์ กําลังสร้างตัวละครของพวกเขา เพื่อสาธิตถ้าคุณตรวจสอบ ServerScriptService > SetupHumanoid > setupHumanoidAsync > onHumanoidDied , สคริปต์จะตั้งค่า ไปยัง ReplicatedStorage > PlayerStateHandler และเพิ่มตัวบ่งบอกทางภาพบางอย่างโลจิสติกที่แท้จริงของการเกิดใหม่คือพฤติกรรม Roblox ที่ติดตั้งไว้ล่วงหน้า
เมื่อผู้เล่นเกิดใหม่ในรอบนั้นพวกเขาจะเกิดใหม่ที่ตำแหน่งจุดเกิดของทีมตามคุณสมบัติ SpawnLocation.TeamColorเพื่อปรับเวลาการเกิดใหม่ตามต้องการ คุณสามารถเพิ่มบรรทัดต่อไปนี้ไปที่ด้านบนของ SetupHumanoidเพื่อเรียนรู้เพิ่มเติมเกี่ยวกับเทคนิคนี้ ดู Players.RespawnTime
ติดตั้ง Humanoid
local Players = game:GetService("Players")Players.RespawnTime = 10 -- new line, in seconds
การตั้งค่าอื่นๆ
ในฐานะส่วนหนึ่งของการตั้งค่าเบื้องต้น ประสบการณ์แท็กเลเซอร์ตัวอย่างยังดำเนินการบางขั้นตอนเล็ก ๆ แต่สำคัญ:
ประสบการณ์รวมถึงสคริปต์ว่างชื่อ StarterPlayer > StarterCharacterScripts > สุขภาพ ที่ปิดการฟื้นฟูสุขภาพ Roblox เริ่มต้นสำหรับคำอธิบายเกี่ยวกับพฤติกรรมของคุณสมบัตินี้ ดู Humanoid.Health
ประสบการณ์ใช้กล้องบุคคลที่หนึ่งโดยการตั้งค่าคุณสมบัติ StarterPlayer.CameraMode.LockFirstPersonโปรดทราบว่าหากคุณต้องการให้ผู้ใช้เปลี่ยนระหว่างกล้องบุคคลที่หนึ่งและบุคคลที่สาม คุณต้องเปลี่ยนคุณสมบัติโดยการเขียนโปรแกรมแทนที่จะตั้งค่าเพียงครั้งเดียวใน Studio และปรับแต่งการควบคุมและอินเทอร์เฟซผู้ใช้เพื่อชดเชยการเปลี่ยนแปลงในมุมมอง
ประสบการณ์ใช้ลีดเดอร์บอร์ด Roblox ที่มีอยู่ด้วยหน่วย "จุด" ซึ่งผู้เล่นได้รับในแต่ละครั้งที่พวกเขาแท็กผู้เล่นคนอื่นออกคุณสามารถดูการกำหนดค่าใน ServerScriptService > ตั้งค่ากระดานผู้นำ แต่ ในประสบการณ์กระดานผู้นำ เสนอภาพรวมโดยรวมโปรดทราบว่า onPlayerTagged ตารางอันดับเพิ่มรอบ และ ตรวจจับการโจมตี
ตอนนี้ผู้เล่นสามารถสร้างได้แล้ว เลือกบลาสเตอร์และเล็งจากมุมมองบุคคลที่หนึ่ง การเล่นเกม