Jump to content
Unity Insider Forum

Instanz eigener Klasse als Variable übergeben


Herbstmond

Recommended Posts

Hey,

bin noch ziemlich neu in Unity und versuche gerade für ein Uni-Projekt ein Spiel zu entwickeln. Ich hänge gerade an einer wahrscheinlich total einfachen Sache fest und blamiere mich mit der Frage, aber ich komme einfach nicht auf die Lösung.  Über Google werde ich nicht so recht fündig, oder weiß nicht ob ich den richtigen Ansatz habe und evtl einfach falsch suche.

Es soll eine Art Breeding Game mit mehr oder weniger realistischen Elementen werden.

Ich habe eine Klasse Kreaturen erstellt und eine Klasse Gene. Die sind ziemlich Standard mit Name, Bild, Bezeichnung, Geschlecht, Eltern, Konstruktor, Getter und Setter, und die Klasse Kreaturen hat natürlich Gene als Attribut.

Jetzt brauche ich natürlich noch die einzelnen Gene, damit diese benutzt werden können. Sprich Gen Wasser, Gen Luft, Gen Eisen... etc.

Hier bin ich mir jedoch nicht sicher, wo und wie ich die am besten erstelle damit ich sie im code verwenden kann, in einer createNewCreature() Funktion beispielsweise.

Ich habe aus der Gene-Klasse ein ScriptableObject gemacht und damit erst einmal eines angelegt, aber da steck ich gerade fest...

Ist wahrscheinlich wirklich total einfach, aber ich hab gerade gefühlt einen ganzen Baum vorm Kopf, sorry.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Also in dem ganzen Text sehe ich keinen einzigen Fragezeichen, aber wo du am besten Instanzen einer Klasse anlegst, liegt ganz an dir und keiner kann, dir ohne Einzelheiten zu kennen, weiter helfen.

Instanz eines ScriptableObjects, erstellt man so:

MyScriptableObject someInstance = ScriptableObject.CreateInstance("MyScriptableObject") as MyScriptableObject;
Link zu diesem Kommentar
Auf anderen Seiten teilen

Oh, sorry, du hast natürlich recht. Direkt als Frage habe ich gar nichts formuliert, war wohl auch etwas zu übereilt geschrieben.
Die eigentliche Frage ist: Wo und wie lege ich am besten eine Art Bibliothek/Sammlung von Objekten an, die zu Spielbeginn schon vorhanden ist?

ZB für eben die verschiendenen Gene, bzw. die Informationen darüber, oder sowas wie eine Sammlung von Quests, ein Kompendium, etc.

Ich hatte die Klasse Gene als ScriptableObject angelegt und über das AssetMenu einige Objekte davon erzeugt, die jetzt eben als Assets vorliegen aber ja noch irgendwo gesammelt werden müssen und auf die irgendwie zugegriffen werden muss.
Ich bin mir nicht sicher, ob das die beste/einfachste Vorgehensweise ist und ich fürchte, ich denke in eine komplett falsche Richtung und deswegen würde ich mich über ein paar Ansätze und Denkanstöße freuen welche Möglichkeiten sich da anbieten.

Mein erster Ansatz war, die verschiedenen Gene als Enums anzulegen, aber da ich zusätzliche Informationen zu jedem Gen haben möchte, scheint das keine gute Grundlage zu sein.

 

 

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 19 Stunden schrieb Herbstmond:

Oh, sorry, du hast natürlich recht. Direkt als Frage habe ich gar nichts formuliert, war wohl auch etwas zu übereilt geschrieben.
Die eigentliche Frage ist: Wo und wie lege ich am besten eine Art Bibliothek/Sammlung von Objekten an, die zu Spielbeginn schon vorhanden ist?

ZB für eben die verschiendenen Gene, bzw. die Informationen darüber, oder sowas wie eine Sammlung von Quests, ein Kompendium, etc.

Ich hatte die Klasse Gene als ScriptableObject angelegt und über das AssetMenu einige Objekte davon erzeugt, die jetzt eben als Assets vorliegen aber ja noch irgendwo gesammelt werden müssen und auf die irgendwie zugegriffen werden muss.
Ich bin mir nicht sicher, ob das die beste/einfachste Vorgehensweise ist und ich fürchte, ich denke in eine komplett falsche Richtung und deswegen würde ich mich über ein paar Ansätze und Denkanstöße freuen welche Möglichkeiten sich da anbieten.

Mein erster Ansatz war, die verschiedenen Gene als Enums anzulegen, aber da ich zusätzliche Informationen zu jedem Gen haben möchte, scheint das keine gute Grundlage zu sein.

 

 

 

Das Du die Gene als ScriptableObjects angelegt hast, liest sich erstmal logisch und gut. Nun könntest Du z.B. ein weiteres ScriptableObject erstellen "Gensammlung". Dieses hat dann ein Gen-Array, in welches du all deine Gen-ScriptableObjects ziehst. Und diese Sammlung, bzw. das SO kannst du dann einem GameObject im Inspector zuweisen.

//beispiel
public class Gensammlung : ScriptableObject
{
  public Gen[];
}

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Herbstmond Zunächst einmal würde ich deinem Scriptable Object ein Enum für die Typen hinzufügen. Dann prüfst du im Objekt, was Gebrauch von deinem Datencontainer machen will, von welchem Gentypen es ist. Sollte das Objekt dann also im Awake erfahren haben, von welchem Gentypen es ist, kannst du doch im Start direkt individuelle Logik für jeden Typen dazu schreiben. Alles was das Objekt vom Enum wissen will ist doch, von welchem Typen es ist, um dann seine seine eigene Identität definieren zu können. Hier ein Beispiel für dich:

