Есть ли способ заполнить поле объекта сценария дочерним классом?C#

Место общения программистов C#
Ответить
Anonymous
 Есть ли способ заполнить поле объекта сценария дочерним классом?

Сообщение Anonymous »

Я создаю проект, похожий на космических захватчиков, и хочу иметь возможность назначать схемы движения всем врагам, пулям и т. д. в виде сценариев.
Для этого У меня есть базовый класс MovementPattern, который выглядит следующим образом

Код: Выделить всё

    [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;
}
}
Класс motionPatternData содержит не так уж много, планируется создать дочерние классы, которые будут содержать данные об их шаблоне движения, например:

Код: Выделить всё

    [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;
}
На данный момент я сделал что-то, что мне показалось довольно уродливым: я написал SinusMovementPattern следующим образом:

Код: Выделить всё

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

public override void SetMovementPatternData(SinusMovementPatternData newMovementPatternData)
{
base.SetMovementPatternData(newMovementPatternData);
sinusMovementPatternData = newMovementPatternData;
}
}

Таким образом, функционально SinusMovementPattern имеет оба типа данных, я просто игнорирую MovementPatternData по умолчанию...
В инспекторе они выглядят следующим образом:
p>
MovementPattern в инспекторе
SinusMovementPattern в инспекторе
Я думаю, смогу ли я инициализировать свои классы данных они будут отображаться в инспекторе вместо пустых полей. Однако когда я пытаюсь инициализировать их, например, с помощью:

Код: Выделить всё

public SinusMovementPatternData sinusMovementPatternData = ScriptableObject.CreateInstance();
Я получаю сообщение об ошибке, в котором говорится, что я должен инициализировать их в функциях запуска или пробуждения, однако я бы хотел, чтобы этот класс данных был инициализирован и изменен в редакторе, прежде чем нажимать «Воспроизвести». ..
Моя проблема связана с объектами MovementPatternData, я бы хотел, чтобы дочерние элементы MovementPattern заполняли свое собственное поле MovementPatternData при их создании, и Мне нужен тип этих данных объект для «замены» исходного типа MovementPatternData, чтобы иметь дочерний тип, соответствующий текущему шаблону движения... Например, если я добавляю sinusMovementPattern к объекту, он должен иметь свой собственный SinusMovementPatternData, который «заменяет» исходный MovementPatternData.
Из предыдущих исследований я понял, что мне следует где-нибудь использовать собственный редактор, объекты с поддержкой сценариев и [SerializeReference], мне бы очень хотелось дополнительные рекомендации по этому поводу!
Заранее спасибо за ваше время :)

Подробнее здесь: https://stackoverflow.com/questions/793 ... hild-class
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»