我可以使用抽象基类作为Unity编辑器元素吗?

时间:2018-06-27 20:22:21

标签: c# unity3d unity-editor

我正在尝试为Unity GameObject创建一个组件,我们将其称为MediaController。我希望它能够管理不同媒体(音频/视频)的时间安排(播放/暂停/等)。我创建了一个具有基本属性/字段/方法的抽象类PlayableMedia,并创建了两个类PlayableVideoPlayableAudio,它们可以根据需要继承和实现。

目的是要有一个单独的PlayableMedia列表,该列表可能与音频/视频无关,无论在特定应用程序时间使用哪种类型,都可以轻松(即)media.Play()进行通话...但是我的领域public List<PlayableMedia> MediaList;没有出现在编辑器中,并且没有错误。

所以最终我的问题是标题所指出的:是否可以将PlayableMedia类用作字段的类型?

根据我对此的经验,我怀疑是“否”,但我发现似乎指向to custom editors/inspectors/drawers的链接为“是”或“是,有点”,但我有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 :(得分:2)

请小心使用“财产”一词。 In C# it means something very specific

  

是否可以将PlayableMedia类用作属性的类型?

我认为您在这里问错了问题。与其想出一个新的实现方式,不如为什么您当前的实现方式可能行不通?

首先,我将为您提供以下示例:

public abstract class Car : MonoBehaviour { }

public class Jeep : Car { }

public class Ferrari : Car { }

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

在此示例中,我可以使用CarHolder组件创建一个GameObject,并且能够同时附加Jeep和Ferrari对象。重要的是要注意,我定义的每个monoBehavior类都位于其自己的文件中,并且文件名与类名匹配。这就是Unity的工作方式。

因此,要回答我认为您要提出的问题(假设我们将“属性”替换为“字段”),则确实有可能使用抽象类类型并将其显示在检查器中。我怀疑您需要将您的类分成单独的文件。