ระบบสนับสนุน

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

เราใช้ระบบต่อไปนี้เพื่อสนับสนุนทั้งระบบเกมพื้นฐานและเป้าหมายใดๆ ของข้อกําหนดการออกแบบหลัก

ใช้ผู้จัดการ

ผู้จัดการใช้ ให้ API ง่ายๆ เพื่อใช้วัตถุที่จับได้บนบางสิ่ง เช่นชิ้นของเสื้อผ้าชั้นในบนหุ่นฟังก์ชันหลักสำหรับ API นี้คือ UseManager.AddUse (แท็ก,เป้าหมาย,ระยะทาง,onSuccess,onNothingEquipped,onWrongEquipped,เพิ่มเติมข้อมูล) ซึ่งผูกชุดของแท็กไปยัง targetObjects เมื่อผู้เล่นมีวัตถุที่มีแท็กหนึ่งในนั้นและคลิกที่เป้าหมาย จะเรียกฟังก์ชัน onSuccess ของ callback ขึ้นฟังก์ชันการโทรอื่นๆ ช่วยให้เราสามารถแสดงข้อมูลภาพเสริมสำหรับผู้เล่นได้หากการคลิกทำโดยไม่มีไอเทมที่จับหรือด้วยไอเทมประเภทผิด

เราสามารถลบ "การใช้" ด้วย UseManager.RemoveUse ซึ่งมักจะเป็นประโยชน์เมื่อภารกิจสําเร็จหรือไอเทมเฉพาะถูก "ใช้"นอกจากนี้เราสามารถเพิ่มหรือลบเป้าหมายด้วย AddUseTargets และ RemoveUseTargets ได้

ไฮไลท์

เมื่อผู้เล่นอยู่ใกล้กับรายการที่สนใจ เช่น แมวนำ้ เราต้องการให้รายการนั้นโดดเด่นจากสภาพแวดล้อมเพื่อใช้งานสิ่งนี้ เราได้สร้าง LocalScript ที่เรียกว่า ไฮไลต์ไอเทม ซึ่งใช้ทรงกลมที่อยู่รอบตัวผู้เล่นเพื่อตรวจจับการสัมผัสด้วยเมชที่อื่น เชื่อมต่อกับ Touched และ TouchEnded เหตุการณ์ฟังก์ชัน getHighlight ตรวจสอบแท็กหลายแท็กบนเมชที่สัมผัสหรือพ่อแม่โดยใช้ฟังก์ชันช่วยเหลือ GetTaggedObjectUpHierarchy หากไม่จำเป็นต้องเน้น เราสามารถลบมันได้โดยใช้แท็ก NoHighlight อย่างไรก็ตาม หากจำเป็นแต่ไม่พอดีกับแท็กอื่นๆ หลายแท็ก เราสามารถบังคับให้มันใช้แท็ก สำคัญ ได้

นี้ LocalScript ใช้คุณลักษณะเครื่องยนต์ใหม่ Highlight ที่วาดภาพรวมของวัตถุและ/หรือเติมภายในวัตถุด้วยสีที่กำหนดไว้; คุณสมบัติเน้นวัตถุHighlights และเคอร์เซอร์เมาส์ OnItemIndicator ระบบทำงานร่วมกันดังนั้น Highlights ไม่เพียงแต่กำหนดว่าเมชต้องการไฮไลต์หรือไม่ แต่ยังให้ประเภทของเมชสำหรับ OnItemIndicator HighlightItemsFunc ใช้สื่อสารกับระบบลูกค้าอื่นตัวอย่างเช่น EventManager ใช้มันด้วยคำสั่ง เปิดใช้งาน เพื่อเปิดใช้งานหรือปิดใช้งาน Highlight และ OnItemIndicator ใช้ GetType เพื่อสอบถามประเภทของวัตถุที่เป็นเพื่อตรวจสอบเมื่อไอเทมไม่ปรากฏอีกต่อไป เช่น เมื่อห้องที่เสียหายถูกทำลาย เราจะเชื่อมต่อกับ CollectionService.GetInstanceRemovedSignal

ความรู้และฟองความคิด

Lore และ ThoughtBubbles เป็นระบบที่คล้ายกัน 2 ระบบLore ใช้ ScreenGui เป็นภาชนะ UI บนหน้าจอที่มีลูก Frame เพื่อควบคุมการปรับขนาดและการปรับขนาดของลูก ๆ ของมัน TextLabels และ ImageLabels และ Lore รอให้ผู้เล่นคลิกที่ใดก็ได้บนหน้าจอเพื่อลบมันเช่นเดียวกันฟองความคิดใช้ BillboardGui กับเด็ก TextLabel กับวัตถุที่ไม่ใช้ความรู้ และแสดงบทสนทนาในพื้นที่ 3D ใกล้วัตถุเป็นระยะเวลาที่กำหนดและระยะเวลาคูลดาวน์โดยไม่มีข้อความใช้พื้นที่ทั้งหมดของหน้าจอสำหรับข้อมูลเพิ่มเติมเกี่ยวกับการออกแบบเบื้องหลังระบบเหล่านี้ ดู ความรู้ และ ฟองความคิด

