การสตรีมตัวอย่างในประสบการณ์ เปิดใช้งานแบบไดนามิก ช่วยให้ Roblox Engine สามารถโหลดและถอด 3D เนื้อหาและตัวอย่างที่เกี่ยวข้องในภูมิภาคของโลกได้อย่างไดนามิกสิ่งนี้สามารถปรับปรุงประสบการณ์ผู้เล่นโดยรวมได้หลายวิธี เช่น:
- เวลาเข้าร่วมที่เร็วขึ้น — ผู้เล่นสามารถเริ่มเล่นในส่วนหนึ่งของโลกในขณะที่โลกส่วนใหญ่โหลดในพื้นหลัง
- ประสิทธิภาพหน่วยความจํา — ประสบการณ์สามารถเล่นบนอุปกรณ์ที่มีหน่วยความจําน้อยลงเนื่องจากเนื้อหาถูกสตรีมไปมาได้อย่างไดนามิกโลกที่มีความสมจริงและละเอียดมากขึ้นสามารถเล่นได้บนอุปกรณ์ที่หลากหลายมากขึ้น
- การดำเนินการ — อัตราเฟรมและประสิทธิภาพที่ดีขึ้นเนื่องจากเซิร์ฟเวอร์สามารถใช้เวลาและความถี่ในการซิงโครไลซ์การเปลี่ยนแปลงระหว่างโลกและผู้เล่นในนั้นได้น้อยลงลูกค้าใช้เวลาน้อยลงในการอัปเดตอินสแตนซ์ที่ไม่เกี่ยวข้องกับผู้เล่นในปัจจุบัน
- ระดับรายละเอียด — รูปแบบและพื้นที่ระยะไกลยังคงมองเห็นได้แม้ว่าจะไม่ถูกสตรีมไปยังไคลเอนต์ก็ตาม เพื่อให้ประสบการณ์เป็นไปอย่างมีประสิทธิภาพโดยไม่ทำลายภาพพื้นหลังทั้งหมด
เปิดใช้งานการสตรีม
การสตรีมตัวอย่างเปิดใช้งานผ่านคุณสมบัติ StreamingEnabled ของวัตถุ พื้นที่ทำงาน ใน Studioคุณสมบัตินี้ไม่สามารถตั้งค่าได้ในสคริปต์การสตรีมเปิดใช้งานโดยค่าเริ่มต้นสำหรับสถานที่ใหม่ที่สร้างใน Studio

เมื่อเปิดใช้งานแล้ว ขอแนะนำให้คุณปฏิบัติตามแนวทางต่อไปนี้:
- เนื่องจากไม่มีลูกค้ามักจะมีทั้งหมด Workspace ที่มีอยู่ในท้องถิ่น ใช้เครื่องมือ/API ที่เหมาะสมเพื่อให้แน่ใจว่าตัวอย่างมีอยู่ก่อนที่จะพยายามเข้าถึงใน LocalScriptตัวอย่างเช่นใช้ การควบคุมการสตรีมตามรูปแบบ , ตรวจจับการสตรีมตัวอย่าง หรือใช้ WaitForChild() บนวัตถุที่อาจไม่มีอยู่
- ลดการวางเนื้อหา 3D นอก Workspaceเนื้อหาในคอนเทนเนอร์เช่น ReplicatedStorage หรือ ReplicatedFirst ไม่สามารถสตรีมได้และอาจส่งผลเสียต่อเวลาเข้าร่วมและการใช้หน่วยความจำ
- หากคุณย้ายตัวละครของผู้เล่นโดยการตั้งค่า CFrame ของมัน, ทำเช่นนั้นจากด้านเซิร์ฟเวอร์ Script และใช้ คําขอการสตรีม เพื่อโหลดข้อมูลรอบตำแหน่งใหม่ของตัวละครได้เร็วขึ้น
- ตั้งค่าผู้เล่นด้วยตนเอง ReplicationFocus เฉพาะในสถานการณ์ที่ไม่ซ้ำกันเช่นในประสบการณ์ที่ไม่ใช้ Player.Characterในกรณีเหล่านี้ ตรวจสอบให้แน่ใจว่าการโฟกัสอยู่ใกล้กับวัตถุที่ผู้เล่นควบคุมเพื่อให้แน่ใจว่าเนื้อหายังคงสตรีมต่อไปรอบจุดสัมผัสของผู้เล่น
พฤติกรรมทางเทคนิค
สตรีมใน
โดยค่าเริ่มต้นเมื่อผู้เล่นเข้าร่วมประสบการณ์ที่มีการสตรีมตัวอย่างเปิดใช้งานแล้ว ตัวอย่างใน Workspace จะถูกส่งไปยังไคลเอนต์ ยกเว้น กำลังติดตาม:
- บุตรหลานของตัวอย่างด้านบน
- ตัวอย่างที่ไม่ซ้ำกัน
จากนั้นในระหว่างการเล่นเกม เซิร์ฟเวอร์อาจสตรีมตัวอย่างที่จำเป็นให้กับไคลเอนต์ตามที่จำเป็น
พฤติกรรมของโมเดล
โมเดลตั้งค่าเป็นพฤติกรรมไม่เป็นค่าเริ่มต้นเช่น สตรีมอะตอม ภายใต้กฎพิเศษตามที่อธิบายไว้ใน การควบคุมการสตรีมตามรูปแบบอย่างไรก็ตาม โมเดลเริ่มต้น (ไม่อะตอม) จะถูกส่งแตกต่างกันขึ้นอยู่กับว่า ModelStreamingBehavior ถูกตั้งค่าเป็น ปกติ ( มรดก ) หรือ ปรับปรุง

