Jump to content
Unity Insider Forum

ScriptableObject frage !?


Cxyda

Recommended Posts

Moin ! Nach monaten auch mal wieder was von mir und (mal wieder) zu scriptable objects.

 

Ich muss sagen ich hab mich ziemlich in die dinger verguggt und quais meine komplette datenstruktur darauf ausgelegt. Hat alles super funktioniert aber nun sind erstmals probleme aufgetreten.

 

Und zwar habe ich VehicleData die von Scriptable objects erben sollen. ist alles auch kein problem .. ABER die Fahrzeuge können Waren transportieren, haben also einen Laderaum. Wenn ich nun in meinem spiel ein neues fahrzeug kaufe (im moment gibts nur ne handvoll verschiedene) Instanziere ich ein Prefab von dem GameObject und eine der GameObject componenten bekommt dann das ScriptAbleObject angehängt damit ich die ganzen Daten habe. Wenn nun aber eines der Fahrzeuge was in den Laderaum bekommt haben plötzlich alle anderen Fahrzeuge des selben typs die gleiche Ladung geladen, klar ist ja auch nur ne referenz auf das DatenObjekt ABER wie kann ich das ändern?

 

Entweder stehe ich auf dem schlauch oder ich bin einfach doof :D

 

 

Für tipps und Anregungen wäre ich dankbar!

 

Beste grüße, Cxyda

Link zu diesem Kommentar
Auf anderen Seiten teilen

moin, ja aber so wie mir das aussieht erzeugt mir das eine LEERE instanz des scriptable object mit den basiswerten und KEINE kopie meines ursprünglichen objektes ... zumindest nicht wenn ich das SO machen : ich kann ja auch nirgends das zu kopierende Objekt angeben ... oder ?

 

VehicleData vData = ScriptableObject.CreateInstance<VehicleData>();

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du das selbe SO für alle Fahrzeuge benutzt, ist klar, dass alle die gleiche Ladung haben, das hast du ja schon richtig geschrieben.

 

Normalerweise würde ich für ein ScriptableObject eine Factory Methode implementieren.

 

using UnityEngine;
public class MyScriptableObject : ScriptableObject
{
private string objectName;
private float damage;
private int id;

private MyScriptableObject() { }
public void Init(string objectName, float damage, int id)
{
	this.objectName = objectName;
	this.damage = damage;
	this.id = id;
}
public static MyScriptableObject CreateInstance(string name, float damage, int id)
{
	var data = ScriptableObject.CreateInstance<MyScriptableObject>();
	data.Init(name, damage, id);
	return data;
}
}

 

Das wird dann so aufgerufen:

 

var myObject = MyScriptableObject.CreateInstance("Name", 10, 1);

Wenn du dieses Objekt an deinen Wagen hängst, hast du jedes mal eine eigene Instanz.

Link zu diesem Kommentar
Auf anderen Seiten teilen

xD grade wollt ich schreiben das es leider NICHT klappt ... aber dann hatte ich doch noch den geistesblitz xD In meiner Init() funkion habe ich den Laderaum = dem laderaum aus dem prototypen gesetzt und nicht mit new nen neuen erzeugt -.-' naja zum glück hab ich meine fehler noch bemerkt bevor es hier peinlich geworden wäre :-P

 

Wie immer vielen dank für die qualitativ hochwertige hilfe ! :-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Bevor du alles umschreiben musst, kleiner Hinweis, den ich auch lange nicht wusste:

ScriptableObjects kann man als Asset nicht zur Laufzeit (im Build) speichern, sondern muss sich was anderes überlegen wie zB Serialization, oder XML-builder oder so :D

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja, zur Laufzeit speichert dir Unity doch sowieso nichts von alleine :)

 

Um noch was zur Frage bei zu tragen:

Wenn dein ScriptableObject praktisch bloß ein Halter für dein Objekt wäre, das selbst die ganzen Daten hält, könntest du das zur Laufzeit serialisieren und wieder deserialisieren um eine tiefe Kopie des Objektes zu erzeugen.

Vorteil ist hier, dass du im Code nicht nacharbeiten musst, wenn du neue Sachen einbaust, die du dann auch wieder über den Konstruktor initialisieren müsstest.

Nachteil ist (wenn man das so sehen will) dass dann alle Typen entweder mit System.Serializable markiert sein müssten (was man ja nicht immer unbedingt will) oder halt etwas zusätzliche Komplexität durch andere Serialisierungsverfahren.

Und es könnte zu leichten Problemen im Editor kommen, da Unity serialisiert + System.Serializable... hab ich aber noch nie ausprobiert.

 

Wobei das meiner persönlichen Meinung nach aber eine schickere Lösung ist :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

Naja, zur Laufzeit speichert dir Unity doch sowieso nichts von alleine :)

Asset mein Freund, das ist das Stichwort Herr Kollege. Ich dachte Unity schreibt mir mein Spiel ;)

 

System.Serializable ist kein Problem. Selbst schon benutzt.

 

Wo wir gerade dabei sind:

Kannst auch einfach Klassen schreiben, die weder von MonoBehavior noch von ScriptableObject erben, wenns nur um "DatenContainer" geht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wo wir gerade dabei sind:

Kannst auch einfach Klassen schreiben, die weder von MonoBehavior noch von ScriptableObject erben, wenns nur um "DatenContainer" geht.

Klar, so mach ich's auch immer ^^

Benutze solche "POCOs" auch recht gern um z.B. Manager zu erstellen, dann müssen die nicht extra instanziert werden und ich kann z.B. statische Konstruktoren nutzen, die sind ziemlich angenehm.

Finde ich allgemein in Unity an gewissen Stellen ziemlich cool

Link zu diesem Kommentar
Auf anderen Seiten teilen

Wenn du aus deinem ScriptableObject ein asset machst ist das doch auch nicht viel mehr als dein Objekt, dass dir Unity aber eben auf die Festplatte haut.

Im editor kannst du das SO in ein Asset speichern. Damals hatte ich vermutet, dass ich das auch im Build kann, darum geht's mir.

 

 

Klar, so mach ich's auch immer ^^

Benutze solche "POCOs" auch recht gern um z.B. Manager zu erstellen, dann müssen die nicht extra instanziert werden und ich kann z.B. statische Konstruktoren nutzen, die sind ziemlich angenehm.

Finde ich allgemein in Unity an gewissen Stellen ziemlich cool

Sehr schön! Dachte anfangs ich bin der einzige, ders macht.

Link zu diesem Kommentar
Auf anderen Seiten teilen

^^ Ja ne zur Laufzeit wollte ich eigentlich nichts speichern und ja .. NUR SOs ist auch nicht das ware, die statischen konstruktoren entdecke ich auch grade für mich^^ zumindest wo sie sinn machen ;) Nervt irgendwann bei ner neuen map an die 1 millionen manager scripte zu denken obwohl die igentlich nicht von Monobehavior erben müssten xD

Link zu diesem Kommentar
Auf anderen Seiten teilen

Archiviert

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

×
×
  • Neu erstellen...