ความรู้ถูกใช้ใน LoreManger LocalScriptเมื่อคลิกหรือแตะ มันจะยิงรังสีโดยใช้ฟังก์ชันช่วยเหลือ utils.RaycastAlongPointingDir และใช้กลุ่ม NoPlayerCollision หากเมชภายใต้การคลิกหรือหนึ่งในพ่อแม่มีแท็ก Lore หรือ ThoughtBubble เราจะแสดง UIข้อความ คําอธิบาย และภาพถูกกำหนดโดยคุณสมบัติ LoreText, LoreCaption และ LoreImage บนวัตถุ

โปรดทราบว่าเราใช้ Camera.ViewportPointToRay หรือ Camera.ScreenPointToRay ในการสร้างลําแสงขึ้นอยู่กับว่ามันถูกเรียกจากไม่สัมผัสหรือสัมผัสพิกัดอยู่ในระบบพิกัดที่แตกต่างกันเล็กน้อยสำหรับเมาส์ เราได้รับพวกเขาจาก Class.UserInputService.InputEnded``:Connect สำหรับ MouseButton1 และสำหรับอุปกรณ์สัมผัส เราได้รับพวกเขาจาก Class.UserInputService.TouchTapInWorld``:Connect

ฟองความคิดทั้งหมดมีลักษณะคล้ายกันโดยใช้ raycast เพื่อตรวจสอบว่าเมชหรือพ่อแม่มีแท็ก ThoughtBubble หรือไม่นอกจากนี้ยังใช้คุณสมบัติ ThoughtText สำหรับข้อความและแท็ก ThoughtBubble เพื่อชี้ไปที่วัตถุชั่วคราวที่ใช้สำหรับการจัดตำแหน่ง UI ในโลกฟองความคิดที่ใช้วัตถุตำแหน่งเดียวกัน แต่มีข้อความที่แตกต่างกันมีเวลาคูลดาวน์ที่แตกต่างกัน

กรณีพิเศษ

Lore มีสองสามกรณีพิเศษหนึ่งในนั้นคือแมวนำ้ที่เสียหายเมื่อผู้เล่นคลิกที่ตราที่เสียหาย มันจะแสดง UI ความรู้ และรอการคลิกเพื่อเริ่มต้นภารกิจซึ่งส่งผลต่อการไหลของเกมนี้จะจัดการโดย GameStateClient ที่ใช้ bindable LoreManagerFunc เพื่อขอ UI ความรู้การเรียกคืนจะถูกจัดให้กับระบบ Lore โดย GameStateClient เพื่อรู้ว่าเมื่อใดที่ Lore "ปิด" โดยผู้เล่นกรณีพิเศษอีกกรณีหนึ่งคือเมื่อ ThoughtBubbles และ Lore แท็กอยู่บนวัตถุเดียวกันในกรณีนี้เพื่อหลีกเลี่ยงการซ้อนทับของข้อมูลและข้อความฟองความคิด เราจะเรียกใช้ฟองความคิดหลังจากที่ข้อมูลถูกปิด LoreManager จัดการกรณีพิเศษด้วยการแสดงฉากเล็กๆ เมื่อคลิกที่ประตูที่ถูกปิดจนกว่าผู้เล่นจะหยิบตราสัญลักษณ์ของห้อง

บนตัวบ่งบอกรายการ

เราต้องการแสดงไอคอนที่แตกต่างกันในศูนย์กลางของหน้าจอเมื่อผู้เล่นกำลังมองหารายการที่สนใจสคริปต์ไคลเอนต์ OnItemindicator ทำการคาสแรย์รอบกล้อง Class.CFrame.LookVector และวิเคราะห์ผลลัพธ์ขึ้นอยู่กับผลลัพธ์มันตั้งภาพใน OnItemIndicator2 ScreenGui