เมื่อ ModelStreamingBehavior ถูกตั้งค่าเป็น ปกติ / มรดก คอนเทนเนอร์และบุตรหลานที่ไม่ใช่พื้นที่เช่น จะถูกส่งไปยังไคลเอนต์เมื่อผู้เล่นเข้าร่วมจากนั้นเมื่อมีคุณสมบัติแล้ว สายน้ำของบรรดาลูกหลานของโมเดล BasePart จะไหลเข้ามา
สตรีมออก
ระหว่างการเล่นเกมลูกค้าอาจสตรีมออก (ลบออกจากภูมิภาคของผู้เล่น Workspace ) และสิ่งที่อยู่ภายในพวกเขา BaseParts ขึ้นอยู่กับพฤติกรรมที่กำหนดโดย StreamOutBehaviorกระบวนการเริ่มต้นด้วยภูมิภาคที่ไกลที่สุดจากตัวละครของผู้เล่น (หรือ ReplicationFocus ) และย้ายใกล้ขึ้นตามความจำเป็นภูมิภาคภายในระยะ StreamingMinRadius ไม่เคยออกอากาศ
เมื่อตัวอย่างสตรีมออก มันจะถูกผูกกับ nil ผลการค้นหาLuau ที่มีอยู่เชื่อมต่อกลับได้หากตัวอย่างสตรีมกลับมาผลที่ตามมาคือการลบสัญญาณเช่น ChildRemoved หรือ DescendantRemoving ไฟบน พ่อ หรือ บรรพบุรุษ แต่ตัวอย่างเองไม่ถูกทําลายในเชิงเดียวกับการเรียก Instance:Destroy()
เพื่อคาดการณ์การออกอากาศต่อไป ตรวจสอบสถานการณ์เหล่านี้:
กรณี | ตัวอย่าง | พฤติกรรมการสตรีม |
---|---|---|
ส่วนหนึ่งถูกสร้างขึ้น ท้องถิ่น ผ่าน Instance.new() ใน LocalScript | ในเกม "โขมยธง" คุณสร้างและติดตั้งชิ้นส่วนหมวกสีฟ้าให้กับผู้เล่นในทีมสีฟ้าทั้งหมดผ่าน LocalScript | ส่วนไม่ถูกสําเนาไปยังเซิร์ฟเวอร์ และจะได้รับการยกเว้นจากการสตรีมออก เว้นแต่ คุณจะทําให้มันเป็นลูกหลานของส่วนที่มีอยู่บนเซิร์ฟเวอร์ เช่น ส่วนภายในโมเดลตัวละครของผู้เล่น |
ส่วนหนึ่งถูกโคลนจากท้องถิ่นไปยัง **** ผ่าน ReplicatedStorage ใน Instance:Clone() ใน LocalScript | ตัวละครพ่อมดโจมตีคาถาโดยการเปิดใช้งาน Tool ซึ่งวัตถุรวมถึงเอฟเฟกต์พิเศษหลายอย่าง ถูกโคลนจาก ReplicatedStorage และถูกส่งไปยังพื้นที่ทำงานที่ตำแหน่งของพ่อมด | ส่วนไม่ถูกสําเนาไปยังเซิร์ฟเวอร์ และจะได้รับการยกเว้นจากการสตรีมออก เว้นแต่ คุณจะทําให้มันเป็นลูกหลานของส่วนที่มีอยู่บนเซิร์ฟเวอร์ |
ส่วนหนึ่งถูกซ่อมแซม **** จาก ReplicatedStorage ไปยังพื้นที่ทำงานผ่าน LocalScript | หมวกของ "พ่อมด" จะถูกเก็บไว้ใน ReplicatedStorageเมื่อผู้เล่นเลือกที่จะเล่นในทีมของนักมายากล หมวกจะถูกย้ายไปยังโมเดลตัวละครของพวกเขาผ่าน LocalScript | ส่วนยังคงมีสิทธิ์สำหรับการสตรีมออกเนื่องจากมาจากเซิร์ฟเวอร์และถูกสําเนาไปที่ ReplicatedStorageหลีกเลี่ยงลายนี้เนื่องจากทําให้เกิดการไม่สอดคล้องระหว่างไคลเอนต์และเซิร์ฟเวอร์และส่วนอาจไหลออก; แทน, คลอน ส่วน |
พฤติกรรมของโมเดล
หากคุณตั้ง ModelStreamingBehavior เป็น ปรับปรุง เครื่องยนต์อาจสตรีมโมเดล เริ่มต้น ( ไม่อะตอม ) เมื่อพวกเขามีสิทธิ์สตรีมออก อาจปลดปล่อยหน่วยความจำบนไคลเอนต์และลดจำนวนตัวอย่างที่ต้องการการอัปเดตคุณสมบัติ

