我正在尝试为Unity GameObject
创建一个组件,我们将其称为MediaController
。我希望它能够管理不同媒体(音频/视频)的时间安排(播放/暂停/等)。我创建了一个具有基本属性/字段/方法的抽象类PlayableMedia
,并创建了两个类PlayableVideo
和PlayableAudio
,它们可以根据需要继承和实现。
目的是要有一个单独的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
,并附加了适当的组件)?
答案 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的工作方式。
因此,要回答我认为您要提出的问题(假设我们将“属性”替换为“字段”),则确实有可能使用抽象类类型并将其显示在检查器中。我怀疑您需要将您的类分成单独的文件。