Các hệ thống sau đây là nền tảng cho việc xây dựng gameplay mà chúng tôi muốn cho The Mystery of Duvall Drive .
Quản lý trạng thái trò chơi
The GameStateManager / GameStateClient is probably the most complicated system in the experience, as it deals with:
- Bắt đầu người chơi trong sảnh, bắt đầu đếm ngược để dịch chuyển nhóm đến khu vực chơi chính, và dịch chuyển người chơi đến máy chủ dự phòng.
- Nhân bản các phòng bị hỏng, xử lý chúng theo nhúc nhích và dịch chuyển người chơi tới và từ một坐标 CFrame cụ thể.
- Lấy và đặt các cơ cấu chặn.
- Khóa và mở khóa cửa.
- Khởi tạo teleport cuối cùng đến sảnh và chơi cảnh cắt cuối cùng.
Chúng tôi thực hiện nó như một máy chủ trạng thái đơn giản (chức năng Cập nhật ) và các trạng thái được ở trong DemoConfig (ensemble de states). Một số trạng thái xử lý với máy chủ đầu tiên/được lưu trữ, trong khi những tr
GameStates là chủ yếu là lập trình viên máy chủ, nhưng khi khách hàng cần làm điều gì đó, chẳng hạn như hiển thị đếm ngược, lore hoặc vô hiệu hóa UI người dùng phát sóng trực tiếp, máy chủ và khách hàng (GameStatesClient) trò chuyện thông qua một
Tiểu sử game Teleportation
Có một nhóm các trạng thái game 3 mà chạy ba cảnh cắt độc đáo ẩn trang dị
Khi đang xử lý phát sóng, InFlight chạy, giữ màn hình tối nhịp nhàng. Khi cả
Một bộ gồm cảnh cắt tương tự của Warmup, InFlight và Cooldown cutscenes xảy ra khi chúng tôi dịch người chơi trở về trạng thái bình th
Các trạng thái trò chơi Ánh sáng và Khí t�ợng
Chúng tôi biết rằng chú
Đang Khóa Tình Trạng Cửa
Quản lý sự kiện
EventManager cho phép chúng tôi chạy "hành động" theo thời gian bằng cách sử dụng keyframes, ví dụ như:
- Đang xử lý thuộc tính và đặc tính của instância.
- Chạy các kịch bản.
- Đang chơi âm thanh.
- Đang chạy h�� tay máy ảnh.
Chúng tôi thường sử dụng một công cụ có UI dựa trên chuyển động, nhưng trong phần này của hội thảo, chúng tôi đã nhập các chìa khóa và tên tùy chỉnh bằng tay. Hệ thống EventManager bao gồm một số script và một hành động/chức năng, bao gồm:
- EventManager - Tổng quát về đồng hồ thời gian cho phép tạo và ngừng các sự kiện, cũng như các hành động bên máy chủ.
- EventManagerClient - Hành động bên client.
- EventManagerModule - Mã chung cho cả hai hành động của máy chủ và bên kia client.
- EventManagerConfig - Tập tin nhỏ với một vài tuyên bố command.
- EventManagerDemo - Nơi tất cả các sự kiện thực tế cho demo này được định nghĩa trong tập lệnh riêng của game.
- EventManagerEvent , EventManagerFunc - Tùy chỉnh sự kiện và chức năng liên quan đến kết nối để thực hiện và ngừng các sự kiện từ khách hàng hoặc máy chủ. Đây là cách các hệ thống khác có thể cài đặt, thi hành và ngừng các sự kiện.
Mỗi sự kiện có một tên, một phần với thông tin tùy chọn về thời gian chạy, hành động để chạy trên khởi động hoặc kết thúc, các tham số hành động, và các lớp với các chất béo (tạo ra bất kỳ sự kiện nào trên thời gian) và các lớp với các chất béo (tạo ra bấ
Biểu tượng
Interpolation cho phép các thuộc tính và đặc tính của đối tượng thay đổi mượt mà từ một giá trị đến một giá trị khác thay vì phải nhảy qua cá
interpolants = {objectParam = "TextLabel",property = "TextTransparency",keys = {{value = 1},{time = .5, value = 0},{time = 2.25, value = 0},{time = 3, value = 1}}}
Mặc dù chúng tôi có thể xác định một số thuộc tính hoặc đặc tính của một đối tượng nào đó thuộc về những nhóm đối tượng nào đó như trong một số mẫu mã như sau, chúng tôi muốn có thể tái sử dụng cùng một số sự kiện trên các nhóm đối tượng khác nhau để cho
object = workspace.SomeFolder.SomeModel
Để thực hiện điều này, chúng tôi cho phép liên kết bằng tên đối tượng và truyền các tham số tên đối tượng trong sự kiện khởi bắt đầu. Để tìm các đối tượng có tên, chúng tôi cho phép
params = {["RootObject"] = workspace.Content.Interior.Foyer["Ritual-DemoVersion"],},interpolants = {objectName = "Wander",attribute = "TimeScale",keys = {{value = 0.2}}}
Chúng tôi cho phép gửi các tham số vào các sự kiện trong mục các tham số, và các script chạy trên mục khởi động sự kiện có thể thay đổi các th
params = {isEnabled = false},interpolants = {{objectName = "FocuserGlow",property = "Enabled",keys = {{valueParam = "isEnabled"}}}
Các biến cho phép chúng tôi đến tham chiếu đến các đối tượng không tồn tại ngay cả ở đầu của trải nghiệm. Ví dụ, trong mẫu mã sau đây, một hàm chạy trên sự kiện khởi động sẽ tạo một đối tượng, và đặt BlackScreenObject vào trong các đối tượng để chỉ vào đối tượng đ
{objectParam = "BlackScreenObject",property = "BackgroundTransparency",keys = {{value = 0},{time = 19, value = 0},{value = 1},}}
Xử lý sự kiện, bộ định tên sự kiện và kết nối với các mối tương giao
Để thực행 một sự kiện, chúng tôi sẽ sử dụng một sự kiện từ xa từ khách hàng hoặc một chức năng từ máy chủ. Trong ví dụ sau đây, chúng tôi đã truyền vài tham số cho RootObject và isEnabled sự kiện. Trong nội bộ, một inst
local params = {RootObject = workspace.Content.Interior.Foyer["Ritual-DemoVersion"]["SealDropoff_" .. missionName],isEnabled = enabled}local eventId = eventManagerFunc:Invoke("Run", {eventName = "Ritual_Init_Dropoff", eventParams = params} )
Chúng ta có thể dừng chạy một sự kiện bằng cách gọi chức năng với "Stop":
eventManagerFunc:Invoke("Stop", {eventInstId = cooldownId} )
Các chất nhờn hoặc hành động khác "thẩm mỹ" (không thay đổi giả tạo cho tất cả người chơi) có thể được thi hành trên các khách hàng, dẫn đến việc tối ưu hóa giả tạo. Trong mô miêu tảsự kiện, chúng tôi có thể cung cấp một giá trị mặc định
Để dễ dàng kết nối một sự kiện đang chạy một sự kiện với một trigger, chúng tôi đã sử dụng các hàm giúp đỡ ConnectTriggerToEvent hoặc ConnectSpawnedTriggerToEvent, trong đ
Tham chiếu sự kiện
Ngoài các tham số sự kiện tùy chỉnh được lưu từ các script, các dữ liệu khác có thể được lưu khi tạo một sự kiện bao gồm người chơi, callback (được gọi khi sự kiện kết thúc), và callback parameters. Một số sự kiện nên chạy chỉ cho một người chơichơ
Sự kiện có thể có cooldowns định nghĩa bởi minCooldownTime và maxCooldownTime . Min và max cung cấp một loạt các bảng điều khiển d
Gọi Skript
Chúng ta có thể gọi Scripts tại các keyframe cụ thể trong Scripts section. Ví dụ:
scripts = {{startTime = 2, scriptName = "EnablePlayerControls", params = {true}, onServer = false }}
Trong ví dụ trước, EnablePlayerControls Class.Script sẽ cần phải được đăng ký với modul quản lý sự kiện, như vậy:
emModule.RegisterFunction("EnablePlayerControls", EnablePlayerControls)
Hàm RegisterFunction phải được gọi trong script client cho các hàm được gọi trên client, và trong script server cho onServer = true . Các hàm tự nhiên sẽ nhận được eventInstance và các tham số được truyền, nhưng trong trường hợp này, chỉ có một tham số được truyền với giá trị true.
local function EnablePlayerControls(eventInst, params)
Chơi âm thanh
Chúng tôi có hỗ trợ giới hạn cho việc chơi âm thanh không định vị tại các khung chìa khóa trong mục Âm thanh , ví dụ:
sounds = {{startTime = 2, name = "VisTech_ethereal_voices-001"},}
Lưu ý rằng các sự kiện kết thúc khiến ngọn lửa khi sự kiện kết thúc, nhưng các hành động âm thanh có thể vẫn đang chơi sau đó.
Lúc Camera Rung
Chúng ta có thể định nghĩa sự rung máy ảnh trong cameraShakes mục, như vậy:
cameraShakes = {{startTime = 15, shake = "small", sustainDuration = 7, targets = emConfig.ShakeTargets.allPlayers, onServer = true},}
“mục tiêu” chỉ có thể được khởi xướng cho người chơi đã kích hoạt sự kiện, tất cảPlayer, hoặc playersInRadius đối với người kích hoạt sự kiện. Chúng tôi đã sử dụng một script của bên thứ ba cho các rung máy, và
Công bố sứ mệnh
Có 7 nhiệm vụ tổng, và chỉ 6 trong số chúng sử dụng các hình ảnh. Hầu hết các nhiệm vụ có các tham số thông thường, mặc dù một số chỉ dành cho các nhiệm vụ với các hình ảnh và dịch chuyển đến các phòng bị hỏng. Mỗi nhiệm vụ có một
- MissionRoot : Một thư mục của tất cả các bản non-corrupt của các thống kê.
- Cửa. : Cửa khóa cho đến khi một người chơi nhặt lên một hòm khóa.
- SealName / SolvedSealName : Các tên Seal và tên Seal bị hỏng.
- SealPlaceName : Nơi để đặt dấu.
- Đặt tên địa điểm của hành lang ở đó bạn sẽ đặt dấu hiệu.
- Tên của một thư mục có tên của một ô định vị nơi để xác định vị trí và hướng dịch người chơi khi di chuyển đến phòng bị hỏng và trở về khu vực bình thường. Cùng một tên được sử dụng ở cả hai trường hợp.
- CorruptRoomName : Tên các thư mục chính (so với ServerStorage) cho các phòng bị hỏng. Các phòng bị hỏng chồng trên TempStorage.Cloned khi khởi động nhiệm vụ, và chúng bị phá hủy khi nhiệm vụ kết thúc.
- MissionCompleteButtonName : Một nút cheat trong các phòng bị hỏng để hoàn thành nhiệm vụ ngay lập tức. Đây là cho mục đích debug .
- CheatKey : Cùng một cheat như một số hoặc CtrlShift[Số] .
Một số trong số logic nhiệm vụ được tìm thấy trong GameStateManager scripts, như các hàng rào và cửa cung cấp dòng chảy chính cho hầu hết các nhiệm vụ, nhưng hầu hết các nhiệm v
- Sử dụng một chìa khóa trên một cái khóa. - Nhiệm vụ đầu tiên để mở cửa. Loại này được định nghĩa bởi LockName , KeyName .
- Vật phẩm phù hợp - 4 vật phẩm phù hợp với nhau. Loại này được định nghĩa bởi MatchItems .
- Đang ăn mặc một người mẫu bằng áo giáp phủ nhiều lớp - 1 nhiệm vụ ở sót có người chơi thu thập ba món đồ. Loại này được định nghĩa bởi DressItemsTagList .
- Click on item to finish - 1 nhiệm vụ có đánh máynày, được định nghĩa bởi ClickTargetName .
Mỗi loại nhiệm vụ có một StartMissionFunc và CompleteMissionFunc riêng. Cấu hình khởi
Logic kết hợp các mục cho phép bạn "sử dụng" (nhấp và giữ) các mục được gắn nhãn với PuzzlePieceXX nhãn. Có một vài lựa chọn có sẵn như
Lấy
Chúng tôi đã phát triển một hệ thống cắm chắn đơn giản để giữ một đố
Trên mỗi khung, chúng tôi kiểm tra xem một lần cố gắng lấy có đang diễn ra không. Nếu người chơi ở trong reachDist , chúng tôi bắt đầu chơi ToolHoldAnim . Khi một người ở trong maxGrabDistance, client khởi chạy một yêu cầu
Script phía máy chủ có 2 chức năng chính:
- Lấy - Lấy yêu cầu của một khách hàng để lấy một mô hình.
- Phát hành - Xử lý yêu cầu phát hành một mô hình đã bị kẹt.
Thông tin về những gì mỗi người chơi giữ được được giữ trong bản đồ playerInfos . Trong chức năng grab, chúng tôi kiểm tra xem mô hình này có đã được grab bởi một người chơi khác không. Nếu vậy - một "Equ
Nếu cho phép kẹp, script tạo hai Attachments , một ở bên phải và một ở bên
Để phát hành một mô hình đã bắt, kết nối script khách hàng với nút GrabReleaseButton trong HUD ScreenGUI. Một hành động Connected kích hoạt một sự kiện đến máy chủ. Trên