เทคนิคและการแปลง

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

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

คุณสมบัติการสตรีม

เมื่อ StreamingEnabled ถูกเปิดใช้งานสำหรับวัตถุ Workspace ใน Studio ให้ตั้งค่าคุณสมบัติที่เกี่ยวข้องเป็นค่าที่แนะนำดังต่อไปนี้:

คุณสมบัติคำแนะนำ
EnableSLIMAvatarsใช้ Enabled เพื่อเรนเดอร์อวตาร R15 เป็นแบบเบาและเคลื่อนไหวเมื่อเหมาะสม ดูข้อมูลเพิ่มเติมที่ SLIM avatars
ModelStreamingBehaviorใช้ Improved เพื่อเปิดใช้งานการสตรีมที่มีประสิทธิภาพที่สุดสำหรับ Models ที่มีลูกหลาน BasePart
StreamingIntegrityModeใช้ PauseOutsideLoadedArea เพื่อรักษาความสมบูรณ์ของการเล่นเกมโดยไม่หยุดชะงักโดยไม่จำเป็นหรือบ่อยเกินไป
StreamingMinRadiusใช้ค่าเริ่มต้นที่ 64 เพื่อเพิ่มขีดความสามารถในการปรับขนาดเกมให้เหมาะสมสำหรับอุปกรณ์ที่มีประสิทธิภาพต่ำ
StreamingTargetRadiusใช้ค่าเริ่มต้นที่ 1024 เพื่อสร้างสมดุลที่ดีระหว่างการมองเห็นสำหรับผู้เล่นในอุปกรณ์ที่มีประสิทธิภาพสูงและการใช้หน่วยความจำที่เหมาะสม
StreamOutBehaviorใช้ Opportunistic เพื่อให้ไคลเอนต์สามารถเก็บขยะเนื้อหาได้อย่างเข้มข้น ลดการใช้หน่วยความจำอย่างมีนัยสำคัญและช่วยป้องกันการชนิดหน่วยความจำหมด

ระดับรายละเอียดของโมเดล

Model.LevelOfDetail ช่วยเติมเนื้อหาของ Model ที่ไม่ได้สตรีมด้วยเมชแบบเบาหรือแบบเลียนแบบ ทำให้โลกดูสมบูรณ์ทางสายตา SLIM (Scalable Lightweight Interactive Models) มีประสิทธิภาพโดยเฉพาะ เนื่องจากผู้เล่นมักไม่สามารถแยกแยะเมช SLIM ออกจากต้นฉบับที่ถูกสตรีมเข้ามาได้

เพื่อผลลัพธ์ที่ดีที่สุด:

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

โครงสร้างโมเดล

นอกเหนือจากการตั้งค่า ระดับรายละเอียดของโมเดล โครงสร้างและการตั้งค่าของ Models ของคุณมีผลกระทบอย่างมากต่อประสิทธิภาพการสตรีม เมื่อคุณสร้างหรือแปลงเกมที่มีอยู่:

  • ใช้โมเดลอะตอมสำหรับการจัดกลุ่มตรรกะ — เมื่อสคริปต์ต้องเข้าถึงชิ้นส่วนทั้งหมดภายในโมเดล ให้ตั้งค่า ModelStreamingMode เป็น Atomic สิ่งนี้ช่วยให้สคริปต์ด้านไคลเอนต์สามารถเข้าถึงอินสแตนซ์ภายในโมเดลได้อย่างปลอดภัยโดยไม่ต้องใช้ WaitForChild() มากเกินไป (แม้ว่าสคริปต์ดังกล่าวยังต้องใช้ WaitForChild() สำหรับโมเดลอะตอมโดยรวม)

  • ลดโมเดลที่คงอยู่ — โมเดลที่ คงอยู่ จะโหลดหลังจากเข้าร่วมและไม่เคยสตรีมออก ทำให้ใช้หน่วยความจำถาวร ตั้งค่า ModelStreamingMode ของโมเดลเป็น Persistent เฉพาะเมื่อมัน ต้อง คงอยู่และเข้าถึงได้จากสคริปต์ตลอดเวลา

  • แยกโมเดลคอนเทนเนอร์ — รูปแบบการไม่สตรีมทั่วไปคือโมเดล Model ขนาดใหญ่ที่มี NPCs, props หรือกลุ่มที่คล้ายกันอยู่มากมาย ภายใต้การสตรีม โมเดลคอนเทนเนอร์จะลดประสิทธิภาพการสตรีมและไม่เหมาะสมสำหรับ ระดับรายละเอียดของโมเดล ซึ่งทำงานได้ดีที่สุดกับอินสแตนซ์ที่จัดกลุ่มอย่างใกล้ชิด แยกโมเดลคอนเทนเนอร์ออกเป็นโมเดลขนาดเล็กที่มีชิ้นส่วนที่อยู่ใกล้กันทางกายภาพหรือเกี่ยวข้องกันทางตรรกะ

  • ทำให้โครงสร้างโมเดลที่ซ้อนลึกเรียบง่าย — การซ้อนโมเดล คงอยู่ ภายในโมเดล อะตอม จะทำให้โมเดลอะตอมทำงานเหมือนโมเดลคงอยู่ โครงสร้างที่เรียบง่ายจะทำให้เข้าใจได้ง่ายขึ้นภายใต้การสตรีม

