Jump to content
Unity Insider Forum

Enum mit Wertzuweisung


Kojote

Recommended Posts

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

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

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

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

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

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

Archiviert

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

×
×
  • Neu erstellen...