ภายใต้ ปรับปรุง พฤติกรรมการสตรีมโมเดลที่สตรีมออกจาก เริ่มต้น ( ไม่อะตอม ) โมเดลจะขึ้นอยู่กับว่าโมเดลเป็น ทางกายภาพ (มี BasePart ) หรือ ไม่ใช่ทางกายภาพ (ไม่มี BasePart )
- โมเดลพื้นที่จะสตรีมออกอย่างสมบูรณ์เมื่อมีการสตรีมลูกหลานสุดท้าย BasePart เพียงครั้งเดียวเท่านั้น เนื่องจากส่วนพื้นที่บางส่วนของโมเดลอาจอยู่ใกล้กับผู้เล่น/จุดโฟกัสการเลียนแบบ และบางส่วนอยู่ไกล
- โมเดลที่ไม่ใช่พื้นที่จะสตรีมออกเฉพาะเมื่อบรรพบุรุษสตรีมออก เทียบเท่ากับพฤติกรรมการสตรีมมรดก
ชิ้นส่วนและเครื่องมือ
เมื่ออย่างน้อยหนึ่งส่วนของการประกอบ สามารถสตรีมได้ ทั้งหมดของชิ้นส่วนของการประกอบจะสตรีมด้วยอย่างไรก็ตาม การประกอบจะไม่สตรีม ออก จนกว่าทุกส่วนของมันจะสามารถสตรีมออกได้ระหว่างการสตรีมทั้งหมดของ Constraints และ Attachments ลดลงจาก BaseParts และอะตอมหรือถาวร Models ยังสตรีมเช่นกันช่วยให้แน่ใจว่าการอัปเดตฟิสิกส์ที่สอดคล้องกันบนไคลเอนต์
โปรดทราบว่าชิ้นส่วนที่มีการยึดด้วย ถูกยึด จะได้รับการปฏิบัติอย่างแตกต่างเล็กน้อยจากชิ้นส่วนที่มีเฉพาะชิ้นส่วนที่ไม่ได้ถูกยึด:
การจัดทำคอมโพสิชัน | พฤติกรรมการสตรีม |
---|---|
ชิ้นส่วนที่ไม่ได้รับการยึดเพียง | การประกอบทั้งหมดถูกส่งเป็นหน่วยอะตอม |
ติดกับราก ส่วนที่มีราก | เฉพาะชิ้นส่วน ส่วนประกอบ และข้อจำกัดที่จำเป็นในการเชื่อมโยงชิ้นส่วนที่สตรีมไปยังส่วนรากเท่านั้นที่ถูกสตรีมไปพร้อมกัน |
ความล่าช้าเวลา
อาจมีความล่าช้าเล็กน้อยประมาณ ~10 มิลลิวินาตระหนักระหว่างเมื่อส่วนถูกสร้างบนเซิร์ฟเวอร์และเมื่อมันถูกส่งต่อไปยังไคลเอนต์ในแต่ละสถานการณ์ต่อไปนี้คุณอาจต้องใช้ WaitForChild() และเทคนิคอื่นๆ แทนที่จะคาดว่าการอัปเดตเหตุการณ์และคุณสมบัติจะเกิดขึ้นเสมอในเวลาเดียวกับการสตรีมส่วนหนึ่ง
กรณี | ตัวอย่าง | พฤติกรรมการสตรีม |
---|---|---|
A LocalScript สร้างการเรียก RemoteFunction ไปยังเซิร์ฟเวอร์เพื่อสร้างส่วน | ผู้เล่นเปิดใช้งาน Tool ท้องถิ่นเพื่อสร้างส่วนบนเซิร์ฟเวอร์ที่ผู้เล่นทุกคนสามารถเห็นและโต้ตอบได้ | เมื่อฟังก์ชันระยะไกลกลับไปยังไคลเอนต์ ส่วนอาจยังไม่มีอยู่ แม้ว่าส่วนจะอยู่ใกล้กับจุดโฟกัสของไคลเอนต์และอยู่ภายในพื้นที่สตรีมก็ตาม |
ส่วนหนึ่งถูกเพิ่มลงในโมเดลตัวละครบนเซิร์ฟเวอร์ผ่าน Script และ RemoteEvent ถูกยิงไปยังไคลเอนต์ | เมื่อผู้เล่นเข้าร่วมทีมตํารวจ "ส่วนตราตำรวจ" ที่เก็บไว้ใน ServerStorage จะถูกคลอนและแนบกับโมเดลตัวละครของผู้เล่นA RemoteEvent ถูกยิงและรับโดยไคลเอนต์ของผู้เล่นนั้นเพื่ออัปเดตองค์ประกอบ UI ท้องถิ่น | แม้ว่าไคลเอนต์จะได้รับสัญญาณกิจกรรม แต่ก็ไม่มีการรับประกันว่าส่วนนั้นจะถูกสตรีมไปยังไคลเอนต์นั้นแล้ว |
ส่วนชนกับภูมิภาคที่มองไม่เห็นบนเซิร์ฟเวอร์และกระตุ้นให้เกิด RemoteEvent บนไคลเอนต์ | ผู้เล่นเตะลูกฟุตบอลเข้าไปในเป้าหมาย กระตุ้นเหตุการณ์ "ทำประตูได้" | ผู้เล่นอื่นที่อยู่ใกล้เป้าหมายอาจเห็นอีเวนต์ "goal scored" ก่อนที่ลูกบอลจะถูกสตรีมไปยังพวกเขา |
คุณสมบัติการสตรีม
คุณสมบัติต่อไปนี้ควบคุมวิธีที่การสตรีมติดตามตัวอย่างใช้กับประสบการณ์ของคุณคุณสมบัติเหล่านี้ทั้งหมดเป็น ไม่สามารถสคริปต์ได้ และต้องกำหนดในวัตถุ พื้นที่ทำงาน ใน Studio

