Hỗ trợ các hệ thống

*Nội dung này được dịch bằng AI (Beta) và có thể có lỗi. Để xem trang này bằng tiếng Anh, hãy nhấp vào đây.

Chúng tôi đã sử dụng các hệ thống sau đây để hỗ trợ cả hai hệ thống chơi cơ bản , cũng như bất kỳ mục tiêu nào của các yêu cầu thiết kế chính .

Sử dụng Manager

Quản lý viên sử dụng cung cấp một API đơn giản để áp dụng một đối tượng được lấy lên một cái gì đó, như một mảnh quần áo lớp trên một người mẫu.Chức năng chính của API này là UseManager.AddUse (nhãn, mục tiêu, khoảng cách, onSuccess, onNothingEquipped, onWrongEquipped, dữ liệu bổ sung), which gắn một bộ nhãn vào targetObjects .Khi một người chơi có một đối tượng với một trong những thẻ và nhấp vào một targetObject, chức năng onSuccess callback được gọi.Các chức năng gọi khác cho phép chúng tôi hiển thị thêm thông tin hình ảnh cho người chơi nếu một lần nhấp chuột được thực hiện mà không có một vật phẩm bị lấy hoặc với loại vật phẩm sai.

Chúng tôi có thể loại bỏ "sử dụng" với UseManager.RemoveUse, thường hữu ích khi một nhiệm vụ được hoàn thành hoặc một mục cụ thể được "sử dụng".Ngoài ra, chúng ta có thể thêm hoặc xóa mục tiêu với AddUseTargetsRemoveUseTargets .

Nổi bật

Khi một người chơi ở gần một vật phẩm có liên quan, chẳng hạn như một con dấu, chúng tôi muốn có vật phẩm đó nổi bật khỏi môi trường xung quanh.Để thực hiện điều này, chúng tôi đã tạo ra một LocalScript được gọi là HighlightItems sử dụng một cạnh tròn xung quanh người chơi để phát hiện các chạm với các khối khác, kết nối với sự kiện TouchedTouchEnded .Chức năng getHighlight kiểm tra một số thẻ trên một mesh đã chạm hoặc cha của nó bằng cách sử dụng chức năng trợ giúp GetTaggedObjectUpHierarchy .Nếu không cần bất kỳ nổi bật nào, chúng tôi có thể bắt buộc xóa nó bằng cách sử dụng thẻ NoHighlight .Tuy nhiên, nếu nó cần thiết nhưng không phù hợp với các thẻ khác, chúng ta có thể buộc nó bằng thẻ Quan trọng .

Cái này LocalScript sử dụng một tính năng động cơ mới Highlight mà vẽ một bản vẽ của một đối tượng và/hoặc lấp đầy bên trong đối tượng bằng một màu được xác định; để biết thêm thông tin về cách sử dụng tính năng này, xem Phát sáng đối tượng . Highlights và con trỏ chuột OnItemIndicator hệ thống hoạt động cùng nhau, vì vậy Highlights không chỉ xác định xem một khối có cần được tô sáng hay không, mà còn cung cấp một loại khối khối cho OnItemIndicator .

HighlightItemsFunc được sử dụng để giao tiếp với các hệ thống khách hàng khác.Ví dụ, EventManager sử dụng nó với lệnh Bật để bật hoặc tắt một Highlight trong một số cảnh cắt, và OnItemIndicator sử dụng GetType để hỏi về loại đối tượng nó là.Để phát hiện khi một vật phẩm không còn hiện diện, chẳng hạn như khi một phòng bị hư hỏng, chúng tôi kết nối với CollectionService.GetInstanceRemovedSignal .

Lore và ThoughtBubbles

LoreThoughtBubbles là 2 hệ thống tương tự.Lore sử dụng một ScreenGui như một thùng chứa UI trên màn hình với một đứa con Frame để kiểm soát kích thước và thay đổi kích thước của con cái của nó TextLabelsImageLabels , và lore chờ người chơi nhấp vào bất cứ nơi nào trên màn hình để xóa nó.Tương tự, bong bóng suy nghĩ sử dụng một BillboardGui với một đứa con TextLabel đối với các đối tượng không biết và hiển thị cuộc đối thoại trong không gian 3D gần đối tượng trong một thời gian và thời gian chờ nhất định mà không có văn bản chiếm toàn bộ màn hình.Để biết thêm thông tin về thiết kế đằng sau các hệ thống này, hãy xem LoreBong bóng suy nghĩ.