อวตาร SLIM

อวตารของแพลตฟอร์มนอกพื้นที่ที่ถูกสตรีมในปัจจุบันจะไม่สามารถมองเห็นได้ตามค่าเริ่มต้น แต่การเปิดใช้งาน Workspace.EnableSLIMAvatars จะเรนเดอร์อวตาร R15 เป็นแบบเบาและเคลื่อนไหวเมื่อเหมาะสม โดยมีการทำงานของเอนจินดังนี้:

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

อวตาร SLIM รองรับตัวละครผู้เล่น R15 ที่มีร่างกาย หัวแบบไดนามิก, มาตรฐาน หรือ ขั้นสูง R15 rig และอุปกรณ์เสริมที่แข็งหรือชั้น อวตาร R6, NPCs และอวตารที่มีสัดส่วนที่กำหนดเองจะถูกยกเว้น สำหรับรายการเต็มของการกำหนดค่าของอวตารที่รองรับและยกเว้น ข้อมูลประสิทธิภาพ และเคล็ดลับการแก้ไขปัญหา ดูที่ SLIM avatars

รูปแบบสคริปต์

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

ดัชนีโดยตรงไปยังลูกหลาน

การดัชนีไปยังลูกหลานของ Workspace ด้วยตัวดำเนินการ . จะทำให้เกิดข้อผิดพลาดหากอินสแตนซ์ใด ๆ ในเส้นทางไม่ได้ถูกสตรีมเข้ามาในขณะนั้น สิ่งเดียวกันนี้ใช้กับ FindFirstChild(), FindFirstChildWhichIsA() และ FindFirstChildOfClass() ซึ่งจะคืนค่า nil หากลูกหลานยังไม่ได้ถูกสตรีมเข้ามา

การค้นหาลูกหลาน
local house1 = workspace:FindFirstChild("House1") -- nil หาก "House1" ยังไม่ได้ถูกสตรีมเข้ามา
local door = workspace.House1.Door -- ขัดข้องหาก "House1" หรือ "Door" ยังไม่ได้ถูกสตรีมเข้ามา

รูปแบบที่คล้ายกันคือการเข้าถึง Humanoid หรือลูกหลานตัวละครอื่น ๆ โดยตรงภายในการเชื่อมต่อ Player.CharacterAdded ภายใต้การสตรีม โมเดลตัวละครจะถูกจัดให้อยู่ใน Workspace ก่อนที่ลูกหลานทั้งหมดจะถูกทำซ้ำ ดังนั้นการดัชนีโดยตรงจึงล้มเหลว

ลูกหลานตัวละคร
local Players = game:GetService("Players")
local player = Players.LocalPlayer
player.CharacterAdded:Connect(function(character)
local humanoid = character.Humanoid
end)

หากสคริปต์ไม่สามารถดำเนินการต่อได้โดยไม่มีอินสแตนซ์ ให้รอด้วย WaitForChild():

การค้นหาลูกหลาน
local house1 = workspace:WaitForChild("House1")
local door = house1:WaitForChild("Door")

อินสแตนซ์ที่ส่งไปยังระยะไกล

