เกิดและเกิดใหม่

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

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

ใช้ประสบการณ์แท็กเลเซอร์ตัวอย่าง เป็นการอ้างอิง ในส่วนนี้ของบทแนะนำการสอนคุณวิธีใช้และปรับแต่งคุณลักษณะที่สร้างไว้ของ Roblox เพื่อจัดการการเกิดและการเกิดใหม่ รวมถึงคำแนะนำในการเขียนสคริปต์เกี่ยวกับ:

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

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

กำหนดตำแหน่งการเกิด

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

เพื่อต่อสู้กับปัญหานี้ประสบการณ์แท็กเลเซอร์ตัวอย่างจะกำหนดตำแหน่งการเกิดทั้งสองด้วยค่า Neutral คุณสมบัติที่ตั้งเป็น false เพื่อจํากัดผู้เล่นของทีมตรงข้ามจากการเกิดในโซนการเกิดที่ผิด และค่า TeamColor คุณสมบัติที่ตั้งเป็น Team.Color ค่าที่เทียบเท่ากับค่า จาก กําหนดสีทีม ในส่วนก่อนหน้าของบทแนะนําการสอน:

  • TeamASpawn – ตำแหน่งการเกิดในโซนการเกิดของทีมสีเขียวที่มีคุณสมบัติ TeamColor ตั้งค่าเป็น Mint * TeamBSpawn – ตำแหน่งการเกิดในโซนการเกิดของทีมสีชมพูที่มีคุณสมบัติ TeamColor กำหนดเป็น Carnation Pink
สร้างทีม

สร้างทีมBSpawn
>

เมื่อผู้เล่นเข้าร่วมประสบการณ์ 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 ผลลัพธ์จะให้จุดเริ่มต้นที่ดีสำหรับการเข้าใจการตั้งค่าเบื้องต้นของประสบการณ์

Studio's Find All window with the Players.PlayerAdded results highlighted.

เพื่อสาธิต, เปิด 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 หากคุณเปลี่ยนค่าของคุณสมบัติเหล่านี้ เป็นสิ่งสำคัญที่ต้องทดสอบเพื่อให้คุณสามารถดูผลกระทบของการตั้งค่าใหม่ได้คุณสามารถสร้างใหม่ประสบการณ์ที่ผู้เล่นได้รับในสภาพแวดล้อมของผู้เล่นหลายคนโดยเลือกอย่างน้อยสองตัวละครในส่วน ไคลเอนต์และเซิร์ฟเวอร์ ของแท็บ ทดสอบ
Studio's Test tab with the the players dropdown highlighted. This setting needs to be at least two players to see the impact of your new settings.

อีกตัวอย่างหนึ่งของอีเวนต์ 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

First-person force field visuals include a futuristic hexagonal grid on the perimeter of the screen.
ภาพฟิลด์แรงบุคคลที่หนึ่ง
Third-person force field visuals include a blue sparkling orb around the player spawning into the experience.
ภาพฟิลด์พลังงานบุคคลที่สาม

ฟอร์ซฟิลด์มีประโยชน์เพราะให้เวลาผู้เล่นเพียงพอระหว่างการผลิตและการฟื้นฟูโดยไม่ต้องกังวลเกี่ยวกับผู้เล่นศัตรู แต่ในที่สุดพวกเขาจะต้องหายไปสําหรับเกมเพลย์เลเซอร์หลักสคริปที่จัดการการลบฟิลด์แรงอยู่ใน 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 ไปที่แท็บ การตั้งค่า จากนั้นคลิกปุ่ม รีเซ็ตตัวละคร สังเกตว่าเมื่อคุณกระตุ้นหน้าจอเกิดใหม่ คุณไม่สามารถย้าย หมุนกล้อง หรือระเบิดเบลาสเตอร์ของคุณได้

Roblox's settings menu with the Reset Character button highlighted.
ปุ่มรีเซ็ตตัวละคร
The respawn screen displays as a player respawns back into the round.

หน้าจอเกิดใหม่
>

เป็นสิ่งสำคัญที่ต้องทราบว่าสคริปต์นี้ไม่ได้จริงๆสร้างตัวละครใหม่อีกครั้ง มันเพียงหยุดพวกเขาจากการกระทำและให้ข้อเสนอแนะทางภาพแก่ผู้เล่นที่เซิร์ฟเวอร์ กําลังสร้างตัวละครของพวกเขา เพื่อสาธิตถ้าคุณตรวจสอบ 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 ตารางอันดับเพิ่มรอบ และ ตรวจจับการโจมตี

ตอนนี้ผู้เล่นสามารถสร้างได้แล้ว เลือกบลาสเตอร์และเล็งจากมุมมองบุคคลที่หนึ่ง การเล่นเกม