Lore được thực hiện trong LoreManger LocalScript .Khi nhấp hoặc chạm vào, nó bắn một tia bắn sử dụng chức năng trợ giúp utils.RaycastAlongPointingDir , và nó sử dụng một nhóm NoPlayerCollision .Nếu một mesh dưới nút nhấp hoặc một trong những cha có thẻ Lore hoặc ThoughtBubble , chúng tôi hiển thị UI.Văn bản, phụ đề và hình ảnh được định nghĩa bởi các thuộc tính LoreText, LoreCaption và LoreImage trên đối tượng.

Lưu ý rằng chúng tôi sử dụng Camera.ViewportPointToRay hoặc Camera.ScreenPointToRay để xây dựng chùm tia, tùy thuộc vào việc nó được gọi từ không chạm hoặc chạm.Các điểm cực trùng nằm trong một số hệ tọa độ khác nhau.Đối với chuột, chúng ta nhận chúng từ Class.UserInputService.InputEnded``:Connect đối với MouseButton1, và đối với các thiết bị di động, chúng ta nhận chúng từ Class.UserInputService.TouchTapInWorld``:Connect .

Bong bóng suy nghĩ tổng thể giống nhau, sử dụng một raycast để kiểm tra xem liệu một khối lưới hay cha mẹ của nó có nhãn Bong bóng suy nghĩ hay không.Nó cũng sử dụng thuộc tính ThoughtText cho văn bản, và một thẻ Bong bóng suy nghĩ để chỉ vào một đối tượng placeholder được sử dụng để đặt UI trên thế giới.Bong bóng suy nghĩ sử dụng cùng một đối tượng vị trí nhưng có chữ khác nhau có thời gian chờ khác nhau.

Trường hợp đặc biệt

Lore có một vài trường hợp đặc biệt, một trong số đó là những con dơi bị hỏng.Khi một người chơi nhấp vào một con dấu bị hỏng, nó hiển thị giao diện người dùng lore, và nó chờ đợi một lần nhấp để bắt đầu một nhiệm vụ, ảnh hưởng đến dòng chảy trò chơi.Điều này được xử lý bởi GameStateClient sử dụng một bindable LoreManagerFunc để yêu cầu giao diện người dùng lore.Một cuộc gọi lại được cung cấp cho hệ thống Lore bởi GameStateClient để biết khi nào lore bị "đóng" bởi người chơi.Một trường hợp đặc biệt khác là khi ThoughtBubblesLore nhãn ở trên cùng một đối tượng.Trong trường hợp này, để tránh sự chồng lấp giữa lore và văn bản bong bóng suy nghĩ, chúng tôi chạy bong bóng suy nghĩ sau khi lore được đóng. LoreManager cũng xử lý một trường hợp đặc biệt với việc hiển thị một cảnh cắt nhỏ khi nhấp vào cửa bị vô hiệu hóa được khóa cho đến khi người chơi nhặt dấu hiệu của phòng.

Trình chỉ thị vật phẩm OnItemIndicator

Chúng tôi muốn hiển thị các biểu tượng khác nhau ở trung tâm màn hình khi người chơi đang xem các mục quan tâm nhất định.Tập lệnh khách OnItemindicator thực hiện một raycast dọc theo camera Class.CFrame.LookVector và phân tích kết quả.Dựa trên kết quả, nó thiết lập một hình ảnh trong OnItemIndicator2 ScreenGui .

