Mendukung sistem

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Kami menggunakan sistem berikut untuk mendukung kedua sistem permainan dasar , serta setiap tujuan dari persyaratan desain utama .

Gunakan Manajer

Pengelola Penggunaan memberikan API sederhana untuk menerapkan objek yang ditangkap ke sesuatu, seperti potongan pakaian berlapis ke mannequin.Fungsi utama untuk API ini adalah UseManager.AddUse (tag, targetObjek, jarak, pada sukses, pada tidak dilengkapi, pada salah dilengkapi, ekstraData), yang mengikat serangkaian tag ke targetObjek .Ketika pemain memiliki objek dengan salah satu tag dan mengklik pada targetObject, fungsi panggilan balik onSuccess dipanggil.Fungsi panggilan lain memungkinkan kami untuk menampilkan informasi visual ekstra kepada pemain jika klik dilakukan tanpa mengambil item atau dengan jenis item yang salah.

Kami bisa menghapus "penggunaan" dengan UseManager.RemoveUse, yang biasanya berguna ketika misi selesai atau item spesifik "digunakan".Selain itu, kita bisa menambahkan atau menghapus target dengan AddUseTargets dan RemoveUseTargets .

Peringatan

Ketika seorang pemain berada di dekat item yang menarik, seperti seal, kami ingin memiliki item itu menonjol dari sekitarnya.Untuk menerapkan ini, kami membuat LocalScript yang disebut HighlightItems yang menggunakan bola berpusat di sekitar pemain untuk mendeteksi sentuhan dengan mesh lain, terhubung ke Touched dan TouchEnded peristiwa.Fungsi getHighlight memeriksa beberapa tag pada mesh yang disentuh atau orang tuanya menggunakan fungsi bantuan Mendapatkan TaggedObjectUpHierarchy .Jika sorotan tidak diperlukan, kami bisa menghapusnya secara paksa menggunakan tag Tidak Ada Sorotan .Namun, jika diperlukan tetapi tidak cukup cocok dengan berbagai tag lain, kami bisa memaksanya menggunakan tag Penting .

Ini LocalScript menggunakan fitur mesin baru Highlight yang menarik garis besar objek dan/atau mengisi interior objek dengan warna yang didefinisikan; untuk informasi lebih lanjut tentang cara menggunakan fitur ini, lihat Menyoroti Objek . Highlights dan kursor mouse OnItemIndicator sistem bekerja bersama, jadi Highlights tidak hanya menentukan apakah mesh membutuhkan sorotan, tetapi juga menyediakan jenis mesh untuk OnItemIndicator .

HighlightItemsFunc digunakan untuk berkomunikasi dengan sistem klien lain.Sebagai contoh, EventManager menggunakannya dengan perintah Aktifkan untuk mengaktifkan atau menonaktifkan Highlight di adegan tertentu, dan Indikator ItemOnline menggunakan GetType untuk menanyakan jenis objeknya.Untuk mendeteksi kapan suatu item tidak lagi hadir, seperti ketika kamar korup dihancurkan, kami terhubung ke CollectionService.GetInstanceRemovedSignal .

Lore dan ThoughtBubbles

Pengetahuan dan Gelembung Pikiran adalah 2 sistem serupa.Lore menggunakan ScreenGui sebagai wadah UI di layar dengan anak Frame untuk mengontrol ukuran dan penyesuaian anak-anaknya TextLabels dan ImageLabels , dan lore menunggu pemain untuk mengklik di mana saja di layar untuk menghapusnya.Demikian pula, gelembung pemikiran menggunakan BillboardGui dengan anak TextLabel ke objek non-lore, dan menampilkan dialog di ruang 3D dekat objek untuk jangka waktu dan periode istirahat tertentu tanpa teks mengambil seluruh layar.Untuk informasi lebih lanjut tentang desain di balik sistem ini, lihat Lore dan Gelembung Pemikiran.

Lore diterapkan dalam LoreManger LocalScript .Ketika diklik atau disentuh, ia menembakkan raycast menggunakan fungsi pembantu utils.RaycastAlongPointingDir , dan menggunakan grup Tidak Ada PemainTabrakan .Jika mesh di bawah klik atau salah satu orangtua memiliki tag Lore atau PikiranBubble , kami menampilkan UI.Teks, caption, dan gambar didefinisikan oleh atribut LoreText, LoreCaption, dan LoreImage pada objek.

