MVC in Einheit mit skriptfähigen Objekten. Teil 1

MVC (Model-View-Controller) ist ein Schema, bei dem Anwendungsdaten, Benutzeroberfläche und Steuerlogik in drei separate Komponenten unterteilt werden, sodass jede von ihnen unabhängig geändert werden kann. Der Entwickler Cem Ugur Karacam berichtete über seine Programmiererfahrung bei Unity und sprach kurz über skriptfähige Objekte. Wir präsentieren eine Übersetzung seines auf dev.to veröffentlichten Artikels.



Willkommen zum ersten Teil meines Vortrags über die Implementierung von MVC in Unity mithilfe von skriptfähigen Objekten. In diesem Artikel habe ich nur über die Grundlagen der Arbeit mit skriptfähigen Objekten geschrieben, und im Allgemeinen wird der Text einfach und klar sein.

Finden Sie zunächst heraus, was Unity-Entwickler zu skriptfähigen Objekten sagen:

  • Dies ist eine Klasse, von der geerbt werden kann, um ein Objekt zu erstellen, das nicht an ein anderes Objekt in der Szene angehängt werden soll.
  • Der größte Vorteil eines solchen erstellten Objekts besteht darin, dass Sie es nur zum Speichern von Daten verwenden.

Nun ist es logisch zu fragen: Warum skriptfähige Objekte?

Skriptfähige Objekte sind Teil der Funktionalität der Unity-Engine, daher verfügen solche Objekte über zahlreiche integrierte Funktionen für die Arbeit mit dem Editor.

Mir gefällt der Ansatz bei der Entwicklung von Unity-Projekten. Sie können Ihre eigenen Tools erstellen und die standardmäßig installierten Tools einfach anpassen. Skriptfähige Objekte erweitern Ihre Fähigkeiten erheblich, da Sie damit benutzerdefinierte Container für Daten erstellen und diese als Assets im Projekt speichern können.



Das obige Bild ist ein Beispiel für die Verwendung des skriptfähigen Objekts in Unity. Eine einzelne in einem Projekt erstellte .asset-Datei enthält möglicherweise Informationen, die für den Betrieb mehrerer Systeme erforderlich sind, und gewährleistet die Beibehaltung ihrer Einstellungen. Wenn Sie mehr wissen möchten, gibt es auf YouTube ein hervorragendes Video mit einer Präsentation zu SO (Scriptable Object) mit dem Titel " Sturz der MonoBehaviour-Tyrannei in einer glorreichen Scriptable Object-Revolution ".



Ein weiteres gutes Beispiel ist oben gezeigt. Hier verweisen Spielobjekte auf ein Inventarobjekt, und das Speichersystem verwaltet sie alle. Dieses Bild stammt aus einer anderen ausgezeichneten Vorlesung, „Spielarchitektur mit skriptfähigen Objekten“ ( Spielarchitektur mit skriptfähigen Objekten ). Ich empfehle dringend, es zu lesen.

Ein weiteres großartiges Feature ist, dass Sie beim Herausfinden skriptfähiger Objekte wahrscheinlich keine anderen Datenspeicherformate wie JSON oder XML verwenden möchten, da SO das bequemste Format zum Speichern von Daten in Unity ist.

Schauen wir uns nun skriptfähige Objekte in Aktion an.

using UnityEngine; public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; } public enum ItemType { Dagger, Axe, Sword, Staff } 

Wir haben eine Klasse namens ItemData und verschiedene Eigenschaften geschrieben, die typisch für RPG-Spiele sind. Als Nächstes erstellen wir mehrere solche Elemente im Projekt, greifen über das Skript darauf zu und zeigen die Werte in der Konsole an. Aber zuerst fügen Sie unserem Code eine wichtige Zeile hinzu.

 using UnityEngine; [CreateAssetMenu] public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; } public enum ItemType { Dagger, Axe, Sword, Staff } 

Das CreateAssetMenu Attribut, das wir vor der ItemData Klasse hinzugefügt ItemData , gibt Unity an, dass wir .asset-Dateien erstellen möchten, in denen unsere Klasse über das Menü gespeichert wird. Andernfalls können wir dies nicht mit der rechten Maustaste oder der Schaltfläche Erstellen im Projektordner ausführen.





Erstellen Sie einen Ordner mit dem Namen Items und versuchen Sie, ein ItemData Objekt in diesem Ordner zu erstellen.



Jetzt schreiben wir ein weiteres Skript namens Inventory , um mit der Inventory zu arbeiten.

 using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; } 

Fügen Sie eine Methode hinzu, die Informationen an die Konsole ausgibt. Wir führen auch eine Überprüfung durch, um nicht über die Grenzen des Arrays hinauszugehen, sondern das Array in einem Kreis zu umgehen.

 using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; public void NextItemInfo() { if (index > inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } index ++; } } 

Ich werde unserer Methode einen Aufruf an die Leertaste zuweisen. In Unity ist dies sehr einfach. Dank der Input Klasse können wir in der Update Methode prüfen, ob die gewünschte Taste gedrückt wurde.

 using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { NextItemInfo(); } } public void NextItemInfo() { if (index > inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } index ++; } } 

Es ist Zeit, zum Unity-Editor zurückzukehren. Wir ItemData unser inventory Array mit zuvor erstellten ItemData Dateien aus dem Items Ordner. Erstellen Sie jedoch zunächst ein leeres Objekt in der Szene und fügen Sie unser Inventory .



Führen Sie nun das Projekt aus und testen Sie es.



Es funktioniert Und jetzt möchte ich Ihnen zeigen, dass das Scriptable Object nicht nur Daten, sondern auch Methoden für die Arbeit mit ihnen speichern kann. ItemData wir beispielsweise eine Methode hinzu, um den Preis in der ItemData Klasse zu berechnen. Weitere Informationen hierzu finden Sie in den Dokumenten hier und hier .

 using UnityEngine; [CreateAssetMenu] public class ItemData : ScriptableObject { public string itemName; public ItemType type; public float attack; public float GetPrice() { return attack * 40; } } 

Dann verwenden wir unsere neue Methode in der Inventory Klasse.

 using UnityEngine; public class Inventory : MonoBehaviour { public ItemData[] inventory; int index = 0; private void Update() { if (Input.GetKeyDown(KeyCode.Space)) { NextItemInfo(); } } public void NextItemInfo() { if (index == inventory.Length) { index = 0; } Debug.Log("Item name: " + inventory[index].name); Debug.Log ("Attack power: " + inventory[index].attack); switch(inventory[index].type) { case ItemType.Axe: Debug.Log("Item type: Axe"); break; case ItemType.Dagger: Debug.Log("Item type: Dagger"); break; case ItemType.Staff: Debug.Log("Item type: Staff"); break; case ItemType.Sword: Debug.Log("Item type: Sword"); break; } Debug.Log("Item price: " + inventory[index].GetPrice()); index ++; } } 

Jetzt werden wir alles reproduzieren und das Ergebnis betrachten.



Beispiele aus diesem Tutorial sind auf GitHub !

Der erste Teil der Geschichte ging zu Ende. Im nächsten Artikel werden wir über die Verwendung von MVC in Unity sprechen. Da wir jedoch bereits mit skriptfähigen Objekten vertraut sind, werden wir einige neue Funktionen hinzufügen, um sie kühler und härter zu gestalten, wie es die echten Unity-Gurus tun.

Source: https://habr.com/ru/post/de475562/


All Articles