Я пытаюсь создать компонент для 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
с соответствующий компонент прилагается)?