- Home /
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!
Answer by kUr4m4 · Jan 23, 2014 at 08:35 AM
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.