เมื่อไม่มีรายการที่สนใจถูกโจมตี ไอคอนเริ่มต้นจะเป็นจุดเล็กๆเราสามารถตั้งค่าไอคอนใดก็ได้โดยการเพิ่มค่าความสัมพันธ์ OnItemIndicator เป็นสตริงไปยังเมชที่เฉพาะโดยใช้ชื่อจาก onItemIndicatorImages เช่น มือ ตา หรือ DoorCurrentlyLockedคุณสมบัติจำเป็นเฉพาะในกรณีที่หายากและส่วนใหญ่เวลาอื่นๆ แท็กหรือระบบที่มีอยู่แล้วให้ประเภทไอคอนสำหรับรายละเอียดเพิ่มเติม ดูฟังก์ชัน Update

ทำการตรวจสอบบางอย่างในลําดับความสําคัญหลังจากการแทนที่ OnItemIndicator เราตรวจสอบว่ามันจะคว้าได้หรือเป็นลิ้นชักสำหรับไอคอน "มือ" ผ่านทาง utils.CanGrabModel(model) หรือ utils.GetTaggedObjectUpHierarchy("Drawer2", model)หลังจากนั้นเราจะเรียก HighlightManager ที่กำหนดสถานะไฮไลต์ประเภทของไอเทมและไอคอนที่ใช้ตัวอย่าง:


highlightItemsFunc:Invoke({"GetType", curInst})

แท็ก Lore และ ThoughtBubble จะถูกตรวจสอบในภายหลังโดยการตรวจสอบแท็กสำหรับประตูเรามีไอคอนที่แตกต่างกัน 2 รายการ: ประตูปัจจุบันถูกปิด และ ประตูถูกล็อคเสมอ DoorManager ตั้งค่าคุณสมบัติจริงหรือเท็จ DoorEnabled สำหรับประตูที่สามารถเปิดหรือปิดได้ และเราใช้ความปัจจุบันและค่าของคุณสมบัติวัตถุที่ดูเหมือนเป็นประตู แต่ไม่เปิดมีแท็ก ประตูล็อค

ผู้จัดการประตู

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

แต่ละประตูมีระบบสถานะที่เรียบง่าย, DoorState (ปิด, เปิด, เปิด, ปิด) ด้วยวัยรุ่นที่ใช้สำหรับการเปลี่ยนเส้นทางเราสามารถเปิดใช้งานหรือปิดการใช้งานความสามารถของประตูในการเปิดหรือปิดจากระบบภายนอกโดยการโทร DoorManager.EnableDoor ซึ่งตั้งค่าคุณสมบัติ DoorEnabled

นักแอนิเมชั่นมาสเตอร์

The MasterAnimator LocalScript เล่นภาพเคลื่อนไหว (แอตเลสภาพ) ซึ่งเราใช้เพื่อแอนิเมชั่นหน้าจอทีวีเพื่อเลื่อนดูภาพ เราต้องรู้ชุดของพารามิเตอร์: จํานวนแถวและคอลัมน์รวมทั้งหมด จํานวนเฟรมทั้งหมด ระยะเวลา และชุดของรหัสภาพระบบช่วยให้เราสามารถแอนิเมชั่นข้ามหลายภาพได้ แต่ละภาพอาจแยกออกเป็นแถวและคอลัมน์ของภาพย่อยเราสามารถให้ข้อมูลนี้ผ่านคุณสมบัติหรือค่าได้ แต่ในประสบการณ์นี้เราใช้สคริปต์ช่วยเหลือUpdateImageAnimations(dT) คำนวณภาพหรือส่วนภาพที่เราต้องการแสดงโดยใช้เวลาและพารามิเตอร์หากเราต้องการเปลี่ยนเป็นภาพใหม่ เราตั้งค่าภาพหากต้องการเปลี่ยนภาพย่อใด ๆ เราตั้ง ImageRectOffset

วัตถุที่มีภาพเคลื่อนไหว SurfaceGui จะมีนักแสดงอนิเมชั่น ModuleScript ซึ่งมีวัตถุประสงค์หลักเพื่อให้ฟังก์ชั่น Animator.GetParams ทั้งหมดกลับมาเป็นพารามิเตอร์สิ่งนี้ช่วยให้ MasterAnimator LocalScript ที่ใช้แท็ก ภาพเคลื่อนไหว และ CollectionService เพื่อรวบรวมวัตถุดังกล่าวและค้นหา Animator ModuleScript ภายใต้พวกเขาจากนั้นใช้ pcall เพื่อต้องการนักแสดงแอนิเมชัน ModuleScript และโทร GetParams บนมัน

แอนิเมชั่นพื้นที่ท้องถิ่น

