我們使用以下系統來支持兩個基礎遊戲系統以及任何主設計要求的目標。
使用管理員
使用管理器 提供了簡單的API來將抓取到的對象應用到某物上,例如將一件分層服裝應用到模特上。此 API 的主要功能是 UseManager.AddUse (標籤、目標對象、距離、成功、沒有配備任何東西、錯誤配備、額外資料),將一組標籤綁定到 目標對象 。當玩家擁有一個標籤並單擊目標對象時,onSuccess呼叫回函將被呼叫。其他呼叫功能讓我們可以在玩家點擊無法抓取物品或使用錯誤類型的物道具時顯示額外的視覺信息。
我們可以使用 UseManager.RemoveUse 移除"使用",通常在任務完成或特定項目"使用"時會很有用。此外,我們可以添加或移除目標 AddUseTargets 和 RemoveUseTargets 。
亮點
當玩家靠近一件有興趣的物品,例如海豹,我們希望那件物品與環境分開。為了實現這一點,我們創建了一個 LocalScript 稱為 突出項目 的方法,使用球體圍繞玩家偵測其他網格的觸碰,連接到 Touched 和 TouchEnded 事件。getHighlight 函數檢查觸摸網格或其父網格上的多個標籤,使用 GetTaggedObjectUpHierarchy 幫助功能。如果不需要任何高亮顯示,我們可以使用 無高亮 標籤強制移除它。然而,如果需要但不太適合各種其他標籤,我們可以使用 重要 標籤強制它。
這個 LocalScript 使用了一個新的引擎功能 Highlight ,可以繪製對象的輪廓並/或填充對物件的內部以定義的顏色;有關如何使用此功能的更多信息,請參閱 強調對象 。Highlights 和鼠標指示器 OnItemIndicator 系統共同工作,因此Highlights 不僅確定網格是否需要突出顯示,還提供一種網格類型給 OnItemIndicator 。
HighlightItemsFunc 用於與其他客戶系統通訊。例如,事件管理器使用 啟用 命令來啟用或禁用某些場景中的Highlight,而 OnItemIndicator 使用GetType來查詢對象的類型。若要偵測物品不再存在,例如當損壞的房間被摧毀時,我們會連接到 CollectionService.GetInstanceRemovedSignal 。
傳說與思想泡泡
傳說 和 思想泡泡 是2個相似的系統。傳說使用 作為屏幕上的用戶介面容器,包含一個子 來控制其兒女的大小和縮放,並等待玩家單擊屏幕任何位置來將其移除。相同地,思想泡泡使用 BillboardGui 與子 TextLabel 對非知識對象進行通訊,並在對象附近的 3D 空間顯示對話,並在文字不佔整個螢幕的情況下顯示對話期間和冷卻期。有關這些系統背後的設計的更多信息,請參閱 傳說 和 思想泡泡 。
歷史實現在 LoreManger LocalScript。當單擊或觸摸時,會使用助助函數 utils.RaycastAlongPointingDir 發射射線投射,並使用 沒有玩家碰撞 群組。如果點擊下的網格或父輩之一有 傳說 或 思想泡泡 標籤,我們會顯示用戶介面。文字、說明和圖像由對物件上的 LoreText、LoreCaption 和 LoreImage 屬性定義。
請注意,我們使用 Camera.ViewportPointToRay 或 Camera.ScreenPointToRay 來構建射線,取決於是否從非觸摸或觸摸中呼叫。坐標系統稍微不同。對於滑鼠,我們從 Class.UserInputService.InputEnded``:Connect 獲得滑鼠按鈕1,對於觸摸設備,我們從 Class.UserInputService.TouchTapInWorld``:Connect 獲得。
思想泡泡大致相似,使用射線投射來檢查網格或其父輩是否有 思想泡泡 標籤。它也使用思想文字特性對文字進行操作,並使用 思想泡泡 標籤指向用於在世界上定位使用者介面的暫時對象。使用相同位置對象的思維泡泡,但文字不同的泡泡有不同的冷卻時間。
特殊情況
傳說有幾個特殊情況,其中之一是被破壞的海豹。當玩家單擊受損的密封時,會顯示傳說用戶介面,並等待一次點擊開始任務,這會影響遊戲流程。這是由使用可綁定的 GameStateClient 來請求傳說介面的 LoreManagerFunc 處理。由 GameStateClient 向倉庫系統提供回呼來知道玩家何時將倉庫 "關閉"。另一個特殊情況是當 思維泡泡 和 傳說 標籤在同一個對物件上時。在這種情況下,為了避免知識和思想泡泡文字重疊,我們在知識關閉後執行思想泡泡。 LoreManager 也處理一種特殊情況,即當玩家撿起房間的密封時,點擊關閉的門時顯示一小段切換場景。
關於項目指標器
當玩家查看特定項目時,我們想在畫面中心顯示不同的圖示。客戶端腳本 OnItemindicator 在相機上進行射線投射,分析結果。根據結果,它在 OnItemIndicator2 ScreenGui 中設置一個圖像。
當沒有受到關注的項目被擊中時,預設圖示是一個小點。我們可以通過添加 在項目指示器 字串屬性到特定網格上來設置任何圖示,使用 onItemIndicatorImages 的名稱,例如手、眼或門目前鎖定。此特性只在稀有情況下需要,大多數時候其他現有標籤或系統提供的圖示類型。欲了解更多詳情,請參閱 Update 功能。
類型檢查某些在優先順序中。在 OnItemIndicator 覆寫之後,我們通過 utils.CanGrabModel(model) 或 utils.GetTaggedObjectUpHierarchy("Drawer2", model) 檢查它是否可以抓取或是"手"圖示的抽屜。之後,我們會呼叫 HighlightManager 來決定高亮狀態、項目類型和要使用的圖示。例如:
highlightItemsFunc:Invoke({"GetType", curInst})
故事和思想泡泡標籤稍後由檢查標籤來檢查。對於門,我們有兩種不同的圖示: 門目前關閉 和 門永遠鎖定 。 > 設置真實或虛假 屬性對可打開或關閉的門,我們使用屬性的存在和值。看起來像門但不打開的物件擁有 門鎖 標籤。
門管理器
門管理器 使用 門標籤和閉門來管理開啟和關閉門。門有前面和後面的觸發器,我們用觸摸和 touchEnded 事件連接。我們創建了青少年來開啟和關閉門,從前面和後面。我們維持一個 玩家靠近 地圖 (玩家碰觸觸發器,單獨為前面和後面。
每扇門都有簡單的狀態系統,DoorState (關閉、開啟、開啟、關閉),使用青少年來進行轉換。我們可以透過呼叫 DoorManager.EnableDoor 啟用或停用門的開啟或關閉功能,該操作會設置 DoorEnabled 屬性。
主動畫師
主動畫師 播放 動畫圖像 (紋理圖集),我們曾使用它來動畫電視螢幕。要滾動通過圖像,我們需要知道一組參數:行和列數量、總框架數量、期間、圖像尺寸和一組圖像ID。系統讓我們可以在多個圖像上進行動畫,每個可能分為行和列的子圖像行列。我們可以透過特性或值來提供這些資料,但在此體驗中,我們使用了幫助腳本。UpdateImageAnimations(dT) 計算出我們需要使用時間和參數來顯示哪個圖像或子圖像。如果我們需要切換到新圖像,我們設置圖像。如果我們需要更改任何子圖像,我們設置 ImageRectOffset。
具有動畫 SurfaceGui 的對象將擁有一名動畫師 ModuleScript ,主要目的是提供返回所有參數的 Animator.GetParams 功能。這有助於使用 圖像動畫 標籤和 來收集這些對象,並在其下找到動畫師 。然後使用 pcall 要求動畫師 ModuleScript 並呼叫 GetParams 在它上。
本地空間動畫
本地空間動畫 使用 本地空間旋轉標籤來旋轉大多數"化妝"物體,以給定的旋轉速度和延遲在X、Y或Z軸上旋轉。我們使用這個來作為遠端對象,玩家不會與其互動,或作為影響模擬不多的較小物件。參數通過 Speed、Delay 和 Axis 值來定義。有關實施細節,請參閱旋轉雲端網格。
頭燈管理器
頭燈管理器當使用者選擇在畫面上的以切換頭部上方或下方的聚光燈時,處理頭燈事件使用頭燈事件發射評論給伺服器,並處理開啟或關閉聚光燈的音效。當角色被添加或其 Head 被更改時,giveCharacterHeadlamp 函數會複製 模板頭燈 燈,並使用一些偏移和旋轉從 面前附件 來定位燈。
座位管理器
我們不希望玩家在靠近可以坐下的物體時自動坐下。相反,我們想要要求使用者在座位附近點擊以坐下。座位管理員腳本添加 座位標籤 基於一個 座位 標籤,並在點擊時呼叫 。當將玩家傳送到房間的正常和破壞狀態之間時,我們不能讓玩家坐下,因為CFrame協調變更將無法工作,因此 座位管理器 有一個功能,可以在傳送之前和之後幾秒鐘禁用或啟用座位。
抽屜管理器
抽屜管理員腳本使用 抽屜2 標籤和 來處理點擊抽屜以打開或關閉它們,並播放相應的音訊。開啟和關閉行動由設置目標位置來完成 PrismaticConstraint 。
殺死音量
在主游戲區域的幾個區域,例如電火花和房子開始路段附近的水,玩家可以在進入音量標籤 Humanoid.Health 時將其設置為 0 時,當他們進入一個音量標籤標籤 殺死音量 時。殺死音量腳本使用來決定玩家何時進入音量,然後將他們的生命值降低到。
玩家任務重生
PlayerMissionRespawn 腳本使用 RespawnVolume 標籤和 CollectionService 來處理會讓玩家重生的音量。我們將這些卷放置在破碎的房間下,因為許多任務有空隙或移動平台,玩家可能會掉下去。當觸碰時,腳本會播放小的 傳送_跳躍 切場景,並使用GameStateFunc指令呼叫GameEvents.PlayerRespawn。
當處理 GameEvents.PlayerRespawn 時,腳本可以使用 RespawnPositions , 如果任務配置提供它。如果不是,它會使用 TeleportPositions 對特定任務進行。我們沒有「檢查點」系統,因此 CalcClosestTeleportPos 只選擇最接近的 重生 或 傳送 點,從玩家擊中 RespawnVolume 的地方,使用唯一的水平、「2D」距離。
小型幫助系統
鋼琴經理
鋼琴管理員 腳本使用 鋼琴 標籤和CollectionService來添加ClickDetectors並播放鍵盤單擊時的一個鋼琴聲音。
儀式支援
玩家放置海豹的大廳有一個複雜的裝置,每當放置一個海豹在其定義位置時,就會發生變化。例如,根據放置的海豹數量,特定事件會播放啟用/禁用燈光和光束、變更特定物體的透明度等等。儀式支援 是對那些事件的小包裝,提供參數給事件,例如要在哪個特定密封上播放的"根對物件",取決於放置了哪個特定密封。
可恢復管理器
一些可抓取的物體對遊玩很重要,例如海豹,如果玩家將它們放在某個地方,我們不希望它們丟失。如果對象具有 可恢復 標籤,其 可恢復管理員 腳本在添加到恢復系統時記住其變形。當玩家掉落此類物件時,抓取系統會呼叫 restorableManager.StartTracking 。如果物件在五秒鐘後沒有再被撿起, 可恢復管理員 腳本將它定位在原始變形並重設追蹤時間。
門戶
在幾個任務中,我們會將玩家傳送到任務內的短距離內,例如 重生玩家 ,他們從旋轉平台上掉下來。為了簡化設置這種類型的傳送,我們在腳指令碼中稱為「門戶」,在 ProcessPortal 中使用了一個幫助函數 **** 。例如,如果 P1 是定義初始觸發器的零件,而 P2 是定義目的地玩家變形的零件,下列代碼片段可以定義此類傳送門功能:
P1.Touched:Connect(function(otherPart) utils.ProcessPortal(otherPart, P2) end)
過程傳送門 處理檢查另一方是否是人類,通過一個 CFrame 坐標變更傳送玩家,並召喚一個小場景來隱藏轉換過程,使用 Teleport_Jump 事件在 事件管理器 中。
配置指令碼
我們有多種配置、數據定義和常見功能腳本: 示範配置 . 任務定義。遊戲狀態數列、客戶端與伺服器通訊事件。 示範全球設定 。我們在一個空間開發,但在其他地方釋放(和試玩)。腳本檢查placeID並啟用/禁用各種作弊和偵錯功能。 示範工具 。各種實用功能。處理變形。設置可見度、錨定或其他屬性。檢查方塊子中的一個點。使用「點線」名稱在階層中尋找對象。管理暫時存儲(可用於暫時將模型「移到很遠的地方」並稍後帶回)。點擊偵測助手。正在抓取支協助。支持檢查標籤(特別是沿著階層)。連接觸發器到事件管理器。 音訊工具 。幾個功能可以從設定中播放重量的隨機聲音。 抓取利用 。抓取的助手功能。