public bool this[IAINode node] { get { if (node.IsNullOrDestroyed()) { return(true); } bool result; if (_table.TryGetValue(AITreeDebugWindow.GetNodeHash(node), out result)) { return(result); } return(true); } set { if (node.IsNullOrDestroyed()) { return; } _table[AITreeDebugWindow.GetNodeHash(node)] = value; } }
private static void OpenWindow() { if (_window == null) { _window = EditorWindow.GetWindow <AITreeDebugWindow>(); _window.Show(); _window.position = new Rect(20, 80, 500, 300); } else { _window.Focus(); } }
private void DrawNode(IAINode node) { var rect = EditorGUILayout.GetControlRect(); bool hasChildren = (node is IAIActionGroup || node is IAIStateMachine); //first click region if (MouseUtil.GuiClicked(Event.current, MouseUtil.BTN_LEFT, rect)) { _currentSelectionId = AITreeDebugWindow.GetNodeHash(node); if (node is Component) { Selection.activeGameObject = (node as Component).gameObject; EditorGUIUtility.PingObject(node as Component); } this.Repaint(); } else if (MouseUtil.GuiClicked(Event.current, MouseUtil.BTN_RIGHT, rect)) { this.DrawPopup(node); } //draw selection rect if (_currentSelectionId == AITreeDebugWindow.GetNodeHash(node)) { EditorGUI.DrawRect(rect, _selectedColor); } //draw label if (hasChildren) { _currentTable[node] = EditorGUI.Foldout(rect, _currentTable[node], node.DisplayName); } else { EditorGUI.LabelField(rect, node.DisplayName); } //highlight if running if (node is IAIAction) { var act = node as IAIAction; switch (act.ActionState) { case ActionResult.Waiting: EditorGUI.DrawRect(rect, _waitingColor); break; case ActionResult.Success: EditorGUI.DrawRect(rect, _successColor); break; case ActionResult.Failed: EditorGUI.DrawRect(rect, _failedColor); break; } } else if (node is IAIState) { var state = node as IAIState; if (state.IsActive) { EditorGUI.DrawRect(rect, _activeStateColor); } } if (hasChildren && _currentTable[node]) { EditorGUI.indentLevel++; if (node is IAIActionGroup) { foreach (var child in (node as IAIActionGroup)) { this.DrawNode(child); } } else if (node is IAIStateMachine) { foreach (var child in (node as IAIStateMachine)) { this.DrawNode(child); } } EditorGUI.indentLevel--; } }