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

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

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

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

สคริปต์เซิร์ฟเวอร์ - โทรโมเดลตัวละคร
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 ศัตรูเกิดขึ้นในโลก ให้กำหนดแอตทริบิวต์ attribute เช่น 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. IMPORTANT
    สำรองเกมของคุณ การแปลงอาจเป็นกระบวนการที่ซับซ้อน ดังนั้นคุณควร เสมอ บันทึกสำรอง (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 เป็นส่วนหนึ่งของเครื่องหมายการค้าที่จดทะเบียน และไม่ได้จดทะเบียนของเราในสหรัฐฯ และประเทศอื่นๆ