示例#1
0
    //ノード状態の評価
    public override NodeStatus Evaluate()
    {
        if (m_conditionNode != null)
        {
            NodeStatus status = m_conditionNode.EvaluateCondition(m_nodeStatus);
            switch (status)
            {
            case NodeStatus.STATUS_SUCCESS:
                if (m_nodes[0] != m_preNode)
                {
                    m_preNode.SetFailuer();
                }
                m_nodeStatus = m_nodes[0].Evaluate();
                m_preNode    = m_nodes[0];
                return(m_nodeStatus);

            case NodeStatus.STATUS_FAILURE:
                if (m_nodes[1] != m_preNode)
                {
                    m_preNode.SetFailuer();
                }
                m_nodeStatus = m_nodes[1].Evaluate();
                m_preNode    = m_nodes[1];
                return(m_nodeStatus);

            case NodeStatus.STATUS_RUNNING:
                m_nodeStatus = m_preNode.Evaluate();
                return(m_nodeStatus);
            }
        }
        //ここにくるのはおかしい
        return(NodeStatus.STATUS_FAILURE);
    }
    public override void SetFailuer()
    {
        m_nodeStatus = NodeStatus.STATUS_FAILURE;
        BaseBTNode node = computeRunningNode(m_nodes);

        if (node != null)
        {
            node.SetFailuer();
        }
    }
    public override void SetFailuer()
    {
        m_preNode = null;
        foreach (BaseBTNode node in m_failuerNodes)
        {
            m_nodes.Add(node); //m_nodesにはないはず
        }
        m_failuerNodes.Clear();
        m_nodeStatus = NodeStatus.STATUS_FAILURE;
        BaseBTNode childNode = computeRunningNode(m_nodes);

        if (childNode != null)
        {
            childNode.SetFailuer();
        }
    }
 public override void SetFailuer()
 {
     m_nodeStatus = NodeStatus.STATUS_FAILURE;
     m_node.SetFailuer();
 }
    public override NodeStatus Evaluate()
    {
        if (m_conditionNode != null)
        {
            NodeStatus status = m_conditionNode.EvaluateCondition(m_nodeStatus);
            switch (status)
            {
            case NodeStatus.STATUS_SUCCESS:
                if (m_firstSearch)
                {
                    m_firstSearch = false;
                }
                if (m_nodes[0] != m_preNode)
                {
                    m_preNode.SetFailuer();
                }
                m_nodeStatus = m_nodes[0].Evaluate();
                m_preNode    = m_nodes[0];
                if (m_nodeStatus != NodeStatus.STATUS_RUNNING)
                {
                    m_firstSearch = true;
                }
                return(m_nodeStatus);

            case NodeStatus.STATUS_FAILURE:
                //前がToEnd実行完了のとき
                //前がNotToEnd実行中・NotToEnd実行完了のとき
                if ((m_firstSearch && m_preNode == m_nodes[0]) ||
                    (!m_firstSearch && m_preNode == m_nodes[1]))
                {
                    m_firstSearch = false;
                    if (m_nodes[1] != m_preNode)
                    {
                        m_preNode.SetFailuer();
                    }
                    m_nodeStatus = m_nodes[1].Evaluate();
                    m_preNode    = m_nodes[1];
                    return(m_nodeStatus);
                }
                else
                {
                    //前がToEnd実行中のとき
                    m_nodeStatus = m_nodes[0].Evaluate();
                    m_preNode    = m_nodes[0];
                    if (m_nodeStatus != NodeStatus.STATUS_RUNNING)
                    {
                        m_firstSearch = true;
                    }
                    return(m_nodeStatus);
                }

            case NodeStatus.STATUS_RUNNING:
                m_nodeStatus = m_preNode.Evaluate();
                if (m_nodeStatus != NodeStatus.STATUS_RUNNING &&
                    m_preNode == m_nodes[0])
                {
                    m_firstSearch = true;
                }
                return(m_nodeStatus);
            }
        }
        //ここにくるのはおかしい
        return(NodeStatus.STATUS_FAILURE);
    }