สัญญาณ RemoteEvent/RemoteFunction และอินสแตนซ์ที่มันอ้างถึงเดินทางอย่างอิสระ ดังนั้นสัญญาณอาจมาถึงที่ไคลเอนต์ก่อนที่อินสแตนซ์จะมีอยู่ — หรืออินสแตนซ์อาจไม่มีอยู่เลย สาเหตุที่น่าจะเป็นไปได้สองประการ ได้แก่:

  • ภายใต้การสตรีม อาจมีความล่าช้าระหว่างเมื่อชิ้นส่วน/โมเดลถูกสร้างขึ้นบนเซิร์ฟเวอร์และเมื่อมันถูกทำซ้ำไปยังไคลเอนต์ โดยมีผลให้ชิ้นส่วนที่อ้างถึงโดย RemoteEvent/RemoteFunction อาจยังไม่มีอยู่เลย แม้ในพื้นที่ที่ถูกสตรีม

  • การส่งการอ้างอิงชิ้นส่วน/โมเดลจากเซิร์ฟเวอร์ไปยังไคลเอนต์ผ่าน RemoteEvent หรือ RemoteFunction ต้องการให้มีการทำซ้ำอินสแตนซ์ไปยังไคลเอนต์ที่รับ การส่งเส้นทางอินสแตนซ์เป็นสตริงมีปัญหาเดียวกัน เนื่องจากเส้นทางอาจชี้ไปยังตำแหน่งที่ไม่มีอยู่บนไคลเอนต์:

    สคริปต์ไคลเอนต์
    local ReplicatedStorage = game:GetService("ReplicatedStorage")
    local remoteEvent = ReplicatedStorage:FindFirstChildOfClass("RemoteEvent")
    remoteEvent.OnClientEvent:Connect(function(data)
    local checkpoint = data.checkpoint -- ข้อผิดพลาดหาก "checkpoint" ยังไม่ได้ถูกสตรีมเข้ามา
    local level = workspace.Levels[data.levelPath] -- ข้อผิดพลาดหากเส้นทางยังไม่ได้ถูกสตรีมเข้ามา
    end)

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

การไม่ซิงโครไนซ์ของไคลเอนต์

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

ตัวอย่างเช่น การเปลี่ยนพ่อแม่ของอินสแตนซ์ในท้องถิ่นจาก ReplicatedStorage ไปยัง Workspace อาจทำให้มีสิทธิ์ในการถูกสตรีมออก โมเดลที่ถูกโคลนในท้องถิ่น (Instance:Clone()) จาก ReplicatedStorage ไปยัง Workspace จะสร้างสำเนาเฉพาะของไคลเอนต์ที่ไม่เป็นส่วนหนึ่งของกระบวนการทำซ้ำของเซิร์ฟเวอร์และจะไม่ได้รับการอัปเดตคุณสมบัติจากอินสแตนซ์ที่เป็นเจ้าของเซิร์ฟเวอร์เดิม

แนวคิดเดียวกันนี้ใช้ได้เมื่อเรียก Instance:Destroy() บนวัตถุที่เป็นเจ้าของเซิร์ฟเวอร์ สิ่งนี้จะลบอินสแตนซ์ในท้องถิ่น แต่เซิร์ฟเวอร์ยังคงมีอยู่ ดังนั้นมันจะถูกสตรีมเข้ามาอีกครั้งด้วยสถานะเดิมเมื่อมีสิทธิ์

การสตรีมเชิงรุก

เมื่อจุดหมายถัดไปของผู้เล่นสามารถคาดการณ์ได้ ให้ทำการเรียกจากเซิร์ฟเวอร์ไปยัง Player:RequestStreamAroundAsync() เพื่อสตรีมพื้นที่ชั่วคราวสำหรับการโหลดชั่วคราว หรือใช้ Player:AddReplicationFocus() ในระดับ จำกัด สำหรับพื้นที่ที่ควรคงอยู่จนกว่าจะถูกปล่อยอย่างชัดเจน

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

สคริปต์เซิร์ฟเวอร์ - โทรโมเดลตัวละครผู้เล่น
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")
local function teleportPlayer(player, teleportTarget)
-- ขอให้สตรีมรอบตำแหน่งเป้าหมาย
player:RequestStreamAroundAsync(teleportTarget)
-- โทรโมเดลตัวละคร
local character = player.Character
if character and character.Parent then
local currentPivot = character:GetPivot()
character:PivotTo(currentPivot * CFrame.new(teleportTarget))
end
end
-- เรียกฟังก์ชันโทรเมื่อไคลเอนต์ส่งเหตุการณ์ระยะไกล
teleportEvent.OnServerEvent:Connect(teleportPlayer)

การอ่านคุณสมบัติของอินสแตนซ์