พฤติกรรมการสตรีมรูปแบบ
ควบคุมว่า ค่าเริ่มต้น ( ไม่อะตอม ) รูปแบบจะถูกสําเนาเมื่อผู้เล่นเข้าร่วมหรือจะส่งเฉพาะเมื่อจําเป็นหากคุณสร้างคุณสมบัตินี้เป็น ปรับปรุง โมเดลใน Workspace จะถูกส่งไปยังลูกค้าเฉพาะตอนที่จำเป็น อาจเร่งเวลาการเข้าร่วมได้ดู พฤติกรรมทางเทคนิค สำหรับรายละเอียดเพิ่มเติม
โหมดความสมบูรณ์ของการสตรีม
ประสบการณ์ของคุณอาจทำงานในลักษณะที่ไม่คาดคิดหากผู้เล่นย้ายไปยังภูมิภาคของโลกที่ยังไม่ถูกสตรีมไปยังพวกเขาคุณลักษณะการสตรีมความสมบูรณ์มอบวิธีการหลีกเลี่ยงสถานการณ์ที่อาจเป็นปัญหาได้ สถานการณ์ โปรดดูคู่มือ Enum.StreamingIntegrityMode สำหรับรายละเอียดเพิ่มเติม
รัศมีการสตรีมขั้นต่ำ
คุณสมบัติ StreamingMinRadius บ่งบอกรัศมีรอบตัวละครของผู้เล่น (หรือ ReplicationFocus ) ในกรณีที่สตรีมมีลําดับความสําคัญสูงสุดควรใช้ความระมัดระวังเมื่อเพิ่มค่าเริ่มต้นเนื่องจากการทำเช่นนั้นจะต้องใช้หน่วยความจำเพิ่มเติมและกว้างขวางเวลาในการรับส่งของเซิร์ฟเวอร์เพิ่มเติมในค่าใช้จ่ายของส่วนประกอบอื่น
รัศมีเป้าหมายการสตรีม
คุณสมบัติ StreamingTargetRadius ควบคุมระยะสูงสุดที่ห่างจากตัวละครของผู้เล่น (หรือ ReplicationFocus ) ในกรณีที่สตรีมในโปรดทราบว่าเครื่องยนต์สามารถเก็บตัวอย่างที่โหลดไว้ก่อนหน้านี้นอกรัศมีเป้าหมายได้ ตามที่หน่วยความจำอนุญาต
รัศมีเล็กกว่า เป้าหมายการสตรีม ลดภาระงานของเซิร์ฟเวอร์เนื่องจากเซิร์ฟเวอร์จะไม่สตรีมในกรณีเพิ่มเติมนอกเหนือจากค่าที่กำหนดอย่างไรก็ตาม รัศมีเป้าหมายยังเป็นระยะทางสูงสุดที่ผู้เล่นจะสามารถมองเห็นรายละเอียดทั้งหมดของประสบการณ์ของคุณได้ ดังนั้นคุณควรเลือกค่าที่สร้างความสมดุลที่ดีระหว่างสิ่งเหล่านี้
พฤติกรรมการสตรีมออก
คุณสมบัติ StreamOutBehavior ตั้งค่าพฤติกรรมการสตรีมออกตามหนึ่งในค่าต่อไปนี้:
การตั้งค่า | พฤติกรรมการสตรีม |
---|---|
ค่าเริ่มต้น | พฤติกรรมเริ่มต้นปัจจุบันเหมือนกับ ความจําน้อย |
หน่วยความจําต่ำ | ไคลเอนต์สตรีมชิ้นส่วนเท่านั้นในสถานการณ์หน่วยความจำต่ำและอาจลบเนื้อหา 3D จนกว่าจะมีรัศมีขั้นต่ำเท่านั้น |
โอกาสที่ | ภูมิภาคที่อยู่นอกเหนือ StreamingTargetRadius สามารถลบออกได้บนไคลเอนต์แม้ว่าจะไม่มีแรงกดดันเกี่ยวกับหน่วยความจำในโหมดนี้ ไคลเอนต์จะไม่ลบตัวอย่างที่อยู่ใกล้กว่ารัศมีเป้าหมาย ยกเว้นในสถานการณ์หน่วยความจำต่ำ |
การควบคุมการสตรีมตามโมเดลแต่ละรายการ
ทั่วโลกคุณสมบัติ ModelStreamingBehavior ช่วยให้คุณสามารถควบคุมวิธีที่โมเดลถูกสตรีมในระหว่างการเข้าร่วมได้นอกจากนี้เพื่อหลีกเลี่ยงปัญหาการสตรีมแบบรายโมเดลและลดการใช้ WaitForChild() คุณสามารถปรับแต่งวิธีที่ Models และบรรดาลูกหลานของพวกเขาสตรีมผ่านคุณสมบัติ ModelStreamingMode ได้