Khi không có vật phẩm quan tâm nào bị đánh, biểu tượng mặc định là một chấm nhỏ.Chúng tôi có thể đặt bất kỳ biểu tượng nào bằng cách thêm một thuộc tính OnItemIndicator vào một lưới cụ thể, bằng cách sử dụng các tên từ onItemIndicatorImages, chẳng hạn như Bàn tay, Mắt hoặc Cửa hiện đang bị khóa.Thuộc tính chỉ cần thiết trong những trường hợp hiếm hoi, và hầu hết thời gian các thẻ hoặc hệ thống hiện có cung cấp loại biểu tượng.Để biết thêm chi tiết, xem chức năng Update .

Kiểm tra một số trong một trật tự ưu tiên.Sau khi vô hiệu hóa OnItemIndicator, chúng tôi kiểm tra xem nó có thể nắm lấy hoặc là một ngăn kéo cho biểu tượng "tay" thông qua utils.CanGrabModel(model) hoặc utils.GetTaggedObjectUpHierarchy("Drawer2", model) .Sau đó, chúng tôi gọi HighlightManager để xác định tình trạng tháinổi bật, các loại vật phẩm và biểu tượng nào sẽ sử dụng.Ví dụ:


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

Các thẻ Lore và ThoughtBubble được kiểm tra sau bằng cách kiểm tra các thẻ.Đối với các cửa, chúng tôi có 2 biểu tượng khác nhau: Cửa hiện đang đóngCửa luôn bị khóa . DoorManager > đặt một thuộc tính true hoặc false DoorEnabled cho các cửa có thể mở hoặc đóng, và chúng tôi sử dụng sự hiện diện và giá trị của thuộc tính.Các đối tượng trông giống như cửa nhưng không mở có thẻ Cửa bị khóa .

Quản lý cửa

