Kojote Geschrieben 7. Oktober 2019 Melden Share Geschrieben 7. Oktober 2019 Grüße! Ich bin immer noch an meinem Jagdspiel. Nun bin ich bei der Nahrung angekommen. Um es etwas einfacher zu machen, wollte ich jeder Nahrungsquelle ein kleines Script mit einem Enum verpassen. Zum Beispiel Enum-Value Zebra. Zebrafleisch, soll nun, wenn der Charakter es isst einen Wert von 30 haben. Gnu z.B. einen Wert von 20. Habt ihr eine Idee wie ich global die Lebensmitteldaten in das Enum bekomme, dass Enum 1 weiss, dass es den Wert 30 hat, Enum 2 den Wert 20 und so weiter? Grüße von Kojote Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
devandart Geschrieben 7. Oktober 2019 Melden Share Geschrieben 7. Oktober 2019 Du hast also EIN Enum mit den Werten Zebra, Gnu usw.? Dann so: enum AnimalType { Zebra = 30, Gnu = 20 } //... AnimalType animal = AnimalType.Zebra; int value = (int)animal; Aber abgesehen davon könntest Du auch ein ScriptableObject machen, welches z.B. eine Basisklasse Animal hat. Dann kannst Du Zebra, Gnu etc. davon ableiten und deine Objekte im Inspector auch weitergehend bearbeiten, sofern es nicht nur bei dem einen Wert bleibt. Dann hat dein Fleisch einfach einen ScriptableObject "Animal" Slot, wo Du dann das entsprechende SO aus den Assets reinziehst. Aber ich weiß ja nicht, wie komplex die Logik da wird. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 7. Oktober 2019 Autor Melden Share Geschrieben 7. Oktober 2019 Ja so hab ichs jetzt auch gelöst, wäre nur schön, wenn man es im Inspector nachbearbeiten könnte. Mit ScriptableObject komm ich noch nicht ganz zurecht. Die Werte sollen nur einmal festgelegt werden. Gut wäre zental im Inspector festlegen und alle anderen Scripts bekommen ein Update mit den neuen werten. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
devandart Geschrieben 7. Oktober 2019 Melden Share Geschrieben 7. Oktober 2019 vor 24 Minuten schrieb Kojote: Gut wäre zental im Inspector festlegen und alle anderen Scripts bekommen ein Update mit den neuen werten. Genau für sowas gibt es ScriptableObjects. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 7. Oktober 2019 Autor Melden Share Geschrieben 7. Oktober 2019 Ich ahne schon, ich muss mich die nächste Zeit mal intensiver mit ScriptableObject beschäftigen. Irgendwie komme ich nicht drum herum. 😀 Danke dir! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
devandart Geschrieben 7. Oktober 2019 Melden Share Geschrieben 7. Oktober 2019 Gerne. ScriptableObjects sind nicht so viel anders als z.B. eine Komponente. Du erstellst ein "Skript", sprich eine C# Klasse Darin erbst du von ScriptableObject Erstellst die Felder, die du brauchst Nun kannst du im Asset Explorer mit Rechtsklick über das Kontextmenü dein Objekt bzw. eine Instanz dessen erstellen und die Werte im Inspector editieren [CreateAssetMenu(menuName = "My Game Assets/Animal Data")] public class AnimalData : ScriptableObject { [SerializeField] private string animalName = "Animal Name"; [SerializeField] private int meatValue; } Nun kannst du über Rechtsklick - Create - My Game Assets - Animal Data eine Instanz erstellen und diese benennen (z.B. "Zebra"). Anschließend kannst du in jedem Skript ein Feld vom Typ AnimalData anlegen und das ScriptableObject über den Inspector in dem Slot zuweisen. public class Zebra : MonoBehaviour { [SerializeField] private AnimalData data; } Und immer, wenn du in dem einen ScriptableObject "Zebra" den Wert meatValue änderst, kriegen alle Objekte, die dieses zugewiesen haben, die neuen Werte. Ich hoffe, es ist verständlich. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 7. Oktober 2019 Autor Melden Share Geschrieben 7. Oktober 2019 OK klappt, probieren wirs mal aus. EDIT: Hehe, dass klappt super! Mit den anderen Tutorials bin ich bisher nicht zurecht gekommen, aber glaube jetzt machts klick. Müsste nur meatValue auf public ändern, dass ich den Wert auslesen kann, so klappt das Prima, vielen Dank! Spart mir echt nen rießen Berg Code mit if-else. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
devandart Geschrieben 7. Oktober 2019 Melden Share Geschrieben 7. Oktober 2019 Das war jetzt auch eher der saubere Weg. Mit einem public Feld geht das natürlich auch. Ich würde das ganze eher so machen, damit man von außen nicht ausversehen im Code den Wert verändert. Aber super, dass du damit zurechtkommst. [CreateAssetMenu(menuName = "My Game Assets/Animal Data")] public class AnimalData : ScriptableObject { [SerializeField] private string animalName = "Animal Name"; [SerializeField] private int meatValue; //öffentliches Property public int MeatValue { get { return meatValue; } } } Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Kojote Geschrieben 7. Oktober 2019 Autor Melden Share Geschrieben 7. Oktober 2019 Stimmt, dass ist natürlich noch besser! Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 7. Oktober 2019 Melden Share Geschrieben 7. Oktober 2019 Ich hab da mal ein kleines Attribut geschrieben, mit dem man die entstehenden Schönheitsfehler eines kleinen Tricks korrigieren kann, mit dem das kürzer aussieht: [field: SerializeField, UsePropertyName] public int number { get; private set; } Ist ein bisschen kürzer... Geschmackssache Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.