ค่าเริ่มต้น / ไม่อะตอม
เมื่อ Model ถูกตั้งค่าเป็น ปกติ หรือ ไม่อะตอม พฤติกรรมการสตรีมจะแตกต่างกันขึ้นอยู่กับว่า ModelStreamingBehavior ถูกตั้งค่าเป็น ปกติ ( มรดก ) หรือ ปรับปรุง
พฤติกรรมการสตรีมรูปแบบ | พฤติกรรมทางเทคนิค |
---|---|
เริ่มต้น ( มรดก ) | โมเดลจะถูกเลียนแบบเมื่อผู้เล่นเข้าร่วมอาจทำให้เกิดผลลัพธ์เพิ่มเติมในการส่งตัวอย่างมากขึ้นในระหว่างการโหลด, ตัวอย่างเพิ่มเติมที่เก็บไว้ในหน่วยความจำ, และความซับซ้อนเพิ่มเติมสำหรับสคริปต์ที่ต้องการเข้าถึงสายตระกูลของโมเดลตัวอย่างเช่น แยก LocalScript จะต้องใช้ WaitForChild() บนลูกหลาน BasePart ภายในโมเดล |
ปรับปรุง | โมเดลจะถูกส่งเฉพาะเมื่อจำเป็นเท่านั้น อาจเร่งเวลาเข้าร่วมได้ |
ดู พฤติกรรมทางเทคนิค สำหรับรายละเอียดเพิ่มเติม
อะตอม
หาก Model ถูกเปลี่ยนเป็น อะตอม ทั้งหมดของลูกหลานจะถูกสตรีมร่วมกันเมื่อลูกหลาน BasePart มีคุณสมบัติผลที่ตามมาคือแยก LocalScript ที่ต้องการเข้าถึงตัวอย่างในโมเดลจะต้องใช้ WaitForChild() บนโมเดลเอง แต่ไม่ใช่บนลูกหลาน MeshPart หรือ Part เนื่องจากถูกส่งไปพร้อมกับโมเดล
โมเดลอะตอมจะถูกสตรีมออกเฉพาะเมื่อชิ้นส่วนลูกผสมทั้งหมดมีสิทธิ์สตรีมออกเมื่อถึงจุดนั้นโมเดลทั้งหมดจะสตรีมออกพร้อมกันหากเฉพาะส่วนหนึ่งของโมเดลอะตอมจะถูกสตรีมออกไป โมเดลและบรรดาลูกหลานทั้งหมดจะยังคงอยู่บนไคลเอนต์
สคริปท์ท้องถิ่น
local Workspace = game:GetService("Workspace")-- โมเดลอะตอมไม่มีอยู่ในเวลาโหลด; ใช้ WaitForChild()local model = Workspace:WaitForChild("Model")-- ส่วนลูกหลานไหลเข้ากับโมเดลและสามารถเข้าถึงได้ทันทีlocal meshPart = model.MeshPartlocal part = model.Part
ถาวร
โมเดลถาวร ไม่อยู่ภายใต้การสตรีมปกติในหรือออกพวกเขาจะถูกส่งเป็นหน่วยอะตอมที่สมบูรณ์หลังจากที่ผู้เล่นเข้าร่วมและก่อนที่จะเกิดเหตุการณ์ Workspace.PersistentLoadedโมเดลถาวรและลูกหลานของพวกเขาจะไม่ถูกสตรีมออกเสมอ แต่เพื่อจัดการการสตรีมอย่างปลอดภัยภายในแบบแยก LocalScript คุณควรใช้ WaitForChild() บนโมเดลพ่อ หรือรอให้เหตุการณ์ PersistentLoaded เกิดขึ้น
สคริปท์ท้องถิ่น
local Workspace = game:GetService("Workspace")-- โมเดลถาวรไม่มีอยู่ในเวลาโหลด; ใช้ WaitForChild()local model = Workspace:WaitForChild("Model")-- ส่วนลูกหลานไหลเข้ากับโมเดลและสามารถเข้าถึงได้ทันทีlocal meshPart = model.MeshPartlocal part = model.Part
สิ่งที่คงอยู่ต่อผู้เล่น
โมเดลตั้งค่าเป็น PersistentPerPlayer มีพฤติกรรมเหมือน Persistent สำหรับผู้เล่นที่ถูกเพิ่มโดยใช้ Model:AddPersistentPlayer() สำหรับผู้เล่นที่ถูกเพิ่มโดยใช้ สำหรับผู้เล่นคนอื่น พฤติกรรมจะเหมือนกับ อะตอมคุณสามารถย้อนกลับโมเดลจากความอดทนของผู้เล่นผ่าน Model:RemovePersistentPlayer()
ขอการสตรีมพื้นที่
หากคุณตั้งค่า CFrame ของตัวละครผู้เล่นให้เป็นภูมิภาคที่ไม่ได้โหลดในปัจจุบัน การหยุดการสตรีม จะเกิดขึ้นหากเปิดใช้งานหากคุณรู้ว่าตัวละครจะย้ายไปยังพื้นที่เฉพาะ คุณสามารถโทร Player:RequestStreamAroundAsync() เพื่อขอให้เซิร์ฟเวอร์ส่งภูมิภาครอบตำแหน่งนั้นไปยังไคลเอนต์
สคริปต์ต่อไปนี้แสดงวิธีการยิงเหตุการณ์ระยะไกลจากไคลเอนต์ไปยังเซิร์ฟเวอร์ เพื่อเทเลพอร์ตผู้เล่นภายในสถานที่ โดยให้ผลในคำขอสตรีมก่อนที่จะย้ายตัวละครไปยังใหม่ 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)
สคริปท้องถิ่น - การเปิดเหตุการณ์ระยะไกล
local ReplicatedStorage = game:GetService("ReplicatedStorage")local teleportEvent = ReplicatedStorage:WaitForChild("TeleportEvent")local teleportTarget = Vector3.new(50, 2, 120)-- ยิงเหตุการณ์ระยะไกลteleportEvent:FireServer(teleportTarget)
ตรวจสอบการสตรีมตัวอย่าง
ในบางกรณีจำเป็นต้องตรวจจับเมื่อวัตถุสตรีมเข้าหรือออกและตอบสนองต่อเหตุการณ์นั้นลายที่มีประโยชน์สำหรับการตรวจจับการสตรีมมีดังนี้:
โดยใช้ส่วน แท็ก อินสแตนซ์เครื่องมือแท็กของ Studio กำหนดแท็กโลจิสติก CollectionService ให้กับวัตถุทั้งหมดที่ได้รับผลกระทบ
จากเดียว LocalScript , ตรวจจับเมื่อวัตถุที่มีแท็กไหลเข้าหรือออกผ่าน GetInstanceAddedSignal() และ GetInstanceRemovedSignal() , จัดการวัตถุตามนั้นตัวอย่างเช่น โค้ดต่อไปนี้เพิ่มวัตถุที่มีแท็ก Light ในลูป "flicker" เมื่อสตรีมเข้าและลบพวกเขาเมื่อสตรีมออก
LocalScript - การตรวจจับการสตรีมบริการคอลเลกชันlocal CollectionService = game:GetService("CollectionService")local tagName = "FlickerLightSource"local random = Random.new()local flickerSources = {}-- ตรวจจับส่วนที่มีแท็กใหม่และส่งสตรีมอยู่ในหรือออกfor _, light in CollectionService:GetTagged(tagName) doflickerSources[light] = trueendCollectionService:GetInstanceAddedSignal(tagName):Connect(function(light)flickerSources[light] = trueend)CollectionService:GetInstanceRemovedSignal(tagName):Connect(function(light)flickerSources[light] = nilend)-- วงจรสลับwhile true dofor light in flickerSources dolight.Brightness = 8 + random:NextNumber(-0.4, 0.4)endtask.wait(0.05)end
ปรับแต่งหน้าจอหยุดชั่วคราว
คุณสมบัติ Player.GameplayPaused ระบุสถานะการหยุดชั่วคราวปัจจุบันของผู้เล่นคุณสมบัตินี้สามารถใช้กับการเชื่อมต่อ GetPropertyChangedSignal() เพื่อแสดงหรือซ่อน GUI ที่กําหนดเอง
สคริปท์ท้องถิ่น
local Players = game:GetService("Players")
local GuiService = game:GetService("GuiService")
local player = Players.LocalPlayer
-- ปิดใช้งานโหมดหยุดชั่วคราวเริ่มต้น
GuiService:SetGameplayPausedNotificationEnabled(false)
local function onPauseStateChanged()
if player.GameplayPaused then
-- แสดง GUI ที่กําหนดเอง
else
-- ซ่อน GUI ที่กําหนดเอง
end
end
player:GetPropertyChangedSignal("GameplayPaused"):Connect(onPauseStateChanged)
ระดับรายละเอียดรูปแบบ
เมื่อเปิดใช้งานการสตรีมแล้ว Models ด้านนอกพื้นที่ที่สตรีมอยู่ในปัจจุบันจะไม่ปรากฏโดยค่าเริ่มต้นอย่างไรก็ตาม คุณสามารถสั่งให้เครื่องเรนเดอร์สร้างเมช "imposter" ความละเอียดต่ำสำหรับโมเดลที่ไม่ปรากฏในไคลเอนต์ผ่านคุณสมบัติ LevelOfDetail ของโมเดลแต่ละรายการ