The Quản lý cửa LocalScript sử dụng một thẻ CửaCollectionService để quản lý mở và đóng cửa.Cửa có các kích hoạt bên trước và bên sau mà chúng tôi kết nối với các sự kiện chạm và touchEnded .Chúng tôi tạo thiếu niên để mở và đóng cửa từ phía trước và phía sau.Chúng tôi duy trì một bản đồ gần người chơi (của người chơi chạm vào các cảm biến, riêng biệt cho phía trước và phía sau.

Mỗi cửa có một hệ thống trạng thái đơn giản, DoorState (Đóng, Mở, Mở, Đóng), với tuổi teen được sử dụng cho các chuyển đổi.Chúng tôi có thể bật hoặc tắt khả năng mở hoặc đóng cửa từ các hệ thống bên ngoài bằng cách gọi DoorManager.EnableDoor, đặt một thuộc tính DoorEnabled.

Người Hoạ Sĩ Chính

The MasterAnimator LocalScript chơi hình ảnh hoạt hình (bản đồ kết cấu), mà chúng tôi đã sử dụng để hoạt hình màn hình TV.Để cuộn qua các hình ảnh, chúng tôi cần biết một bộ các tham số: số lượng hàng và cột, tổng số khung, perios, kích thước hình ảnh và một bộ ID hình ảnh.Hệ thống cho phép chúng tôi hoạt hình trên nhiều hình ảnh, mỗi hình có thể chia thành các hàng và cột của các hình ảnh con.Chúng tôi có thể cung cấp dữ liệu này thông qua các thuộc tính hoặc giá trị, nhưng trong trải nghiệm này, chúng tôi đã sử dụng các kịch bản trợ giúp.UpdateImageAnimations(dT) tính toán hình ảnh hoặc subảnh nào chúng ta cần hiển thị bằng cách sử dụng thời gian và tham số.Nếu chúng ta cần thay đổi sang hình ảnh mới, chúng ta thiết lập Image.Nếu chúng ta cần thay đổi bất kỳ subimage nào, chúng ta đặt ImageRectOffset .

Một đối tượng với một hình ảnh di chuyển SurfaceGui sẽ có một Animator ModuleScript, với mục đích chính là cung cấp một chức năng Animator.GetParams trả về tất cả các tham số.Điều này giúp MasterAnimator LocalScript sử dụng thẻ ImageAnimationCollectionService để thu thập các đối tượng như vậy, và tìm Animator ModuleScript bên dưới chúng.Sau đó, nó sử dụng pcall để yêu cầu Animator ModuleScript và gọi GetParams trên nó.

Hoạt hình không gian địa phương

Các Hoạt hình không gian địa phương LocalScript sử dụng thẻ LocalSpaceRotation để xoay chủ yếu là các đối tượng "thẩm mĩ" với tốc độ quay và thời gian trì hoãn xung quanh trục X, Y hoặc Z.Chúng tôi sử dụng nó cho các đối tượng xa mà người chơi sẽ không tương tác hoặc cho các đối tượng nhỏ hơn không ảnh hưởng nhiều đến mô phỏng.Các tham số được xác định thông qua Speed , DelayAxis giá trị.Đối với chi tiết thực hiện, xem Rotating Cloud Meshes .

Quản lý đèn pha

The Quản lý đèn pha LocalScript xử lý khi người dùng chọn trên màn hình ImageButton để bật/tắt đèn chiếu vào đỉnh đầu của họ, bắn bình luận lên máy chủ bằng sự kiện HeadlampEvent, và chuyển đổi chuyển đổi âm thanh bật/tắt.Khi một nhân vật được thêm vào, hoặc phần Head của họ được thay đổi, chức năng giveCharacterHeadlamp sẽ nhân bản đèn mặt trước đèn, và đặt đèn ở các vị trí bằng một số chênh lệch và xoay từ FaceFrontAttachment .

Quản lý ghế ngồi

Chúng tôi không muốn người chơi tự động ngồi khi gần một vật mà họ có thể ngồi.Thay vào đó, chúng tôi muốn yêu cầu người dùng nhấp gần một chỗ ngồi để ngồi.Tập lệnh Quản lý chỗ ngồi thêm ClickDetectors dựa trên một thẻ Chỗ ngồi và gọi seat:Sit(humanoid) khi nhấp vào.Khi dịch chuyển người chơi giữa trạng thái bình thường và bị hỏng của một phòng, chúng ta không thể có người chơi ngồi vì CFrame phối trí thay đổi sẽ không thể hoạt động, vì vậy Quản lý ghế có chức năng để vô hiệu hóa hoặc bật khả năng ngồi một vài giây trước và sau dịch chuyển.

Quản lý ngăn kéo

Tập lệnh Quản lý ngăn kéo sử dụng thẻ Drawer2CollectionService để xử lý nhấp vào ngăn kéo để mở hoặc đóng chúng, và phát bất kỳ âm thanh phù hợp nào.Hành động mở và đóng được thực hiện bằng cách đặt TargetPosition cho một PrismaticConstraint .

Số lượng giết chết

Trong một vài khu vực của khu vực chơi chính, như tia lửa điện và nước gần khởi đầu của con đường dẫn đến nhà, một người chơi có thể có cài đặt Humanoid.Health của họ thành 0 khi vào một âm lượng với thẻ KillVolume .Tập lệnh KillVolumes sử dụng Touched:Connect để xác định khi nào một người chơi bước vào một volume, sau đó giảm sức khỏe của họ xuống 0 .

Tái sinh nhiệm vụ người chơi

Tập lệnh PlayerMissionRespawn sử dụng thẻ RespawnVolumeCollectionService để xử lý các khối lượng khiến người chơi hồi sinh khi chạm vào.Chúng tôi đặt các tập này dưới các phòng bị hỏng, vì nhiều nhiệm vụ có khoảng trống hoặc bệ di chuyển mà người chơi có thể ngã xuống.Khi chạm vào, kịch bản chơi một cảnh cắt nhỏ Teleport_Jump và kích hoạt GameStateFunc với lệnh GameEvents.PlayerRespawn .

Khi xử lý GameEvents.PlayerRespawn, kịch bản có thể sử dụng RespawnPositions, nếu thiết lập nhiệm vụ cung cấp nó.Nếu không, nó sử dụng TeleportPositions cho nhiệm vụ cụ thể.Chúng tôi không có hệ thống "kiểm soát" nên CalcClosestTeleportPos chỉ chọn điểm Respawn hoặc Teleport gần nhất từ nơi mà người chơi đánh vào RespawnVolume, bằng khoảng cách ngang duy nhất, "2D".

Các hệ thống trợ giúp nhỏ

Quản lý piano

Tập lệnh PianoManager sử dụng thẻ PianoCollectionService để thêm ClickDetectors và chơi một trong những âm thanh piano khi nhấp vào bàn phím.

Hỗ trợ nghi thức

Sảnh nơi người chơi đặt dấu hiệu có một thiết bị phức tạp chịu những thay đổi khi mỗi dấu hiệu được đặt ở vị trí được xác định.Ví dụ, tùy thuộc vào số lượng con dấu được đặt, các sự kiện cụ thể chơi để bật/tắt ánh sáng và chùm tia, thay đổi độ trong suốt của một số vật thể, v.v.Hỗ trợ nghi thức RitualSupport ModuleScript là một chiếc bọc nhỏ hơn EventManager:Invoke các cuộc gọi cho những sự kiện đó, cung cấp các tham số cho sự kiện, chẳng hạn như "root object" để chơi nó, tùy thuộc vào loại seal cụ thể được đặt.

Quản lý có thể phục hồi

Một số đối tượng có thể nắm bắt là quan trọng đối với trải nghiệm trò chơi, chẳng hạn như hải cẩu, và chúng tôi không muốn chúng bị mất nếu một người chơi thả chúng ở đâu đó.Nếu một đối tượng có thẻ Có thể khôi phục thì tập lệnh Quản lý khôi phục nhớ lại biến hình của nó khi nó được thêm vào hệ thống khôi phục.Khi một người chơi thả một vật như vậy, hệ thống nắm bắt gọi restorableManager.StartTracking .Nếu đối tượng không được lấy lại trong vòng năm giây, RestorableManger kịch bản vị trí nó tại biến dạng ban đầu và thiết lập lại thời gian theo dõi.

Cổng

Trong một vài nhiệm vụ, chúng tôi dịch chuyển người chơi một khoảng cách ngắn trong một nhiệm vụ, chẳng hạn như tái sinh người chơi người rơi khỏi một nền tảngxoay.Để đơn giản hóa việc thiết lập loại dịch chuyển này, mà chúng tôi gọi là "Cổng" trong kịch bản, chức năng trợ giúp ProcessPortal trong DemoUtils được sử dụng.Ví dụ, nếu P1 là phần xác định kích hoạt ban đầu, và P2 là phần xác định chuyển đổi người chơi đích, các đoạn mã sau có thể xác định chức năng cổng như sau:


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

Cổng quá trình xử lý kiểm tra rằng phần khác là một con người, dịch chuyển người chơi thông qua một thay đổi vị trí CFrame và kích hoạt một cảnh cắt nhỏ để che giấu sự chuyển đổi bằng cách sử dụng sự kiện Teleport_Jump trong EventManager.

Tập lệnh cấu hình

Chúng tôi có một số cấu hình, định nghĩa dữ liệu và kịch bản chức năng chung: DemoConfig . Định nghĩa của nhiệm vụ. Số lượng cho các trạng thái trò chơi, sự kiện cho giao tiếp khách-máy chủ. Cài đặt DemoGlobal .Chúng tôi phát triển ở một địa điểm, nhưng phát hành (và thử nghiệm) ở nơi khác.Tập lệnh kiểm tra placeID và bật/tắt các hack và chức năng gỡ lỗi khác nhau. Công cụ Demo .Nhiều chức năng tiện ích.Xử lý với biến dạng.Đặt hiển thị, neo hoặc các thuộc tính khác.Kiểm tra cho một điểm trong một hộp.Tìm các đối tượng trong cấu trúc theo tên "dotted".Quản lý TempStorage (có thể được sử dụng để di chuyển tạm thời các mô hình "ở đâu đó xa" và mang trở lại sau).Nhấp vào trợ lý phát hiện.Nắm lấy hỗ trợ.Hỗ trợ kiểm tra thẻ (đặc biệt là dọc theo cấp bậc).Kết nối các cảnh báo với EventManager. AudioUtils . Một vài chức năng để chơi các âm thanh ngẫu nhiên có trọng lượng từ một cài đặt. GrabUtil . Chức năng trợ giúp cho việc lấy.