private void DisplayStates(AnimationSequenceBehaviour behaviour) { var nodes = GetStates(behaviour); foreach (var node in nodes) { Undo.RecordObject(node.Item2, "Property change"); EditorGUI.indentLevel = 1; _foldouts[node.Item2] = EditorGUILayout.Foldout(_foldouts[node.Item2], node.Item1); if (_foldouts[node.Item2]) { var serializedObject = new SerializedObject(node.Item2); var iter = serializedObject.GetIterator(); if (iter == null) { continue; } iter.NextVisible(true); //required by the API EditorGUI.indentLevel = 2; while (iter.NextVisible(false)) // skip the first property, it's script, we don't want it to display { EditorGUILayout.PropertyField(iter, true); } serializedObject.ApplyModifiedProperties(); } } }
private Tuple <string, BaseSequenceState>[] GetStates(AnimationSequenceBehaviour target) { return (target .clonedRoot .GetAllSequenceNodes() .Where(n => n.state != null) .Select(n => new Tuple <string, BaseSequenceState>(n.state.name, n.state)) .ToArray()); }
private void SetFoldouts(AnimationSequenceBehaviour target) { var nodes = GetStates(target); var foldouts = nodes.ToDictionary(n => n.Item2, n => true); if (_foldouts == null) { _foldouts = foldouts; return; } foreach (var kvp in _foldouts) { if (foldouts.ContainsKey(kvp.Key)) { foldouts[kvp.Key] = kvp.Value; } } _foldouts = foldouts; }