Perhatikan bahwa kami menggunakan Camera.ViewportPointToRay atau Camera.ScreenPointToRay untuk membangun sinar, tergantung pada apakah itu dipanggil dari non-touch atau touch.Koordinat berada di sistem koordinat yang agak berbeda.Untuk mouse, kami mendapatkannya dari Class.UserInputService.InputEnded``:Connect untuk MouseButton1, dan untuk perangkat sentuh, kami mendapatkannya dari Class.UserInputService.TouchTapInWorld``:Connect .

Gelembung Pikiran secara keseluruhan mirip, menggunakan raycast untuk memeriksa apakah mesh atau orangtuanya memiliki tag Gelembung Pikiran .Ini juga menggunakan atribut ThoughtText untuk teks, dan tag Gelembung Pemikiran untuk menunjuk ke objek placeholder yang digunakan untuk menempatkan UI di dunia.Gelembung pemikiran yang menggunakan objek posisional yang sama tetapi memiliki teks yang berbeda memiliki cooldown yang berbeda.

Kasus khusus

Lore memiliki beberapa kasus khusus, salah satunya adalah seal yang rusak.Ketika pemain mengklik selubung yang rusak, itu menampilkan lore UI, dan menunggu klik untuk memulai misi, yang mempengaruhi aliran permainan.Ini ditangani oleh GameStateClient yang menggunakan bindable LoreManagerFunc untuk meminta UI lore.Sebuah panggilan kembali disediakan ke sistem Lore oleh GameStateClient untuk mengetahui kapan lore "ditutup" oleh pemain.Kasus khusus lainnya adalah ketika Gelembung Pikiran dan Pengetahuan tag berada di objek yang sama.Dalam hal ini, untuk menghindari penumpangan lore dan teks gelembung pemikiran, kami menjalankan gelembung pemikiran setelah lore ditutup. LoreManager juga menangani kasus khusus dengan menampilkan adegan kecil saat mengklik pintu yang dinonaktifkan yang terkunci sampai pemain mengambil kunci ruangan.

Pada Indikator ItemOnItemIndicator

Kami ingin menampilkan ikon yang berbeda di tengah layar saat pemain melihat item tertentu yang menarik.Skrip klien OnItemindicator melakukan raycast di sepanjang kamera Class.CFrame.LookVector dan menganalisis hasilnya.Berdasarkan hasilnya, ia menetapkan gambar di OnItemIndicator2 ScreenGui .

Ketika tidak ada item yang menarik dipukul, ikon default adalah titik kecil.Kami dapat mengatur ikon apa pun dengan menambahkan attribute string OnItemIndicator ke mesh tertentu, menggunakan nama dari onItemIndicatorImages , seperti Tangan, Mata, atau DoorCurrentlyLocked.Atribut hanya diperlukan dalam kasus langka, dan sebagian besar waktu tag atau sistem lain memberikan jenis ikon.Untuk lebih banyak rincian, lihat fungsi Update.

Periksa beberapa jenis dalam urutan prioritas.Setelah penghapusan OnItemIndicator , kami memeriksa apakah itu dapat diambil atau laci untuk ikon "tangan" melalui utils.CanGrabModel(model) atau utils.GetTaggedObjectUpHierarchy("Drawer2", model) .Setelah itu, kami memanggil HighlightManager yang menentukan status sorotan, jenis item, dan ikon yang akan digunakan.Sebagai contoh:


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

Tag Lore dan ThoughtBubble diperiksa nanti dengan memeriksa tag.Untuk pintu, kami memiliki 2 ikon berbeda: PintuSaatIniTutup dan PintuSelaluTerkunci . DoorManager mengatur atribut benar atau salah DoorEnabled untuk pintu yang dapat dibuka atau ditutup, dan kami menggunakan kehadiran dan nilai atribut.Objek yang terlihat seperti pintu tetapi tidak terbuka memiliki tag DoorLocked .

Manajer Pintu

