Diese Anleitung erklärt, wie die benutzerdefinierten UseObjects verwendet werden, die der Modding-API in SE 1.199 hinzugefügt wurden.
Einleitung
Seit der SE-Version 1.199 hat Keen der Modding-API die Möglichkeit hinzugefügt, benutzerdefinierte UseObjects zu erstellen. Ein UseObject ist ein interaktiver Punkt auf einem Block, wie z. B. ein Terminalzugriff oder eine Schaltfläche auf einem Schaltflächenfeld.
Wenn Sie schon einmal einen Block-Mod erstellt haben, haben Sie wahrscheinlich einen Interaktionspunkt erstellt. Dies sind leere (Dummys) mit Namen wie detektor_terminal_1.
Diese Anleitung zeigt Ihnen, wie Sie Ihre eigenen Interaktionsdummies erstellen, mit denen Sie jedes gewünschte Verhalten auslösen können, das mit der ModAPI möglich ist.
Modellvorbereitung
Der Modellaufbau ähnelt jedem anderen Interaktionsdummy, den Sie für normale Blöcke erstellen würden.
Der einzige Unterschied ist der Name des Leerzeichens/Dummys.
- Erstellen (oder ändern) Sie ein Modell
- Fügen Sie ein neues Leerzeichen hinzu, indem Sie dem gleichen Verfahren wie bei der Herstellung von Dummys folgen
- Benennen Sie das Leerzeichen gemäß der unten beschriebenen Syntax.
Der Name eines Interaktionsdummys wird in 3 oder mehr Teile zerlegt: Marker, Typ, Subtyp, Sequenznummer (Seq-Nr); in diesem Format: marker_type_subtype_sequencenumber.
Zwei Teile müssen konkret benannt werden: der Marker und die Sequenznummer.
Für die Zwecke dieses Leitfadens ist der Marker der Detektor und seq no ist eine ganze Zahl, beginnend bei 1.
UseObject-Code-Implementierung
Sobald das Modell eingerichtet ist, erfolgt die eigentliche Interaktionsimplementierung über ein C#-Skript.
// UseObject mit dem Typ "DHD" initialisieren // Dies muss mit dem zweiten Element des leeren/Dummy-Namens übereinstimmen, es wird jedoch nicht zwischen Groß- und Kleinschreibung unterschieden. [MyUseObject("DHD")] öffentliche Klasse DHDUseObject: MyUseObjectBase { IMyGps m_s selectedButton; IMyTerminalBlock m_dhd; public DHDUseObject(IMyEntity owner, string dummyName, IMyModelDummy dummyData, uint key) : base(owner, dummyData) { // Speichere eine Referenz auf den übergeordneten Block, damit wir die Aktion später auf dem richtigen Block ausführen können. m_dhd = Eigentümer als IMyTerminalBlock; } // Dies ist die primäre Aktion, z. B. das Drücken einer Taste. öffentliche Überschreibung UseActionEnum PrimaryAction => UseActionEnum.Manipulate; // Dies ist die sekundäre Aktion, z. B. das Drücken von K, um das Aktionszuweisungsmenü einer Schaltfläche zu öffnen. Dies ist optional. öffentliche Überschreibung UseActionEnum SecondaryAction => UseActionEnum.OpenTerminal; // Dies teilt dem Spiel mit, welche Aktionen Sie unterstützen möchten. In diesem Fall wird nur die Primärseite verwendet. // Sie können mehrere Aktionen angeben, indem Sie sie mit einem bitweisen OR-Operator // kombinieren, z. B. PrimaryAction | SecondaryAction öffentliche Überschreibung UseActionEnum SupportedActions => PrimaryAction; // Dies wird aufgerufen, wenn der Spieler auf den Interaktionsdummy zielt. public override MyActionDescription GetActionInfo(UseActionEnum actionEnum) { // Dieses Beispiel kümmert sich nicht um den Untertyp ("Schaltfläche" im leeren Namen des Modells), // Sie können dieses Feld jedoch verwenden, wenn es gesetzt ist, um ein Skript mit mehreren Dummys zu teilen Aktionen. // Zum Beispiel könnte Detector_mypower_on_1 verwendet werden, um einen Block einzuschalten, und // Detector_mypower_off_1 könnte verwendet werden, um einen Block auszuschalten. Sie könnten sogar einen // dritten haben, Detector_mypower_toggle_1, der den Blockstatus umschaltet. // Sie können das Subtype-Feld greifen, indem Sie den Dummy-Namen auf '_' teilen und das dritte Element (Index 2) greifen. switch (actionEnum) { case UseActionEnum.Manipulate: if (m_s selectedButton == null) { // Erhalte die Sequenznummer des Dummys (Leerzeichen hinzugefügt, um Steam-Kennzeichnung als URL zu vermeiden) var button = int.Parse( this.Dummy .Name. Substring( this.Dummy .Name.LastIndexOf('_') + 1 ) ) - 1; var button_text = "Button" + button.ToString(); // Dies erstellt eine HUD-Markierung für den Interaktionsdummy, wie Schaltflächenfelder. Dies ist optional. m_s selectedButton = MyAPIGateway.Session.GPS.Create(button_text, "DHD Symbol", ActivationMatrix.Translation, true); MyAPIGateway.Session.GPS.AddLocalGps(m_s selectedButton); } Else {m_selectedButton.Coords = ActivationMatrix.Translation; } // Dieser Abschnitt enthält den HUD-Hilfetext, wenn der Spieler auf die Interaktion mit aktivierten Steuerungshinweisen abzielt. // Beachten Sie, dass die Beschriftung der Spielsteuerungstaste um [] gewickelt ist, wodurch sie in der Benachrichtigung gelb wird. var hint = "Drücken Sie {0}, um das Symbol auf {1} zu aktivieren"; return new MyActionDescription() { Text = MyStringId.GetOrCompute(hint), FormatParams = new[] { "[" + MyAPIGateway.Input.GetGameControl(MyControlsSpace.USE) + "]", m_dhd?.DisplayNameText }, IsTextControlHint = true, }; case UseActionEnum.OpenTerminal: return new MyActionDescription() { Text = MySpaceTexts.NotificationHintPressToOpenControlPanel, FormatParams = new [] { "[" + MyAPIGateway.Input.GetGameControl(MyControlsSpace.TERMINAL) + "]", m_dhd?.DefinitionDisplayNameText }, IsTextControlHint = wahr, }; default: return default(MyActionDescription); } } // Dies wird aufgerufen, wenn der Spieler nicht mehr auf den Interaktionsdummy zielt. public override void OnSelectionLost() { // Entfernen Sie die HUD-Markierung if(m_s selectedButton != null) MyAPIGateway.Session.GPS.RemoveLocalGps(m_s selectedButton); m_ausgewählterButton = null; } // Dies wird aufgerufen, wenn der Spieler mit dem Objekt interagiert (drückt die zugewiesene Tastenkombination). public override void Use(UseActionEnum actionEnum, IMyEntity user) { switch (actionEnum) { case UseActionEnum.Manipulate: try { var button = int.Parse( this.Dummy .Name.Substring( this.Dummy .Name.LastIndexOf('_' ) + 1 ) ) - 1; // Platzieren Sie hier den gewünschten Code, um die gewünschte Aktion auszuführen. // Dieses Beispiel schaltet die Ein-/Aus-Aktion des Blocks um; Beachten Sie, dass dieses Beispiel einen MyFunctionalBlock erfordert, // aber Sie können einen normalen MyTerminalBlock verwenden, je nachdem, was Sie tun möchten. m_dhd.Enabled = !m_dhd.Enabled } catch(Exception) { /* Vermeiden Sie einen Absturz des Spiels, aber Sie sollten eine Nachricht ins Log schreiben */ } break; case UseActionEnum.OpenTerminal: // Es gibt noch keine Möglichkeit, das Terminal zu öffnen.
Testen
Sobald Sie das Modell und den Code eingerichtet haben, können Sie es wie jeden anderen Mod in das Spiel laden. Die Schritte zum Erstellen eines Mods liegen im Allgemeinen außerhalb des Rahmens dieser Anleitung.
Nachdem Sie es geladen haben, können Sie den Dummy anzeigen, indem Sie das Debug-Zeichnen im ModAPI-Debug-Menü (Umschalt-F11) aktivieren. Zielen Sie, und Sie sollten Ihren Hilfetext sehen, wenn Sie Steuerhinweise in den Spieloptionen aktiviert haben. Drücken Sie Ihre zugewiesene Tastenkombination darauf und beobachten Sie, wie es die gewünschte Aktion ausführt!
Das ist alles, was wir heute dafür teilen Space Engineers führen. Dieses Handbuch wurde ursprünglich erstellt und geschrieben von Gwindalmir. Falls wir dieses Handbuch nicht aktualisieren, finden Sie das neueste Update, indem Sie diesen folgen Link.