The LocalSpaceAnimations LocalScript ใช้แท็ก LocalSpaceRotation เพื่อหมุนวัตถุส่วนใหญ่ "เพื่อความสวยงาม" ด้วยความเร็วในการหมุนและความล่าช้ารอบแกน X, Y หรือ Zเราใช้สิ่งนี้ไม่ว่าจะเป็นวัตถุที่อยู่ไกลที่ผู้เล่นไม่สามารถโต้ตอบได้ หรือวัตถุขนาดเล็กที่ไม่ส่งผลต่อการจำลองมากนักพารามิเตอร์ที่กำหนดผ่าน Speed , Delay และ Axis ค่าสำหรับรายละเอียดการดำเนินการดูที่ เมชคลาวด์หมุน .

ผู้จัดการไฟหน้า

ตัวจัดการไฟฉายเมื่อผู้ใช้เลือก ไฟฉายบนหน้าจอ จะจัดการเมื่อผู้ใช้เลือกไฟฉายบนหน้าจอเพื่อเปิดหรือปิดสปอตไลท์บนหัวของพวกเขา และยิงความคิดเห็นไปยังเซิร์ฟเวอร์โดยใช้ HeadlampEvent และแผ่นสลับเปิดและปิดเสียงเมื่อมีการเพิ่มตัวละครหรือเปลี่ยน Head ของพวกเขา ฟังก์ชัน giveCharacterHeadlamp จะโคลน เทมเพลตหัวโคม และตำแหน่งโคมโดยใช้ความเคลื่อนที่และการหมุนบางอย่างจาก FaceFrontAttachment

ผู้จัดการที่นั่ง

เราไม่ต้องการให้ผู้เล่นนั่งโดยอัตโนมัติเมื่ออยู่ใกล้วัตถุที่พวกเขาสามารถนั่งได้แทนที่, เราต้องการให้ผู้ใช้คลิกใกล้ที่นั่งเพื่อนั่งสคริปต์ SeatManager เพิ่ม ClickDetectors ตามแท็ก Seat และเรียก seat:Sit(humanoid) เมื่อคลิกเมื่อเทเลพอร์ตผู้เล่นระหว่างสถานะปกติและที่เสียหายของห้อง เราไม่สามารถให้ผู้เล่นนั่งได้เพราะ CFrame การเปลี่ยนตำแหน่งจะไม่สามารถทำงานได้ ดังนั้น SeatManager จึงมีฟังก์ชันที่จะปิดหรือเปิดการนั่งไม่กี่วินาทีก่อนและหลังการเทเลพอร์ต

ผู้จัดการลิ้นชัก

สคริปต์ DrawerManager ใช้แท็ก Drawer2 และ CollectionService ในการจัดการการคลิกที่ลิ้นชักเพื่อเปิดหรือปิดพวกมันและเล่นเสียงที่เกี่ยวข้องการเปิดและปิดการกระทำทำโดยการตั้งค่าตำแหน่งเป้าหมายสำหรับ PrismaticConstraint

ระดับเสียงฆ่า

ในพื้นที่เล่นหลักไม่กี่พื้นที่ เช่นประกายไฟฟ้าและน้ำใกล้จุดเริ่มต้นของถนนที่นำไปสู่บ้าน ผู้เล่นสามารถตั้งค่า Humanoid.Health ของพวกเขาเป็น 0 เมื่อเข้าสู่ปริมาณด้วยแท็ก KillVolume สคริปต์ KillVolumes ใช้ Touched:Connect เพื่อกำหนดเวลาที่ผู้เล่นเข้าสู่ระดับเสียงแล้วลดสุขภาพของพวกเขาเป็น 0

ผู้เล่นภารกิจรีสปอว์น

สคริปต์ PlayerMissionRespawn ใช้แท็ก RespawnVolume และ CollectionService ในการจัดการกับปริมาณที่ทำให้ผู้เล่นเกิดใหม่เมื่อสัมผัสเราวางปริมาณเหล่านี้ภายใต้ห้องที่เสียหายเนื่องจากภารกิจจํานวนมากมีช่องว่างหรือแพลตฟอร์มเคลื่อนที่ที่ผู้เล่นอาจล้มลงเมื่อสัมผัสแล้วสคริปต์จะเล่นฉากตัดเล็ก Teleport_Jump และเรียกใช้ GameStateFunc ด้วยคำสั่ง GameEvents.PlayerRespawn

เมื่อประมวลผล GameEvents.PlayerRespawn สคริปต์สามารถใช้ RespawnPositions หากการกำหนดค่าภารกิจให้มันได้หากไม่ได้ใช้ TeleportPositions สำหรับภารกิจเฉพาะเราไม่มีระบบ "จุดตรวจ" ดังนั้น CalcClosestTeleportPos เพียงเลือกจุด Respawn หรือ Teleport ที่ใกล้ที่สุดจากที่ผู้เล่นตี RespawnVolume โดยใช้ระยะแนวนอนเดียว "2D"

