editorguilayout.objectfield issue

I am trying to make a custom inspector where variables are displayed based on an enum. The first part I can get to work like a charm but I am having trouble displaying variables that are not available in EditorGUILayout.

For instance, I have this custom class:

using UnityEngine;
using System.Collections;

[System.Serializable]
public class MusicClip {

	public AudioClip clip;
	[HideInInspector]
	public int numberOfBeats;
	public int bpm = 120;
	public int numberOfLoops = 1;
	public bool narrator = false;
}

The script im extending contains a variable of this type and I want it to be displayed in my custom editor, but only if a specific enum was selected.

These are the variables of the script im extending:

public class ChallengeMarker : Marker, IDebugMonitor
{
		// Marker to be reached in order to win
		public Marker goal;

		// Goal of challenge (other marker)
		public float timeLimit = 1;

		// Time limit of challenge in seconds
		public MusicClip introClip;

		// Clip to play in begining of challenge
		public MusicClip[] challengeLoopClips = new MusicClip[1];

		// Clip to play if win challenge
		public MusicClip successClip;

		// Clip to play if lose challenge
		public MusicClip failClip;

		public static ChallengeMarker currentChallenge;


		// What type of challenge is it?
		public ChallengeType challengeType = ChallengeType.SpeedUp;

		// Enum for state of the challenge
		public enum State
		{
				AwaitingPlayer,
				InProgress,
				Succeeded,
				Failed,
		}

		// Internal state
		[HideInInspector]
		public State state = State.AwaitingPlayer;
		// ### DEBUG MONITOR VARIBLES ###
		private float startTime, endTime, startDist, npcStartDist;
		private GameObject player;
		private bool hasEvaluated = false;
		private NPC npc;

Note that Marker extends Monobehaviour.

This is my editor extension:

    using UnityEngine;
    using UnityEditor;
    using System.Collections;
    
    [CustomEditor (typeof(ChallengeMarker))]
    public class ChallengeMarkerEditor : MarkerEditor
    {
    		ChallengeMarker chal;
    		SerializedObject obj;
    		void OnEnable ()
    		{
    				chal = (ChallengeMarker)target;
    		}
    		public override void OnInspectorGUI()
    		{
    				chal.challengeType = (ChallengeType)EditorGUILayout.EnumPopup("Type of challenge",chal.challengeType);
    		
    				switch(chal.challengeType)
    				{
    				case ChallengeType.SpeedUp:
                            // Expose variables here
    						break;
    				}
    		
    		
    		}
    }

Now basically i’m clueless as to what I have to add in my switch in order to display a MusicClip variable. I have tried EditorGUILayout.propertyfield as well as EditorGUILayout.ObjectField without success. I’m pretty sure there is a way to do this? Any help is greatly appreciated!

I managed to find the solution myself:

The problem was that the variable I was trying to expose in the editor has nested objects. Therefore, not only do you need to do:

SerializedProperty prop = obj.FindProperty("successClip");
						EditorGUILayout.PropertyField(prop);

To expose “successClip” but you also need to expose all the nested properties as such:

if (prop.isExpanded) 
{
	foreach (SerializedProperty p in prop)
		EditorGUILayout.PropertyField (p);
}

This will then show the exposed property as well as all properties contained within itself.