เมื่ออินสแตนซ์ถูกสตรีมออก การอัปเดตคุณสมบัติของมันจะไม่ถูกทำซ้ำไปยังไคลเอนต์นั้นอีกต่อไป การอ่านคุณสมบัติเช่น BasePart.Position ยังคงสำเร็จ แต่จะคืนค่าค่าที่ถูกทำซ้ำล่าสุดซึ่งอาจล้าสมัยได้

local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- ตำแหน่งอาจล้าสมัยหาก "target" ถูกสตรีมออก
local dist = (target.Position - player.Character.HumanoidRootPart.Position).Magnitude

ย้ายตรรกะไปยังเซิร์ฟเวอร์ เนื่องจากสคริปต์ด้านเซิร์ฟเวอร์เห็นอินสแตนซ์ทั้งหมดตลอดเวลา นี่เป็นตัวเลือกที่เชื่อถือได้ที่สุดสำหรับการตรวจสอบระยะทางและตรรกะที่ไวต่อการตำแหน่งอื่น ๆ

รอในเส้นทางที่สำคัญ

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

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

การจัดการการเปลี่ยนสัญญาณ

สัญญาณเช่น Instance.ChildAdded/Instance.ChildRemoved และสัญญาณ CollectionService เช่น GetInstanceAddedSignal() หรือ GetInstanceRemovedSignal() จะถูกเรียกใช้เมื่อมีการสตรีมเข้า/ออก ซึ่งไม่สามารถแยกแยะได้จากการเกิด/การลบจริง สคริปต์ที่รับไม่สามารถบอกความแตกต่างจากสัญญาณเพียงอย่างเดียว ดังนั้นตรรกะที่สมมติว่าสัญญาณสอดคล้องกับเหตุการณ์ "จริง" ต้องได้รับการปรับปรุง

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

การติดตามแอตทริบิวต์
local CollectionService = game:GetService("CollectionService")
local TAG_NAME = "Enemy"
CollectionService:GetInstanceAddedSignal(TAG_NAME):Connect(function(enemy)
if not enemy:GetAttribute("Spawned") then
-- ตั้งค่าแอตทริบิวต์ "Spawned" บนศัตรูสำหรับการเกิดครั้งแรก
enemy:SetAttribute("Spawned", true)
-- เล่นเสียง/เอฟเฟกต์ภาพสำหรับการเกิดครั้งแรกนี้
playSpawnEffects(enemy)
end
end)

การวนซ้ำในคอลเลกชัน

การวนซ้ำในคอลเลกชันด้านไคลเอนต์ เช่น Instance:GetChildren() และ Instance:GetDescendants() จะคืนค่าชุดลูกหลานที่ถูกสตรีมเข้ามาเท่านั้น สิ่งนี้ใช้ได้แม้ว่าแม่จะถูกทำซ้ำเสมอ เช่น Folder ที่อยู่โดยตรงใต้ Workspace ซึ่งลูกหลานเชิงพื้นที่จะถูกสตรีมเข้าและออก

local Players = game:GetService("Players")
local player = Players.LocalPlayer
-- โฟลเดอร์ "Homes" ถูกทำซ้ำเสมอ แต่ลูกหลานของมันจะถูกสตรีมเข้าและออก
-- ลูปนี้อาจพลาดบ้านที่ไม่ได้ถูกสตรีมเข้ามาในขณะนี้
for _, home in workspace.Homes:GetChildren() do
if home.Settings.Owner.Value == player.Name then
return home
end
end

หากต้องการการระบุที่สมบูรณ์ ให้ทำการสแกนบนเซิร์ฟเวอร์และส่งผลลัพธ์ไปยังผู้เล่นผ่าน RemoteEvent หากจำเป็น

การค้นหาทางกายภาพ

การค้นหาทางกายภาพด้านไคลเอนต์ เช่น WorldRoot:Raycast(), WorldRoot:GetPartBoundsInBox(), และ Model:GetBoundingBox() จะสะท้อนเฉพาะเนื้อหาที่ถูกสตรีมเข้ามาเท่านั้น ว่าจะเป็นปัญหาหรือไม่นั้นขึ้นอยู่กับว่าสิ่งที่การค้นหานั้นใช้ทำอะไร

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

รูปแบบอื่น ๆ

