void SelectPlan()
        {
            var activeGameObject = Selection.activeGameObject;

            if (EditorApplication.isPlayingOrWillChangePlaymode)
            {
                if (!activeGameObject)
                {
                    activeGameObject = FindPlannerObject();
                }

                if (activeGameObject)
                {
                    if (!GetPlanExecutor(activeGameObject, out var executor))
                    {
                        activeGameObject = FindPlannerObject();
                        GetPlanExecutor(activeGameObject, out executor);
                    }

                    if (executor != null)
                    {
                        m_PlanExecutor = executor;
                        m_Visualizer   = new PlanVisualizer(m_PlanExecutor);
                    }
                }
            }
            else
            {
                m_Visualizer   = null;
                m_PlanExecutor = null;
            }
        }
    void DrawInspector(Rect inspectorArea, IPlanVisualizer visualizer)
    {
        EditorGUI.DrawRect(inspectorArea, s_InspectorBackground);

        inspectorArea.x      += s_BorderSize;
        inspectorArea.width  -= s_BorderSize * 2;
        inspectorArea.y      += s_BorderSize;
        inspectorArea.height -= s_BorderSize * 2;

        GUILayout.BeginArea(inspectorArea);
        GUILayout.BeginVertical();

        if (m_GraphOnlyRenderer.SelectedNode != null)
        {
            var node = m_GraphOnlyRenderer.SelectedNode;
            using (var scrollView = new EditorGUILayout.ScrollViewScope(m_ScrollPos))
            {
                m_ScrollPos = scrollView.scrollPosition;

                if (node is BaseNode baseNode && !baseNode.ExpansionNode)
                {
                    baseNode.DrawInspector(visualizer);
                }
            }
        }
        else
        {
            GUILayout.Label("Click on a node\nto display its details.");
        }

        GUILayout.FlexibleSpace();
        GUILayout.EndVertical();
        GUILayout.EndArea();
    }
