Могу ли я использовать абстрактный базовый класс в качестве элемента редактора Unity? - PullRequest
0 голосов
/ 27 июня 2018

Я пытаюсь создать компонент для Unity GameObject, назовем его MediaController. Я хочу, чтобы он мог управлять синхронизацией (воспроизведение / пауза / и т. Д.) Для разных носителей (аудио / видео). Я создал абстрактный класс PlayableMedia с основными свойствами / полями / методами и создал 2 класса PlayableVideo и PlayableAudio, которые наследуют и реализуют в соответствии с нашими потребностями.

Намерение состояло в том, чтобы иметь единый список PlayableMedia, который мог бы быть независимым от аудио / видео, позволяя легко (т.е.) media.Play() вызывать независимо от типа в определенное время приложения ... но мое поле public List<PlayableMedia> MediaList; не появляется в редакторе и нет ошибки.

Итак, в конечном счете, мой вопрос таков: заголовок гласит: возможно ли использовать класс PlayableMedia в качестве типа поля?

Я подозреваю "нет", основываясь на моем опыте с этим, но я нашел ссылки, которые говорят "да" или "да, вроде", которые, кажется, указывают на пользовательских редакторов / инспекторов / ящиков , но у меня 0 с этим опытом, и я не смог его реализовать (см. Ниже).

[System.Serializable]
public class RegisteredMedia
{
    public float StartTime;
    public PlayableMedia Media;
}

[CustomPropertyDrawer(typeof(RegisteredMedia))]
class RegisteredMediaDrawer : PropertyDrawer
{
    public override void OnGUI(Rect position, SerializedProperty property, GUIContent label)
    {
        EditorGUI.BeginProperty(position, label, property);

        position = EditorGUI.PrefixLabel(position, GUIUtility.GetControlID(FocusType.Passive), new GUIContent("Playable Media"));

        var indent = EditorGUI.indentLevel;
        EditorGUI.indentLevel = 0;

        Rect rectStartTime = new Rect(position.x, position.y, 30, position.height);
        Rect rectMedia = new Rect(position.x + 35, position.y, 50, position.height);

        EditorGUI.PropertyField(rectStartTime, property.FindPropertyRelative("StartTime"), GUIContent.none);
        EditorGUI.PropertyField(rectMedia, property.FindPropertyRelative("Media"), GUIContent.none);

        EditorGUI.indentLevel = indent;

        EditorGUI.EndProperty();
    }
}

public class MediaController : MonoBehaviour
{
    public List<RegisteredMedia> MediaList = new List<RegisteredMedia>();

    \\[...] rest of implementation
}

Кто-нибудь может мне помочь? Или подтвердите, что это невозможно, или помогите мне с реализацией, если она есть?

Кроме того, если это можно сделать с помощью пользовательских редакторов / инспекторов / выдвижных ящиков, может ли кто-нибудь помочь мне получить один элемент в List<RegisteredMedia> для отображения как Start Time ____ Playable Media [=====] (где PlayableMedia будет GameObject с соответствующий компонент прилагается)?

1 Ответ

0 голосов
/ 28 июня 2018

Будьте осторожны при использовании слова «собственность». В C # это означает нечто очень специфическое .

возможно ли использовать класс PlayableMedia в качестве типа свойства?

Я думаю, что вы задаете неправильный вопрос здесь. Вместо того, чтобы придумывать новую реализацию, подумайте, почему ваша текущая реализация может не работать?

Сначала приведу следующий пример:

public abstract class Car : MonoBehaviour { }

public class Jeep : Car { }

public class Ferrari : Car { }

public class CarHolder : MonoBehaviour
{
    public List<Car> Cars;
}

В этом примере я мог создать GameObject с компонентом CarHolder и мог присоединять объекты Jeep и Ferrari. Важно отметить, что каждый определенный мной класс monoBehavior находится в своем собственном файле, и имя файла совпадает с именем класса. Так работает Unity.

Итак, чтобы ответить на вопрос, который, я думаю, вы задаете (предполагая, что мы заменим «свойство» на «поле»), действительно возможно использовать абстрактные типы классов и отображать их в инспекторе. Я подозреваю, что вам нужно разделить ваши классы на отдельные файлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...