- Home /
Custom Inspector, variable updating problem
Hi all, I have a problem with a CustomEditor that is driving me crazy... I have a class named WaveformGenerator that generates sound given a specific waveform, with a type (sinus, triangle, custom, etc.) a frequency and a gain. I have a CustomEditor for this class, WaveformGeneratorEditor, that allows me to select and display the waveform. Here is a picture :

I want to change the display of the curve when I change the type of my waveform. Also, if I change manually the curve, I want my waveform type to change automatically to "custom".
My CustomEditor is supposed to do that, here is the code :
public override void OnInspectorGUI() {
WaveformGenerator generator = (WaveformGenerator)target;
EditorGUILayout.PropertyField(serializedObject.FindProperty("active"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("type"));
EditorGUILayout.PropertyField(serializedObject.FindProperty("waveform"));
//If my waveform type has changed, update the curve
if ((int)generator.type != generator.PreviousWaveformTypeIndex) {
Waveform waveform = Waveform.GetFromType(generator.type);
if (waveform != null) {
waveform.Init(generator.waveform.gain, generator.waveform.frequency);
generator.waveform = waveform;
int resolution = 64;
float[] signal = generator.waveform.GetWaveformSample(resolution);
Keyframe[] keys = new Keyframe[signal.Length];
for (int i = 0; i < signal.Length; i++) {
keys[i] = new Keyframe(2 * Mathf.PI * i / (float)resolution, signal[i]);
}
generator.PredefinedCurve = new AnimationCurve(keys);
generator.CurrentCurve = new AnimationCurve(keys);
generator.PreviousWaveformTypeIndex = (int)generator.type;
}
}
generator.CurrentCurve = EditorGUILayout.CurveField(generator.CurrentCurve, GUILayout.Height(50));
//If curve has been changed manually, change the waveform type to "custom"
if (!generator.CurrentCurve.keys.SequenceEqual(generator.PredefinedCurve.keys)) {
generator.type = WaveformType.Custom;
Waveform waveform = new CustomWaveform(GetValuesFromKeys(generator.PredefinedCurve.keys));
waveform.Init(generator.waveform.gain, generator.waveform.frequency);
generator.waveform = waveform;
generator.PredefinedCurve.keys = generator.CurrentCurve.keys;
generator.PreviousWaveformTypeIndex = (int)generator.type;
}
serializedObject.ApplyModifiedProperties();
if (GUI.changed)
EditorUtility.SetDirty(target);
}
In this code, you can see that I modify some variables of my WaveformGenerator. Those variables are declared as follows :
[SerializeField]
int previousWaveformTypeIndex = -1;
public int PreviousWaveformTypeIndex { get { return previousWaveformTypeIndex; } set { previousWaveformTypeIndex = value; } }
[SerializeField]
AnimationCurve currentCurve = new AnimationCurve();
public AnimationCurve CurrentCurve { get { return currentCurve; } set { currentCurve = value; } }
[SerializeField]
AnimationCurve predefinedCurve = null;
public AnimationCurve PredefinedCurve { get { return predefinedCurve; } set { predefinedCurve = value; } }
I have two problems with this :
1) when I modify the type of my waveform in the inspector, sometimes the curve is not updated. For instance if I go from Sinus to Sawtooth everything works well, but if I go back to Sinus, my curve stays on Sawtooth. I don't understand why !!
2) when I modify manually the curve, the type variable is changed to custom, but the change is not display in the inspector. For instance if I modify manually the Sinus curve, the type is changed to Custom in my class (I checked with a print), but the inspector tells me I'm still on a Sinus.
Any idea ? If you need any additional information please ask me.
Thanks !
Your answer