2017-06-05 3 views
0

Ich habe Unity ausprobiert, bisher habe ich viel Zeit damit verbracht, eine Charakterklasse mit Statistiken und Leistungen zu erstellen, wie in Dungeons and Dragons, bisher arbeiten sie alle naja, aber jetzt kommt es mir auf den wunsch, gang für einen solchen charakter zu schaffen.Unity 5.6 und Erstellen von Objekten mit C# -Klassen

Ich habe gesehen, dass Sie Objekte aus dem Prefab-Abschnitt erstellen und dann Skript-Snippets hinzufügen können, um ihr Verhalten oder sogar ihr Aussehen zu ändern, aber es fühlt sich seltsam an, wenn ich Klassen von Grund auf neu zu erstellen bin bestehende Klasse, von der ich kaum weiß, wie sie funktioniert.

So könnte ich einfach in den Skriptordner gehen und ein neues C# -Skript mit allen Werten erstellen, die im Allgemeinen verwendet werden, zum Beispiel haben alle Rüstungen eine Rüstungsklasse und Gewicht, also könnte ich einen General machen Klasse, die Item dann erbt seine Eigenschaften Armor, Weapons und Consumables, und jeder von ihnen in spezifischere Objekte werden dann weiter spezialisiert kann nun die eigentliche Frage kommt genannt alle Eigenschaften eines Objekts hat:

Sollte es sein besser, um eine Klasse zu erstellen, die bestimmte Attribute enthält, zum Beispiel eine Klasse namens Eisenklinge, die von Waffen und von Gegenständen bis zum Spielobjekt erbt, oder sollte ich weitermachen Eine Klasse namens Waffe, die alle Werte und Namen in Listen oder Arrays enthält? Und dann ... wie instanziiere ich meine Skripte ohne die Notwendigkeit, ein Objekt im Spiel zu erstellen, das beim Löschen auch das Skript aus der Szene entfernt?

Sorry für so viele Informationen, aber ich bin nur ein bisschen überwältigt von all den Dingen, die Sie tun können und nicht mit Unity tun können.

Antwort

1

Unity ist für die Verwendung mit Komponentenarchitektur gedacht, nicht für objektorientiertes Design. Das bedeutet, dass Sie meist GameObjects in der Szene erstellen und dann Skripts an sie anhängen, um Verhalten oder Daten hinzuzufügen.

Daten können auch in ScriptableObject-Instanzen im Projekt oder in einem anderen Asset wie einer Textdatei oder Textur gespeichert werden.

Da es in Unity keine Hauptfunktion oder einen bestimmten Programmstart gibt, müssen Sie in Ihrer ersten Szene ein Root-Manager-GameObject auswählen, das ein MonoBehaviour-Skript und einen der Unity-Callbacks hat, die am Anfang ausgelöst werden (zB Wach oder Start). Dieses Skript kann jetzt wie Ihre Hauptfunktion in einer normalen App funktionieren.

Wenn Sie wirklich wollen, können Sie Ihr gesamtes Spiel von hier aus mit "normalen" C# -Klassen aufbauen. Sie beginnen alle mit diesem MonoBehaviour, aber ansonsten könntest du alles "von oben nach unten" schreiben. Beispiel: Instanziieren Sie eine Game-Klasse, die dann eine Textdatei lädt und GameObjects instanziiert, um alle ihre Komponenten zu assemblieren, bis die visuelle Darstellung abgeschlossen ist. Auf diese Weise würden Sie jedoch nicht alle Funktionen von Unity nutzen.

Der Unity-Weg wäre, einzelne GameObjects aus Komponenten aufzubauen, die meist unabhängig voneinander funktionieren. Ein menschlicher Spieler-Avatar könnte aus PlayerInput, Renderer, WeaponBehaviour, HealthComponent usw. bestehen.

Niemand kann Ihnen sagen, welches Design am besten für Ihr Spiel ist, aber beide Richtungen sind möglich. Für den Anfang würde ich vorschlagen, eine abstrakte Weapon-Basisklasse MonoBehaviour zu erstellen und dann für jeden Typ eine Unterklasse zu erstellen und sie auf ein GameObject zu setzen. Dies kann Dinge wie den Zugriff auf andere Komponenten tun, Collider-Trigger-Nachrichten empfangen und Daten speichern.

Vielleicht erkennen Sie, dass alle Waffen eine ähnliche Sache machen. Dann könntest du ein Waffenverhalten haben, das wie ein Hub/Controller auf deinem Spieler GameObject funktioniert.Es enthält dann Verweise auf eine Datendatei, die Statistiken sowie Verweise auf das Modell, Materialien, Sound usw. enthält.

+0

* Nicht * das Folgen des "intended" -Musters von Unity kann zu Leistungsverbesserungen führen, da ein erheblicher Overhead beim Aufruf besteht 'Update()' auf Tausenden von MonoBehaviour-Skripten. Ein zentrales "Haupt" -Skript, das eine ähnliche Methode aufruft, funktioniert viel besser. Tatsächlich haben einige Spiele überhaupt keine anderen MonoBehaviour-Skripte! Ich neige dazu, ein Paar zu verwenden, damit ich von einer GameObject-Referenz auf eine System.Object-Referenz (von einem Typ T) auf einfache Art und Weise gehen kann. Aber dieselben Daten können auch in einem Dictionary gespeichert werden. – Draco18s

Verwandte Themen