示例#1
0
        private void DrawSelf()
        {
            string              label     = string.IsNullOrEmpty(m_node.Name) ? m_node.Title : m_node.Name;
            BTGraphNodeStyle    nodeStyle = BTEditorStyle.GetNodeStyle(m_node);
            Vector2             nodeSize  = BTEditorStyle.GetNodeSize(m_node);
            Rect                position  = new Rect(NodePositon + BTEditorCanvas.Current.Position, nodeSize);
            BehaviourNodeStatus status    = BTEditorCanvas.Current.IsDebuging ? m_node.Status : BehaviourNodeStatus.None;

            EditorGUI.LabelField(position, label, nodeStyle.GetStyle(status, m_isSelected));

            if (m_node.Breakpoint != Breakpoint.None)
            {
                Rect imgPosition;
                if (m_node is NodeGroup)
                {
                    imgPosition = new Rect(position.x + 2, position.y + 2, 12, 12);
                }
                else
                {
                    imgPosition = new Rect(position.x - 14, position.y + 2, 12, 12);
                }

                GUI.DrawTexture(imgPosition, BTEditorStyle.Breakpoint);
            }
        }
示例#2
0
        protected override BehaviourNodeStatus OnExecute(AIAgent agent)
        {
            BehaviourNodeStatus status = BehaviourNodeStatus.Success;

            if (m_child != null && m_repeatCount >= 0)
            {
                if (m_currentIteration <= m_repeatCount)
                {
                    if (m_child.Status != BehaviourNodeStatus.None && m_child.Status != BehaviourNodeStatus.Running)
                    {
                        m_child.OnReset();
                    }

                    status = m_child.Run(agent);
                    if (status == BehaviourNodeStatus.Success)
                    {
                        m_currentIteration++;
                        if (m_currentIteration <= m_repeatCount)
                        {
                            status = BehaviourNodeStatus.Running;
                        }
                    }
                }
            }

            return(status);
        }
示例#3
0
 public BehaviourNode()
 {
     m_breakpoint  = Breakpoint.None;
     m_status      = BehaviourNodeStatus.None;
     m_constraints = new List <Constraint>();
     m_services    = new List <Service>();
 }
示例#4
0
        public BehaviourNodeStatus Run(AIAgent agent)
        {
            if (m_status != BehaviourNodeStatus.Running)
            {
                OnEnter(agent);

                foreach (var service in m_services)
                {
                    service.OnEnter(agent);
                }
#if UNITY_EDITOR
                if (agent.DebugMode)
                {
                    if (m_breakpoint.Has(Breakpoint.OnEnter))
                    {
                        Debug.Break();
                    }
                }
#endif
            }

            if (CheckConstraints(agent))
            {
                m_status = OnExecute(agent);

                foreach (var service in m_services)
                {
                    service.OnExecute(agent);
                }
            }
            else
            {
                m_status = BehaviourNodeStatus.Failure;
            }

            if (m_status != BehaviourNodeStatus.Running)
            {
                OnExit(agent);

                foreach (var service in m_services)
                {
                    service.OnExit(agent);
                }
#if UNITY_EDITOR
                if (agent.DebugMode)
                {
                    if ((m_status == BehaviourNodeStatus.Success && m_breakpoint.Has(Breakpoint.OnSuccess)) ||
                        (m_status == BehaviourNodeStatus.Failure && m_breakpoint.Has(Breakpoint.OnFailure)) ||
                        m_breakpoint.Has(Breakpoint.OnExit))
                    {
                        Debug.Break();
                    }
                }
#endif
            }

            return(m_status);
        }
示例#5
0
        protected override BehaviourNodeStatus OnExecute(AIAgent agent)
        {
            BehaviourNodeStatus status = BehaviourNodeStatus.Failure;

            if (m_child != null && m_numberOfExecutions < m_maxExecutions)
            {
                status = m_child.Run(agent);
            }

            return(status);
        }
示例#6
0
        protected override BehaviourNodeStatus OnExecute(AIAgent agent)
        {
            BehaviourNodeStatus status = BehaviourNodeStatus.Success;

            if (m_child != null)
            {
                status = m_child.Run(agent);
                if (status != BehaviourNodeStatus.Running)
                {
                    status = BehaviourNodeStatus.Success;
                }
            }

            return(status);
        }
示例#7
0
        public GUIStyle GetStyle(BehaviourNodeStatus status, bool isSelected)
        {
            switch (status)
            {
            case BehaviourNodeStatus.Failure:
                return(!isSelected ? m_failNormalStyle : m_failSelectedStyle);

            case BehaviourNodeStatus.Running:
                return(!isSelected ? m_runninfNormalStyle : m_runningSelectedStyle);

            case BehaviourNodeStatus.Success:
                return(!isSelected ? m_successNormalStyle : m_successSelectedStyle);
            }

            return(!isSelected ? m_standardNormalStyle : m_standardSelectedStyle);
        }
示例#8
0
        public static Color GetTransitionColor(BehaviourNodeStatus status)
        {
            switch (status)
            {
            case BehaviourNodeStatus.Failure:
                return(Color.red);

            case BehaviourNodeStatus.Running:
                return(new Color32(229, 202, 76, 255));

            case BehaviourNodeStatus.Success:
                return(Color.green);
            }

            return(Color.white);
        }
示例#9
0
        protected override BehaviourNodeStatus OnExecute(AIAgent agent)
        {
            BehaviourNodeStatus status = BehaviourNodeStatus.Success;

            while (m_currentChild < m_children.Count)
            {
                status = m_children[m_currentChild].Run(agent);
                if (status == BehaviourNodeStatus.Success)
                {
                    m_currentChild++;
                }
                else
                {
                    break;
                }
            }

            return(status);
        }
