Wir haben die folgenden Systeme verwendet, um sowohl die grundlegenden Spiel-Mechaniken als auch alle Ziele der Haupt-Design-Anforderungen zu unterstützen.
Manager verwenden
UseManager hat eine einfache API bereitgestellt, um ein gefangenes Objekt auf etwas anzuwenden, wie ein Stück mehrschichtiger Kleidung auf einem Mannequin. Die Hauptfunktion für diese API ist UseManager.AddUse (Tags, Z
Wir könnten das "Verwenden" mit UseManager.RemoveUse entfernen, was normalerweise hilfreich war, wenn eine Mission abgeschlossen war oder ein bestimmter Gegenstand "benutzt" wurde. Darüber hinaus konnten wir Ziele mit AddUseTargets und RemoveUseTargets hinzufügen oder entfernen.
Highlights
Wenn
Dieser LocalScript nutzt eine neue Engine-Funktion Highlight, die ein Umriss eines Objekts und/oder
HighlightItemsFunc wird verwendet, um mit anderen Client-Systemen zu kommunizieren. Zum Beispiel verwendet EventManager mit einem aktivieren-B
Wissen und Gedankenblasen
Lore and ThoughtBubbles are 2 similar systems. Lore uses a ScreenGui as an on-screen UI container with a child 0> Class
Lore wird in der LoreManger LocalScript implementiert. Wenn sie angeklickt oder berührt wird, wird ein Raycast mit einer Helper-Funktion utils.RaycastAlongPointingDir
Beachten Sie, dass wir Camera.ViewportPointToRay oder Camera.ScreenPointToRay verwenden, um den Ray zu erstellen, abhängig davon, ob er von einem nicht-Touch- oder Touch-gerufen wurde. Die Connectsind in etwas anderen Koordinatensystemen. Für die M
Gedankenblasen sind generell ähnlich, verwendet einen Raycast, um zu überprüfen, ob ein Mesh oder seine Eltern einen Gedankenblase-Tag haben. Es verwendet auch den ThoughtText-Attribut für Text und ein Gedankenblasen-Tag -Tag, um auf ein Platzhalteobjekt zu verweisen, das für die Positionierung der Benutzeroberfläche in der Welt verwendet wird. Gedankenblasen, die dieselben Positionsobjekte
Spezialfälle
Die Lore hat einige spezielle Fälle, von denen einer der beschädigten Siegel ist LoreManager behandelt auch einen besonderen Fall, in dem eine kleine Szene angezeigt wird, wenn auf deaktivierte Türen geklickt wird, die bis der Spieler den Siegel des Raums aufhebt, gesperrt sind.
Auf der Iteminder
Wir möchten verschiedene Icons in der Mitte des Bildschirms anzeigen, wenn der Spieler auf bestimmte Gegenstände von Interesse blickt. Das Client-Skript OnItemindicator macht einen Raycast entlang der Kamera Class.CFrame.LookVector und analysiert die Ergebnisse. Basierend auf den Ergebnissen setzt es ein Bild in der OnItemIndicator2 ScreenGui.
Wenn keine interessanten Elemente getroffen werden, ist das Standard-Symbol ein kleines Punkt. Wir könnten ein beliebiges Symbol durch Hinzufügen eines OnItemIndicator-Strributs zu einem bestimmten Mesh, verwendendo die Namen von onItemIndicatorImages, wie Hand, Auge oder DoorCurrentlyLocked. Das Attribut wird nur in seltenen Fällen benötigt und die meiste Zeit bieten andere T
Typen einige in einer Prioritätsordnung. Nach der OnItemIndicatorüberschreibenwir, ob es greifbar ist oder ein Drawer für das "Hand"-Symbol durch either utils.CanGrabModel(Modell) oder utils.GetTaggedObjectUpHierarchy("Drawer2", Modell)
highlightItemsFunc:Invoke({"GetType", curInst})
Die Lore und ThoughtBubble-Tags werden später durch das Überprüfen von Tags überprüft. Für die Türen haben wir 2 verschiedene Icons: DoorCurrentlyClosed und DoorAlwaysLocked . DoorManager setzt ein wahres oder falsches Attribut für Tü
TürManager
Der DoorManager LocalScript verwendet ein Tür -Tag und 1> Class.CollectionService1> , um die Öffnung und Schließung von Türen zu verwalten. Die Tür hat vorne und hinten Seitengriffe, die wir mit dem Berühren
Jede Tür hat ein einfaches Zustands-System, DoorState (geschlossen, geöffnet, geöffnet, geschlossen), mit Twins für Übergänge verwendet. Wir könnten die Fähigkeit eines Türs aktivieren oder deaktivieren, von externen Systemen zu öffnen oder zu schließen, indem wir DoorManager.EnableDoor aufrufen, was ein Attribut DoorEnabled festlegt.
MasterAnimator
Der MasterAnimator LocalScript spielt animierte Bilder (Texture-Atlas), die wir frü
Ein Objekt mit einem animierten SurfaceGui hätte einen Animator Class.ModuleScript</
Lokale Animationen
Die Lokalen Speicher-AnimationenLocalScript verwendet ein Lokalen Speicherradius-Tag, um die meisten "Kosmetik"-Objekte mit einer bestimmten Rotationsgeschwindigkeit und Verz
Scheinwerfer-Manager
Die HeadlampManagerLocalScript -Griff verwendet, wenn Benutzer die auf-Screen-ImageButton aus-/ ein-/schalten, um den Spotlight auf
SitzManager
Wir möchten nicht, dass Spieler automatisch sitzen, wenn sie in der Nähe eines Objekts sitzen können. Stattdessen möchten wir, dass
Ziehhändler
Das DrawerManager Skript verwendet ein Drawer2-Tag und CollectionService , um auf Ziehpunkte zu klicken, um sie zu öffnen oder zu schließen, und das Wiedergeben der entsprechenden Audiodateien. Die Öffnungs- und Schließaktion wird durch die Einstellung von TargetPosition für einen 2> Class.PrismaticConstraint2> ausgeführt.
TötenVolumes
In einigen Bereichen des Hauptspielbereichs, wie die elektrischen Sparken und Wasser in der Nähe des Starts der Straße, die zum Haus führt, kann ein Spieler seine Humanoid.Health auf 0 setzen, wenn er ein Volumen mit dem KillVolume
SpielerMissionRespawn
Das PlayerMissionRespawn Skript verwendet ein RespawnVolume -Tag und CollectionService , um mit Lautstärken umzugehen, die Spieler beim Respawnen berühren. Wir haben diese Lautstärken unter beschädigten Zimmer platziert, da
Wenn das Skript GameEvents.PlayerRespawn verarbeitet, kann es RespawnPositions verwenden, wenn die Missionskonfiguration es erlaubt. Wenn nicht, verwendet es TeleportPositions für die
Kleine Helfersysteme
PianoManager
Das PianoManager Skript verwendet ein Piano-Tag und CollectionService, um ein 2> Class.ClickDetector|ClickDetectors2> hinzuzufügen und einen der Piano-Sounds beim Klicken auf die Tastatur abzuspielen.
Ritualunterstützung
Die Lobby, in der Spieler Siegel platzieren, hat eine komplizierte Konstruktion, die Änderungen erleidet, wenn jedes Siegel in seinem definierten Ort platziert wird. Zum Beispiel, abhängig von der Anzahl der Siegel, die platziert werden, spielt spezifische Ereignisse, um Lichter und Strahlen zu
RestorableManager
Einige greifbare Objekte sind wichtig für das Gameplay, wie z. B. versiegelte Seiten, und wir wollten, dass sie nicht verloren gehen, wenn ein Spieler sie irgendwo fallen lässt. Wenn ein Objekt ein RestorableManager.StartTracking-Tag hat,
Portale
In einigen Missionen teleportieren wir Spieler eine kurze Strecke innerhalb einer Mission, wie z. B. Spieler respawnen, die von einer drehenden Plattform fallen. Um die Einrichtung dieses Arten von Teleportationen zu vereinfachen, die wir in ProcessPortal als "Portal" benennen, verwendet ein Helper-Funktion
P1.Touched:Connect(function(otherPart) utils.ProcessPortal(otherPart, P2) end)
ProcessPortal handle checkiert, dass andereTeil ein Mensch ist, teleportiert den Spieler durch einen CFrame-Koordinaten-Change und ruft ein kleines Cutscene auf, um die Transition mit einem Teleport_Jump-Ereignis in 0> 1> EventManager 1> zu verbergen.
Konfigurationsskripte
Wir haben mehrere Konfigurations-, Daten definieren- und gemeinsame Funktionsskripte: DemoConfig . Definitions von Missionen. Enumerationen für Spielzustände, Ereignisse für Client-Server-Kommunikationen. DemoGlobalSettings . Wir entwickeln in einem Ort, aber veröffentlichen (und Spiel testen) in anderen. Das Skript prüft PlatzID und aktiviert/deaktiviert verschiedene Cheats und Debugging-Funktionen. DemoTools . Viere verschiedene Utility-Funktionen. Behandeln von Transformationen. Einstellen von Sichtbarkeit, verankert oder anderen Eigenschaften. Prüfen Sie auf einen Punkt in einer Auswahlbox. Finden Sie Objekte in der Hierarchie durch den Namen "dotted". Verwalten Sie TempStorage (dies kann verwendet werden, um Modelle vorübergehend zu verschieben "irgendwo weit" und später wieder zu bring AudioUtilities . Ein paar Funktionen, umgewichtete zufällige Sounds aus einer festlegenzu spielen. GrabUtil . Hilfsfunktionen für das Greifen.