public void InspectNode(BehaviourTree tree, NodeEditor node) { Clear(); if (serializedObject != null) { serializedObject.Dispose(); } this.tree = tree; if (!tree.IsInstance) { global = ZetanUtility.Editor.LoadAsset <GlobalVariables>(); } else { global = BehaviourManager.Instance.GlobalVariables; } nodeEditor = node; if (tree && nodeEditor != null && nodeEditor.node) { serializedObject = new SerializedObject(tree); SerializedProperty nodes = serializedObject.FindProperty("nodes"); IMGUIContainer container = new IMGUIContainer(() => { if (tree && nodeEditor != null && nodeEditor.node) { serializedObject.UpdateIfRequiredOrScript(); EditorGUI.BeginChangeCheck(); EditorGUILayout.LabelField($"[结点名称]\t{nodeEditor.node.name}"); EditorGUILayout.LabelField($"[优先级]\t{nodeEditor.node.priority}"); var nType = nodeEditor.node.GetType(); var fields = new HashSet <string>(nType.GetFields(ZetanUtility.CommonBindingFlags).Select(f => f.Name)); var fieldsMap = new HashSet <string>(); using (SerializedProperty property = nodes.GetArrayElementAtIndex(tree.Nodes.IndexOf(nodeEditor.node))) { using var end = property.GetEndProperty(); property.Next(true); while (property.NextVisible(false) && !SerializedProperty.EqualContents(property, end)) { string field = property.name; if (field == "name" || field == "priority" || field == "child" || field == "children" || field == "start" || field == "isRuntime" || field == "isShared" || field == "isGlobal") { continue; } if (fields.Contains(field)) { if (fieldsMap.Contains(field)) { break; } fieldsMap.Add(field); var fInfo = nType.GetField(field, ZetanUtility.CommonBindingFlags); DrawProperty(property, fInfo); } } } if (EditorGUI.EndChangeCheck()) { serializedObject.ApplyModifiedProperties(); } } }); Add(container); } }