示例#10
0
        protected override BehaviourNodeStatus OnExecute(AIAgent agent)
        {
            BehaviourNodeStatus status = BehaviourNodeStatus.Success;

            if (m_child != null)
            {
                status = m_child.Run(agent);
                if (status == BehaviourNodeStatus.Success)
                {
                    status = BehaviourNodeStatus.Failure;
                }
                else if (status == BehaviourNodeStatus.Failure)
                {
                    status = BehaviourNodeStatus.Success;
                }
            }

            return(status);
        }
示例#11
0
        protected override BehaviourNodeStatus OnExecute(AIAgent agent)
        {
            BehaviourNodeStatus status = BehaviourNodeStatus.Success;

            if (m_child != null)
            {
                if (m_child.Status != BehaviourNodeStatus.None && m_child.Status != BehaviourNodeStatus.Running)
                {
                    m_child.OnReset();
                }

                status = m_child.Run(agent);
                if (status != BehaviourNodeStatus.Failure)
                {
                    status = BehaviourNodeStatus.Running;
                }
            }

            return(status);
        }
示例#12
0
        private void DrawTransitions()
        {
            Vector2            nodeSize   = BTEditorStyle.GetNodeSize(m_node);
            Rect               position   = new Rect(NodePositon + BTEditorCanvas.Current.Position, nodeSize);
            BTEditorTreeLayout treeLayout = BTEditorStyle.TreeLayout;

            foreach (var child in m_children)
            {
                Vector2             childNodeSize = BTEditorStyle.GetNodeSize(child.Node);
                Rect                childPosition = new Rect(child.Node.Position + BTEditorCanvas.Current.Position, childNodeSize);
                BehaviourNodeStatus childStatus   = BTEditorCanvas.Current.IsDebuging ? child.Node.Status : BehaviourNodeStatus.None;
                Color               color         = BTEditorStyle.GetTransitionColor(childStatus);
                Vector2             nodeCenter    = position.center;
                Vector2             childCenter   = childPosition.center;

                if (treeLayout == BTEditorTreeLayout.Vertical)
                {
                    if (Mathf.Approximately(nodeCenter.y, childCenter.y) || Mathf.Approximately(nodeCenter.x, childCenter.x))
                    {
                        BTEditorUtils.DrawLine(nodeCenter, childCenter, color);
                    }
                    else
                    {
                        BTEditorUtils.DrawLine(nodeCenter, nodeCenter + Vector2.up * (childCenter.y - nodeCenter.y) / 2, color);

                        BTEditorUtils.DrawLine(nodeCenter + Vector2.up * (childCenter.y - nodeCenter.y) / 2,
                                               childCenter + Vector2.up * (nodeCenter.y - childCenter.y) / 2, color);

                        BTEditorUtils.DrawLine(childCenter, childCenter + Vector2.up * (nodeCenter.y - childCenter.y) / 2, color);
                    }
                }
                else if (treeLayout == BTEditorTreeLayout.Horizontal)
                {
                    BTEditorUtils.DrawBezier(nodeCenter, childCenter, color);
                }
                else
                {
                    BTEditorUtils.DrawLine(nodeCenter, childCenter, color);
                }
            }
        }
示例#13
0
        protected override BehaviourNodeStatus OnExecute(AIAgent agent)
        {
            BehaviourNodeStatus status  = BehaviourNodeStatus.Success;
            int numberOfFailures        = 0;
            int numberOfSuccesses       = 0;
            int numberOfRunningChildren = 0;

            if (m_children.Count > 0)
            {
                for (int i = 0; i < m_children.Count; i++)
                {
                    BehaviourNodeStatus childStatus = m_children[i].Status;
                    if (childStatus == BehaviourNodeStatus.None || childStatus == BehaviourNodeStatus.Running)
                    {
                        childStatus = m_children[i].Run(agent);
                    }

                    if (childStatus == BehaviourNodeStatus.Success)
                    {
                        numberOfSuccesses++;
                    }
                    else if (childStatus == BehaviourNodeStatus.Failure)
                    {
                        numberOfFailures++;
                    }
                    else if (childStatus == BehaviourNodeStatus.Running)
                    {
                        numberOfRunningChildren++;
                    }
                }

                if ((m_failOnAny && numberOfFailures > 0) || (m_succeedOnAny && numberOfSuccesses > 0))
                {
                    if (m_failOnTie)
                    {
                        if (m_failOnAny && numberOfFailures > 0)
                        {
                            status = BehaviourNodeStatus.Failure;
                        }
                        else if (m_succeedOnAny && numberOfSuccesses > 0)
                        {
                            status = BehaviourNodeStatus.Success;
                        }
                    }
                    else
                    {
                        if (m_succeedOnAny && numberOfSuccesses > 0)
                        {
                            status = BehaviourNodeStatus.Success;
                        }
                        else if (m_failOnAny && numberOfFailures > 0)
                        {
                            status = BehaviourNodeStatus.Failure;
                        }
                    }
                }
                else
                {
                    if (numberOfSuccesses == m_children.Count)
                    {
                        status = BehaviourNodeStatus.Success;
                    }
                    else if (numberOfFailures == m_children.Count)
                    {
                        status = BehaviourNodeStatus.Failure;
                    }
                    else
                    {
                        status = BehaviourNodeStatus.Running;
                    }
                }
            }

            return(status);
        }
示例#14
0
 public virtual void OnReset()
 {
     m_status = BehaviourNodeStatus.None;
 }