The DoorManager LocalScript menggunakan tag Pintu dan CollectionService untuk mengelola pembukaan dan penutupan pintu.Pintu memiliki pemicu bagian depan dan belakang yang kamihubungkan dengan sentuhan dan touchEnded peristiwa.Kami membuat remaja untuk membuka dan menutup pintu dari depan dan sisi belakang.Kami memelihara peta pemainDekat (pemain yang menyentuh pemicu, secara terpisah untuk bagian depan dan belakang.

Setiap pintu memiliki sistem negara sederhana, DoorState (Tutup, Terbuka, Terbuka, Tutup), dengan remaja yang digunakan untuk transisi.Kami bisa mengaktifkan atau menonaktifkan kemampuan pintu untuk membuka atau menutup dari sistem eksternal dengan memanggil DoorManager.EnableDoor , yang menetapkan atribut DoorEnabled.

Animator Utama

The Animator Utama LocalScript memutar gambar beranimasi (atlas tekstur), yang kami gunakan untuk menganimasikan layar TV.Untuk bergulir melalui gambar, kami perlu tahu serangkaian parameter: jumlah baris dan kolom, total frame, periode, dimensi gambar, dan serangkaian ID gambar.Sistem memungkinkan kami untuk menganimasikan di antara banyak gambar, masing-masing mungkin terbagi menjadi baris dan kolom sub-gambar.Kami bisa menyediakan data ini melalui atribut atau nilai, tetapi dalam pengalaman ini, kami menggunakan skrip bantuan. UpdateImageAnimations(dT) menghitung gambar atau subgambar apa yang perlu kita tampilkan menggunakan waktu dan parameter.Jika kita perlu beralih ke gambar baru, kita mengatur Gambar.Jika kita perlu mengubah subimage apa pun, kita atur ImageRectOffset .

Sebuah objek dengan animasi SurfaceGui akan memiliki Animator ModuleScript, dengan tujuan utama untuk menyediakan fungsi Animator.GetParams yang mengembalikan semua parameter.Ini membantu MasterAnimator LocalScript yang menggunakan tag Animasi Gambar dan CollectionService untuk mengumpulkan objek seperti itu, dan menemukan Animator ModuleScript di bawahnya.Kemudian menggunakan pcall untuk memerlukan Animator ModuleScript dan memanggil GetParams di atasnya.

Animasi Ruang Lokal

The Animasi Ruang Lokal LocalScript menggunakan tag Rotasi Ruang Lokal untuk memutar sebagian besar objek "kosmetik" dengan kecepatan rotasi dan penundaan di sekitar sumbu X, Y, atau Z.Kami menggunakan ini baik untuk objek jauh yang tidak akan berinteraksi dengan pemain, atau untuk objek yang lebih kecil yang tidak mempengaruhi simulasi banyak.Parameter yang didefinisikan melalui Speed , Delay , dan Axis nilai.Untuk rincian implementasi, lihat Meshes Cloud Berputar.

Manajer Lampu Kepala

The Manajer Lampu Kepala LocalScript menangani saat pengguna memilih di layar ImageButton untuk mengaktifkan sorotan di atas kepala mereka atau mati, menangani komentar ke server menggunakan HeadlampEvent, dan piring beralih pada dan mati.Ketika karakter ditambahkan, atau Head mereka diubah, fungsi giveCharacterHeadlamp mengkloning lampu template dan menempatkan lampu menggunakan beberapa offset dan rotasi dari FaceFrontAttachment .

Manajer Kursi

Kami tidak ingin pemain otomatis duduk saat dekat dengan objek yang bisa mereka duduki.Sebagai gantinya, kami ingin meminta pengguna untuk mengklik dekat kursi untuk duduk.Skrip Manajer Kursi menambahkan ClickDetectors berdasarkan tag Kursi dan memanggil seat:Sit(humanoid) saat diklik.Saat menteleportasi pemain antara keadaan normal dan korup ruangan, kami tidak dapat memiliki pemain duduk karena CFrame koordinasi perubahan tidak akan dapat bekerja, jadi Manajer Kursi memiliki fungsi untuk menonaktifkan atau mengaktifkan kursi beberapa detik sebelum dan setelah berteleportasi.

Manajer Drawer

Skrip Manajer Drawer menggunakan tag Drawer2 dan CollectionService untuk menangani klik pada laci untuk membukanya atau menutupnya, dan memutar audio yang sesuai.Tindakan pembukaan dan penutupan dilakukan dengan menetapkan TargetPosition untuk PrismaticConstraint .

Volume Bunuh

Di beberapa area dari area permainan utama, seperti percikan listrik dan air di dekat awal jalan menuju rumah, pemain dapat mengatur Humanoid.Health ke 0 ketika memasuki volume dengan tag KillVolume .Skrip KillVolumes menggunakan Touched:Connect untuk menentukan kapan pemain memasuki volume, lalu mengurangi kesehatannya menjadi 0 .

Respawn Misi Pemain

Skrip PlayerMissionRespawn menggunakan tag RespawnVolume dan CollectionService untuk menangani volume yang membuat pemain respawn saat disentuh.Kami menempatkan volume ini di bawah kamar korup, karena banyak misi memiliki celah atau platform bergerak di mana pemain bisa jatuh.Saat disentuh, skrip memainkan adegan pendek Teleport_Jump dan memanggil dengan perintah .

Saat memproses GameEvents.PlayerRespawn, skrip dapat menggunakan RespawnPositions, jika konfigurasi misi menyediakannya.Jika tidak, ia menggunakan TeleportPositions untuk misi khusus.Kami tidak memiliki sistem "checkpoint", jadi CalcClosestTeleportPos hanya memilih titik Respawn atau Teleport terdekat dari tempat pemain memukul RespawnVolume, menggunakan jarak horizontal, "2D" yang hanya.

Sistem pembantu kecil

Manajer Piano

Skrip PianoManager menggunakan tag Piano dan CollectionService untuk menambahkan ClickDetectors dan memainkan salah satu suara piano saat diklik di keyboard.

Dukungan Ritual

Lobi di mana pemain menempatkan seal memiliki konstruksi rumit yang mengalami perubahan saat setiap seal ditempatkan di lokasi yang ditentukan.Sebagai contoh, tergantung pada jumlah seal yang ditempatkan, acara khusus dimainkan untuk mengaktifkan/menonaktifkan lampu dan balok, mengubah transparansi objek tertentu, dll.The Dukungan Ritual ModuleScript adalah pembungkus kecil di atas EventManager:Invoke panggilan untuk peristiwa tersebut, menyediakan parameter ke peristiwa, seperti apa "objek akar" untuk dimainkannya, tergantung pada apa seal khusus yang ditempatkan.

Manajer Dapat Dipulihkan

Beberapa objek yang dapat diambil penting untuk gameplay, seperti lumba-lumba, dan kami tidak ingin mereka tersesat jika pemain menjatuhkannya di suatu tempat.Jika objek memiliki tag Dapat dipulihkan , skrip Manajer Dapat dipulihkan mengingat transformasinya saat ditambahkan ke sistem pemulihan.Ketika pemain menjatuhkan objek seperti itu, sistem penangkapan memanggil restorableManager.StartTracking .Jika objek tidak diambil kembali dalam lima detik, skrip Manajer Dapat dipulihkan menempatkannya di transformasi asli dan mengatur ulang waktu pelacakan.

Perantara

Dalam beberapa misi, kami teleport pemain jarak pendek dalam misi, seperti memunculkan kembali pemain yang jatuh dari platform berputar.Untuk mempermudah pengaturan jenis teleportasi ini, yang kami sebut "Portal" dalam skrip, fungsi bantuan ProcessPortal di DemoUtils digunakan.Sebagai contoh, jika P1 adalah bagian yang mendefinisikan trigger awal, dan P2 adalah bagian yang mendefinisikan transformasi pemain tujuan, kode potongan berikut bisa mendefinisikan fungsi portal seperti berikut:


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

Portal Proses menangani pemeriksaan bahwa bagian lain adalah manusia, teleportasi pemain melalui perubahan koordinat CFrame , dan memanggil adegan pendek kecil untuk menyembunyikan transisi menggunakan peristiwa Teleport_Jump di EventManager.

Skrip konfigurasi

Kami memiliki beberapa konfigurasi, definisi data, dan skrip fungsi umum: DemoConfig . Definisi misi. Enumerasi untuk negara permainan, peristiwa untuk komunikasi klien-server. Pengaturan DemoGlobal .Kami berkembang di satu tempat, tetapi rilis (dan playtest) di tempat lain.Skrip memeriksa placeID dan mengaktifkan/menonaktifkan berbagai cheat dan fungsi debugging. DemoUtils .Berbagai fungsi utilitas.Berhadapan dengan transformasi.Mengatur visibilitas, diikat atau properti lainnya.Memeriksa untuk titik di kotak.Menemukan objek dalam hierarki dengan nama "berdasarkan titik"Mengelola TempStorage (yang dapat digunakan untuk sementara memindahkan model "di suatu tempat jauh" dan membawanya kembali nanti).Klik pembantu detektor.Mengambil dukungan.Dukungan untuk memeriksa tag (terutama di sepanjang hierarki).Menghubungkan pemicu ke Manajer Acara. AudioUtils . Beberapa fungsi untuk memutar suara acak berat dari satu atur. GrabUtil . Fungsi pembantu untuk mengambil.