รูปแบบต่อไปนี้อาจใช้ได้เช่นกันและควรพิจารณาอย่างรอบคอบ:

  • Sound หรือ AudioPlayer ที่เป็นพ่อแม่ของวัตถุ 3D จะหยุดเมื่อวัตถุที่เกี่ยวข้องถูกสตรีมออก สำหรับเสียงบรรยากาศที่ควรคงอยู่ไม่ว่าจะมีการสตรีมหรือไม่ ให้ทำให้ตัวสร้างเสียงเป็นส่วนหนึ่งของโมเดล คงอยู่ หรือคอนเทนเนอร์ที่ไม่ใช่สตรีม

  • วัตถุ UI ในเกม UI เช่น BillboardGui หรือ SurfaceGui รวมถึง เอฟเฟกต์ภาพ เช่น Beams หรือ Highlights ที่มีการติดตั้งหรือการยึดติดที่ถูกสตรีมออกจะหยุดการเรนเดอร์ สิ่งนี้อาจเป็นพฤติกรรมที่ตั้งใจไว้ แต่คุณควรตรวจสอบให้แน่ใจ

  • เหตุการณ์ BasePart.Touched, ProximityPrompts, DragDetectors, และ ClickDetectors จะไม่ทำงานสำหรับผู้เล่นที่ไคลเอนต์ของพวกเขาไม่มีส่วน/โมเดลที่เกี่ยวข้องถูกสตรีมเข้ามา หากการโต้ตอบต้องเป็นไปได้จากระยะใด ๆ โมเดลต้องเป็น คงอยู่ หรือการโต้ตอบต้องมีกลไกที่แตกต่างกัน

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

สภาพการทดสอบที่สมจริง

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

  • ทดสอบด้วย Workspace.StreamingTargetRadius ตั้งค่าเป็นค่าต่ำสุด (64). ข้อบกพร่องในการสตรีมบางอย่างจะปรากฏเฉพาะเมื่อพื้นที่ที่ถูกสตรีมมีขนาดเล็ก

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

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

  • ตรวจสอบหน้าต่าง Output และ Developer Console สำหรับข้อผิดพลาด เนื่องจากรูปแบบ สคริปต์ หลายรูปแบบผลิตข้อผิดพลาดแทนที่จะเป็นพฤติกรรมที่เงียบสงบ ให้ความสนใจกับข้อผิดพลาดในรูปแบบ attempt to index nil with ... ซึ่งมักจะบ่งชี้ถึงการขาดการเรียก WaitForChild()

  • ติดตั้งและเปิดใช้งาน Tools, ยิงอาวุธ และกระตุ้นการโต้ตอบในเกมต่าง ๆ

ทักษะการแปลงสตรีม AI

เพื่อช่วยในการแปลงและเพิ่มประสิทธิภาพการสตรีม Roblox มี ทักษะการสตรีม AI ที่สามารถเข้าถึงได้จาก MCP server ใน Studio ทักษะนี้จะประเมินเกมของคุณโดยอัตโนมัติ ใช้การกำหนดค่าที่แนะนำ และทำความสะอาดปัญหาความเข้ากันได้ รวมถึง:


ในการใช้ทักษะ AI ในเกมของคุณ:

  1. สำคัญ
    สำรองเกมของคุณ การแปลงอาจเป็นกระบวนการที่ซับซ้อน ดังนั้นคุณควร เสมอ บันทึกสำรอง (File ⟩ Publish to Roblox As) ก่อนที่จะเรียกใช้ทักษะ

  2. คุณสามารถเรียกใช้ทักษะนี้โดยใช้ LLM ใด ๆ ที่คุณต้องการผ่าน Model Context Protocol (MCP) ใน Studio แนะนำให้ใช้โมเดล AI ระดับสูงที่มีหน้าต่างบริบทขนาดใหญ่ ใน Claude Opus การแปลงทั่วไปใช้เวลา 20-30 นาทีและใช้ประมาณ 200,000 โทเค็นของบริบท

    1. เปิดเกมของคุณใน Studio.
    2. ดาวน์โหลดทักษะ และในไคลเอนต์ AI ของคุณ ให้เปิดโฟลเดอร์ที่แตกไฟล์ (roblox-streaming-conversion) เป็นโครงการปัจจุบัน
    3. เรียกใช้ทักษะด้วย /rbx-convert-to-streaming.
    4. เช่นเดียวกับผลลัพธ์ AI ใด ๆ ให้ตรวจสอบผลลัพธ์และทดสอบเกมของคุณอย่างละเอียดภายใต้ สภาพการทดสอบที่สมจริง.
©2026 Roblox Corporation. Roblox, โลโก้ Roblox และ Powering Imagination เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