Beispiel #3
0
        public override void DrawInspector(IPlanVisualizer visualizer)
        {
            if (m_Plan.TryGetStateInfo(StateKey, out var stateInfo))
            {
                base.DrawInspector(visualizer);

                EditorGUILayout.LabelField("Estimated Total Reward", $"{stateInfo.CumulativeRewardEstimate}", EditorStyles.whiteLabel);
                EditorGUILayout.LabelField("Subplan Is Complete", $"{stateInfo.SubplanIsComplete}", EditorStyles.whiteLabel);

                if (m_Plan.TryGetOptimalAction(StateKey, out var optimalActionKey))
                {
                    EditorGUILayout.LabelField("Best Action", m_PlanExecutor.GetActionName(optimalActionKey), EditorStyles.whiteLabel);
                }

                if (string.IsNullOrEmpty(m_CachedStateString))
                {
                    m_CachedStateString = m_Plan.GetStateData(StateKey)?.ToString();
                }

                if (string.IsNullOrEmpty(m_CachedStateString)) // State may no longer exist but be selected as an override.
                {
                    return;
                }

                if (!m_RootState || active)
                {
                    s_ActionsGUIFoldout = EditorStyleHelper.DrawSubHeader(new GUIContent("Actions"), s_ActionsGUIFoldout);
                    if (s_ActionsGUIFoldout)
                    {
                        using (new EditorGUI.IndentLevelScope())
                        {
                            m_Plan.GetActions(StateKey, s_Actions);
                            SortSuccessorActions(s_Actions, ref s_Successors, out _, out _);

                            for (var i = 0; i < s_Successors.Count; i++)
                            {
                                var successor = s_Successors[i];
                                var actionKey = successor.ActionKey;
                                if (m_Plan.TryGetActionInfo(StateKey, actionKey, out var actionInfo))
                                {
                                    var rect = EditorGUILayout.BeginHorizontal();

                                    var  stateActionKey = (StateKey, actionKey);
                                    bool toggle         = i < visualizer.MaxChildrenNodes || visualizer.ForcedExpandedNodes.Contains(stateActionKey);

                                    if (i < visualizer.MaxChildrenNodes)
                                    {
                                        GUI.enabled = false;
                                    }

                                    EditorGUI.BeginChangeCheck();
                                    toggle = GUI.Toggle(rect, toggle, string.Empty);

                                    if (EditorGUI.EndChangeCheck())
                                    {
                                        if (toggle)
                                        {
                                            visualizer.ForcedExpandedNodes.Add(stateActionKey);
                                        }
                                        else
                                        {
                                            visualizer.ForcedExpandedNodes.Remove(stateActionKey);
                                        }
                                    }
                                    GUI.enabled = true;

                                    EditorGUILayout.LabelField(new GUIContent(m_PlanExecutor.GetActionName(actionKey)), new GUIContent($"{actionInfo.CumulativeRewardEstimate.Average:0.000}", $"{actionInfo.CumulativeRewardEstimate}"), EditorStyles.whiteLabel);
                                    EditorGUILayout.EndHorizontal();

                                    using (new EditorGUI.IndentLevelScope())
                                    {
                                        var parameters = m_PlanExecutor.GetActionParametersInfo(StateKey, actionKey);
                                        foreach (var param in parameters)
                                        {
                                            EditorGUILayout.LabelField(new GUIContent(param.ParameterName), new GUIContent(param.TraitObjectName, $"Object: {param.TraitObjectId}"), EditorStyles.whiteMiniLabel);
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                EditorGUILayout.Space();
                s_StateGUIFoldout = EditorStyleHelper.DrawSubHeader(new GUIContent("State information"), s_StateGUIFoldout);
                var displayString = m_CachedStateString;

                if (s_StateGUIFoldout)
                {
                    using (new EditorGUI.IndentLevelScope())
                    {
                        EditorGUI.BeginChangeCheck();
                        s_StateFilter = EditorGUILayout.DelayedTextField(s_StateFilter);
                        if (EditorGUI.EndChangeCheck())
                        {
                            m_CachedFilterString = string.Empty;
                        }

                        if (!string.IsNullOrEmpty(s_StateFilter))
                        {
                            if (string.IsNullOrEmpty(m_CachedFilterString))
                            {
                                var stateStringSplit = m_CachedStateString.Split('\n');
                                var linesToInclude   = new SortedSet <int>();
                                var lastEmptyLine    = 0;
                                for (var i = 0; i < stateStringSplit.Length; i++)
                                {
                                    var stateStringLine = stateStringSplit[i];
                                    if (string.IsNullOrWhiteSpace(stateStringLine))
                                    {
                                        lastEmptyLine = i;
                                    }
                                    else if (stateStringLine.IndexOf(s_StateFilter, StringComparison.OrdinalIgnoreCase) >= 0)
                                    {
                                        var nextEmptyLine = i;
                                        while (!string.IsNullOrWhiteSpace(stateStringSplit[nextEmptyLine]))
                                        {
                                            nextEmptyLine++;
                                            if (nextEmptyLine == stateStringSplit.Length - 1)
                                            {
                                                break;
                                            }
                                        }

                                        for (var j = lastEmptyLine; j < nextEmptyLine; j++)
                                        {
                                            linesToInclude.Add(j);
                                        }
                                    }
                                }

                                var sb = new StringBuilder();
                                foreach (var line in linesToInclude)
                                {
                                    sb.AppendLine(stateStringSplit[line]);
                                }
                                m_CachedFilterString = sb.ToString();
                            }

                            displayString = m_CachedFilterString;
                        }

                        EditorGUILayout.LabelField(displayString, EditorStyleHelper.inspectorStyleLabel);
                    }
                }

                if (GUILayout.Button("Copy State", EditorStyles.miniButton))
                {
                    displayString.CopyToClipboard();
                }
            }
        }
 public virtual void DrawInspector(IPlanVisualizer visualizer)
 {
     GUILayout.Label(Label, EditorStyles.whiteLargeLabel);
     EditorGUILayout.Space();
 }
    public void Draw(IGraphLayout graphLayout, Rect totalDrawingArea, GraphSettings graphSettings, IPlanVisualizer visualizer)
    {
        var drawingArea = new Rect(totalDrawingArea);

        if (graphSettings.showInspector)
        {
            var inspectorArea = new Rect(totalDrawingArea)
            {
                width = Mathf.Max(s_InspectorFixedWidth, drawingArea.width * 0.25f) + s_BorderSize * 2
            };

            inspectorArea.x    = drawingArea.xMax - inspectorArea.width;
            drawingArea.width -= inspectorArea.width;

            DrawInspector(inspectorArea, visualizer);
        }

        m_GraphOnlySettings.maximumNormalizedNodeSize = graphSettings.maximumNormalizedNodeSize;
        m_GraphOnlySettings.maximumNodeSizeInPixels   = graphSettings.maximumNodeSizeInPixels;
        m_GraphOnlySettings.aspectRatio = graphSettings.aspectRatio;
        m_GraphOnlyRenderer.Draw(graphLayout, drawingArea, m_GraphOnlySettings);
    }