ENUMS.jpg.ca88fd6665315c30f79f44c61a48f510.jpg


Ich habe es jetzt hier im Beispiel nicht verdeutlicht, aber du solltest auf jeden Fall Gebrauch von Switches machen, wenn du auf diese Art und Weise prüfst. Ich hoffe aber du verstehst, dass das Enum nicht so viele Informationen halten muss. Es genügt, den Grundtypen vorzugeben um dann alles andere davon abzuleiten.

Wie @devandart bereits erwähnt hat, könnte ein leeres GameObject eine Liste vom Typen deines Scriptable Objects halten. In dieser Liste speicherst du ganz einfach alle Objekte, die im Spiel existieren. Du kannst es so einrichten, dass sich das Objekt nicht zerstört, wenn du eine neue Szene lädst. Das gibt dir den Vorteil, dass du von überall und zu jedem Zeitpunkt Informationen aus dieser Liste entnehmen kannst, bzw. immer eine Referenz zur Liste findest, da das Objekt in jeder Szene existiert.

Grüße,
Maurice

Link zu diesem Kommentar
Auf anderen Seiten teilen

Das ist echt kein guter Programmierstil. Wenn du ein Objekt hast und je nach Typ oder Instanz unterschiedliche Dinge tun willst, dann packe die Unterschiedlichen Dinge in die Objekte.

In diesem Fall kommt einfach der Schadenstyp in das Gen-ScriptableObject.

Die Idee mit der Liste, in der alle Dinge stehen ist auch brandgefährlich, weil es dazu verleitet, Dinge aus der Liste zu nehmen anstatt eine direkte Referenz auf das Objekt von Interesse zu nutzen.

Link zu diesem Kommentar
Auf anderen Seiten teilen

@Sascha Klar, man kann die Informationen auch direkt ins Scriptable Object integrieren und dann mit Referenz dazu Verknüpfungen machen. Im Grunde läuft es ja auf das gleiche Resultat hinaus, oder nicht? Ob das Objekt nun die Informationen aus Quelle A, oder Quelle B erhält spielt doch keine direkte Rolle? Ich selbst trenne bestimmte Sachen gerne voneinander - aber das ist wohl einfach meine eigene, chaotische Art und Weise. Bisher hat immer alles bestens funktioniert. Zum anderen Punkt möchte ich sagen, dass ich niemals die Liste als Referenz für andere Aufgaben nehmen würde. Ich würde die Liste lediglich in einer Art Preload-Szene als einmalige Referenz nutzen, um Informationen ins Spiel zu laden. Alles weitere passiert unabhängig zu dieser Liste, indem sich Objekte ganz normal Referenzen zueinander holen. Meistens leite ich von Liste zu Liste weiter.  

Link zu diesem Kommentar
Auf anderen Seiten teilen

vor 1 Stunde schrieb Maurice94:

Im Grunde läuft es ja auf das gleiche Resultat hinaus, oder nicht?

Wenn man nur betrachtet, ob der Code am Ende funktioniert, dann ja. Aber Code-Qualität geht weit über "funktioniert" und "funktioniert nicht" hinaus. Code wie dieser ist schlecht wartbar, unmodular, nicht robust und damit eine potentielle Fehlerquelle und Auslöser für unnötige zusätzliche Arbeitsschritte wann immer am Code gearbeitet wird.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Danke für die Antworten und sorry für die späte Antwort.

Ich habe beim letzten Aufeinandertreffen mit meinem Dozenten über das, was ich bisher hatte, gesprochen und er hat alles über den Haufen geworfen 😅, bzw haben wir einen anderen Ansatz für das Ganze ausgearbeitet, von dem ich zuerst dachte ich würde zu weit ausholen. Schien aber doch im Endeffekt besser zu sein. Ich bin wohl noch zu sehr gewohnt, alles über Scripte lösen zu wollen anstatt zu nutzen was der Inspector bietet. 

Jedenfalls habe ich jetzt die Gene (Wasser, Erde, Luft, Stein, Pflanze, etc) als Scriptable Objects angelegt  und mit einer Liste versehen, die die Elemente enthält, aus denen sie bestehen(Sauerstoff, Wasserstoff, etc.). Die Elemente selbst sind auch Scriptable Objects und diese können jetzt die Zusatzinformationen enthalten, die ich oben erwähnt hatte.

Die Kombination der verschiedenen Elemente (mit Chancen auf Weitervererbung, Mutation und solchen Spielchen) bestimmt dann, welches Gen weiter vererbt wird.

 

Ich hatte es so verstanden, dass die Liste nötig ist, um auf die ScriptableObjects, die man angelegt hat, überhaupt zugreifen zu können, wenn man sie im Code braucht.

Das war mein usprüngliches Problem: Ich hatte ein Gen angelegt von dem ich wollte, dass das bestimmte Kreaturen als Voreinstellung hatten, wusste aber nicht wie ich das direkt anspreche.

Mein Dozent hatte mir das gezeigt, aber er hat mir so schnell so viele Dinge erzählt dass ich es nicht mehr genau weiß, wie er das gemacht hatte.

 

Irgendeine Art der Sammlung werde ich wohl  brauchen, da ich gerne so etwas wie eine Ingame Bibliothek hätte, wo der Spieler die Informationen über die verschiedenen Gene/Elemente nachlesen kann.

Und zb für solche Dinge wie Quests.

 

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.

×
×
  • Neu erstellen...