ระบบช่วยเหลือขนาดเล็ก

ผู้จัดการเปียโน

สคริปต์ PianoManager ใช้แท็ก Piano และ CollectionService เพื่อเพิ่ม ClickDetectors และเล่นหนึ่งในเสียงเปียโนเมื่อคลิกที่แป้นพิมพ์

การสนับสนุนพิธีกรรม

ล็อบบี้ที่ผู้เล่นวางตราสัญลักษณ์มีการตั้งค่าที่ซับซ้อนที่เกิดการเปลี่ยนแปลงเมื่อแต่ละตราสัญลักษณ์ถูกวางในตำแหน่งที่กำหนดตัวอย่างเช่น ขึ้นอยู่กับจํานวนแมวน้ําที่วางไว้ กิจกรรมเฉพาะจะเล่นเพื่อเปิด/ปิดไฟและลําแสง เปลี่ยนความโปร่งใสของวัตถุบางอย่าง ฯลฯการสนับสนุนพิธีกรรม **** ModuleScript เป็นส่วนห่อเล็กๆ เหนือการโทร EventManager:Invoke สำหรับเหตุการณ์เหล่านั้น โดยให้พารามิเตอร์แก่เหตุการณ์ เช่น สิ่งที่ "รากของวัตถุ" จะเล่นบนมัน ขึ้นอยู่กับสิ่งที่เซลล์พิเศษที่ถูกวางไว้

ผู้จัดการที่สามารถฟื้นฟูได้

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

พอร์ทัล

ในภารกิจไม่กี่ภารกิจเราเทเลพอร์ตผู้เล่นในระยะสั้นภายในภารกิจเช่น การเกิดใหม่ของผู้เล่น ที่ล้มลงจากแพลตฟอร์มหมุนเพื่อลดความซับซ้อนในการตั้งค่าประเภทการเทเลพอร์ตนี้ซึ่งเราเรียกว่า "พอร์ทัล" ในสคริปต์ใช้ฟังก์ชันช่วยเหลือ ProcessPortal ใน DemoUtils ตัวอย่างเช่น หาก P1 เป็นส่วนที่กำหนดการเริ่มกระตุ้นครั้งแรก และ P2 เป็นส่วนที่กำหนดการเปลี่ยนแปลงผู้เล่นจุดหมายสุดท้าย ส่วนต่อไปนี้อาจกำหนดฟังก์ชันพอร์ทัลดังนี้:


P1.Touched:Connect(function(otherPart) utils.ProcessPortal(otherPart, P2) end)

พอร์ทัลกระบวนการ จัดการตรวจสอบว่าส่วนอื่นเป็นมนุษย์ เทเลพอร์ตผู้เล่นผ่านการเปลี่ยนแปลงพิกัด CFrame และเรียกฉากเล็กๆ เพื่อซ่อนการเปลี่ยนผ่านโดยใช้อีเวนต์ Teleport_Jump ใน EventManager

สคริปต์กำหนดค่า

เรามีหลายการกำหนดค่า การจำแนกข้อมูล และสคริปต์ฟังก์ชันทั่วไป: DemoConfig . การนิยามของภารกิจ การนับรวมสําหรับสถานะเกม การจัดเหตุการณ์สําหรับการสื่อสารระหว่างไคลเอนต์-เซิร์ฟเวอร์ การสาธิตการตั้งค่าทั่วโลก เราพัฒนาในสถานที่เดียว แต่ปล่อย (และทดสอบ) ในที่อื่นสคริปต์ตรวจสอบ placeID และเปิดใช้งาน/ปิดใช้งานฟังก์ชันต่างๆ ของการโกงและการแก้ไขข้อผิดพลาด เครื่องมือทดลอง .ฟังก์ชันต่างๆ ของความจำเป็นจัดการกับเทรนด์การตั้งค่าการมองเห็น, พินหรือคุณสมบัติอื่น ๆตรวจสอบจุดในกล่องค้นหาวัตถุในระดับชั้นโดยใช้ชื่อ "จุด"การจัดการ TempStorage (ซึ่งสามารถใช้เพื่อย้ายรูปแบบชั่วคราวไปยัง "สถานที่ไกล" และนำกลับมาในภายหลัง)คลิกตัวช่วยตรวจจับการจับสนับสนุนสนับสนุนการตรวจสอบแท็ก (โดยเฉพาะอย่างยิ่งตามลำดับชั้น)เชื่อมตัวกระตุ้นกับ EventManager . AudioUtils . ตั้งค่า GrabUtil . ฟังก์ชันช่วยสำหรับการจับ