การตั้งค่าโมเดล | พฤติกรรมการสตรีม |
---|---|
สตรีมมิ่งเน็ตเวิร์ก | เปิดใช้งานการสร้างแบบไม่ซิงโครไนซ์ของตาข่ายหลอกลวงที่จะแสดงเมื่อโมเดลไม่ปรากฏบนไคลเอนต์ |
ปิดใช้งาน / อัตโนมัติ | โมเดลจะหายไปเมื่ออยู่นอกรัศมีการสตรีม |
เมื่อใช้เมชของผู้ละเมิด กำลังติดตาม:
- เมชของผู้ละเมิดถูกออกแบบมาให้เห็นได้ที่ 1024 สตัดจากกล้อง หรือไกลกว่านั้นหากคุณลด StreamingTargetRadius เป็นค่าที่เล็กกว่ามากเช่น 256 เมชของผู้ละเมิดอาจไม่เป็นที่ยอมรับทางสายตาสำหรับรูปแบบที่พวกเขาแทนที่
- หากรูปแบบ และ รูปแบบลูกหลานทั้งหมดถูกตั้งค่าเป็น StreamingMesh เท่านั้นรูปแบบบรรพบุรุษระดับสูงจะถูกเรนเดอร์เป็นเมชของผู้บุกรุก ซึ่งห่อหุ้มทุกรูปร่างภายใต้บรรพบุรุษและรูปแบบลูกหลานของมันเพื่อประสิทธิภาพที่ดีกว่า แนะนำให้คุณใช้ ปิดใช้งาน สำหรับรูปแบบลูกหลาน
- ไม่สนับสนุนเทกเจอร์; เมชของผู้ละเมิดจะถูกแสดงเป็นเมชที่ราบรื่น
- ในขณะที่ Model ไม่ได้ถูกสตรีมอย่างสมบูรณ์ แต่ตาข่ายของผู้ละเมิดจะถูกแสดงแทนส่วนต่างๆ ของโมเดลเมื่อชิ้นส่วนแต่ละชิ้นถูกสตรีมเข้ามาแล้ว พวกเขาจะเรนเดอร์และเมชของผู้ละเมิดจะถูกเพิกเฉย
- เมชของผู้ละเมิดไม่มีความสำคัญทางกายภาพและพวกเขากระทำเป็นไม่มีอยู่เมื่อเทียบกับ raycasting , การตรวจจับการชน และการจำลองฟิสิกส์
- การแก้ไขโมเดลใน Studio เช่น เพิ่ม/ลบ/ย้ายส่วนลูกหรือรีเซ็ตสี จะอัปเดตเมชตัวแทนโดยอัตโนมัติ