Gibt es eine Möglichkeit, ein skriptfähiges Objektfeld mit einer untergeordneten Klasse zu füllen?C#

Ein Treffpunkt für C#-Programmierer
Guest
 Gibt es eine Möglichkeit, ein skriptfähiges Objektfeld mit einer untergeordneten Klasse zu füllen?

Post by Guest »

Ich mache ein Space Invaders-ähnliches Projekt und möchte in der Lage sein, allen Feinden, Kugeln usw. Bewegungsmuster in Form von Skripten zuzuweisen.
Um das zu tun Ich habe eine Basisklasse MovementPattern, die so aussieht

Code: Select all

[RequireComponent(typeof(Rigidbody2D))]
public class MovementPattern : MonoBehaviour
{
protected Rigidbody2D rb;

protected MovementPatternData movementPatternData;

protected virtual void Awake()
{
rb = GetComponent();
}

public virtual void SetMovementPatternData(MovementPatternData newMovementPatternData)
{
movementPatternData = newMovementPatternData;
}

public virtual MovementPatternData GetMovementPatternData()
{
return movementPatternData;
}
}
Die BewegungPatternData-Klasse enthält nicht viel. Es ist geplant, davon untergeordnete Klassen zu haben, die Daten über ihr Bewegungsmuster enthalten, zum Beispiel:

Code: Select all

[Serializable]
public class MovementPatternData : ScriptableObject
{
}

[Serializable]
public class SinusMovementPatternData : MovementPatternData
{
[SerializeField]
public float amplitude = 1f;
[SerializeField]
public float frequency = 1f;
[SerializeField]
public Vector2 direction = 1f;
}
Im Moment habe ich etwas getan, das ich ziemlich hässlich finde, ich habe das SinusMovementPattern so geschrieben:

Code: Select all

public class SinusMovementPattern : MovementPattern
{
[SerializeField]
public SinusMovementPatternData sinusMovementPatternData;

public override void SetMovementPatternData(SinusMovementPatternData newMovementPatternData)
{
base.SetMovementPatternData(newMovementPatternData);
sinusMovementPatternData = newMovementPatternData;
}
}
Funktionell hat das SinusMovementPattern also beide Datentypen, ich ignoriere einfach die Standard-MovementPatternData.
Sie sehen so aus Dies im Inspektor:
Image

Image

Ich vermute, wenn Ich kann meine Datenklassen initialisieren, sie werden im Inspektor anstelle der leeren Felder angezeigt. Wenn ich jedoch versuche, sie zum Beispiel mit zu initialisieren:

Code: Select all

public SinusMovementPatternData sinusMovementPatternData = ScriptableObject.CreateInstance();
Ich erhalte eine Fehlermeldung, die besagt, dass ich sie in Start- oder Wake-Funktionen initialisieren soll. Ich möchte jedoch, dass diese Datenklasse im Editor initialisiert und geändert werden kann, bevor ich auf „Play“ drücke.
Mein Problem hängt mit den MovementPatternData-Objekten zusammen. Ich möchte, dass die untergeordneten Elemente von MovementPattern ihr eigenes MovementPatternData-Feld ausfüllen, wenn sie erstellt werden , und ich möchte den Typ dieser Daten Objekt, um den ursprünglichen Typ MovementPatternData zu „ersetzen“, um den untergeordneten Typ zu erhalten, der dem aktuellen Bewegungsmuster entspricht ... Wenn ich beispielsweise einem Objekt ein sinusMovementPattern hinzufüge, sollte es über ein eigenes SinusMovementPatternData, der die ursprünglichen MovementPatternData „ersetzt“.
Ich verstehe aus früheren Recherchen, dass ich einen benutzerdefinierten Editor, skriptfähige Objekte usw. verwenden sollte [SerializeReference] irgendwo, ich würde mich über zusätzliche Anleitung dazu freuen!

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post