public override void OnAwake()
        {
            if (Node.Fields == null || Node.Fields["Priority"] == null)
            {
                Node.Status = NodeStatus.ERROR;
                return;
            }

            CompositeNode = Node as BaseCompositeNode;
            for (int index = 0; index < CompositeNode.Children.Count; index++)
            {
                Children.Add(CompositeNode.Children[index]);
            }

            RandList.Clear();

            PriorityList = new List <int>();
            RepeatIntField repeatIntField = Node.Fields["Priority"] as RepeatIntField;
            List <int>     tempList       = repeatIntField.Value;

            for (int index = 0; index < tempList.Count; index++)
            {
                PriorityList.Add(tempList[index]);
            }
        }
예제 #2
0
 public override void OnAwake()
 {
     CompositeNode = Node as BaseCompositeNode;
     for (int index = 0; index < CompositeNode.Children.Count; index++)
     {
         Children.Add(CompositeNode.Children[index]);
     }
 }
예제 #3
0
        public override void OnUpdate(float deltaTime)
        {
            int failCount    = 0;
            int successCound = 0;

            BaseCompositeNode compositeNode = Node as BaseCompositeNode;

            for (int i = 0; i < compositeNode.Children.Count; i++)
            {
                BaseNode node = compositeNode.Children[i];

                node.OnUpdate(deltaTime);

                if (node.Status == NodeStatus.FAILED)
                {
                    failCount++;

                    if (FailPolicy == (int)FAILURE_POLICY.FAIL_ON_ONE)
                    {
                        Node.Status = NodeStatus.FAILED;
                        break;
                    }
                    else if (FailPolicy == (int)FAILURE_POLICY.FAIL_ON_ALL && failCount == compositeNode.Children.Count)
                    {
                        Node.Status = NodeStatus.FAILED;
                        break;
                    }
                }
                else if (node.Status == NodeStatus.SUCCESS)
                {
                    successCound++;

                    if (SucceedPolicy == (int)SUCCESS_POLICY.SUCCEED_ON_ONE)
                    {
                        Node.Status = NodeStatus.SUCCESS;
                        break;
                    }
                    else if (SucceedPolicy == (int)SUCCESS_POLICY.SUCCEED_ON_ALL && successCound == compositeNode.Children.Count)
                    {
                        Node.Status = NodeStatus.SUCCESS;
                        break;
                    }
                }
                else if (node.Status == NodeStatus.ERROR)
                {
                    Node.Status = NodeStatus.ERROR;
                    break;
                }
            }

            if ((failCount + successCound) == compositeNode.Children.Count)
            {
                Node.Status = NodeStatus.SUCCESS;
            }
        }
예제 #4
0
        /// <summary>
        /// 通过类型获取节点
        /// </summary>
        /// <param name="classType"></param>
        /// <returns></returns>
        public static BaseNode GetBaseNode(string classType)
        {
            BaseNode baseNode = null;

            NodeProxyInfo nodeProxyInfo = BehaviorTreeManager.Instance.GetRegistedNodeType(classType);

            if (nodeProxyInfo == null)
            {
                Debug.LogError($"错误!!行为树节点未注册 ClassType:{classType}");
                return(null);
            }

            switch (nodeProxyInfo.behaviorNodeType)
            {
            case BehaviorNodeType.Action:
                baseNode = new BaseActionNode();
                break;

            case BehaviorNodeType.Condition:
                baseNode = new BaseConditionNode();
                break;

            case BehaviorNodeType.Composite:
                baseNode = new BaseCompositeNode();
                break;

            case BehaviorNodeType.Decorator:
                baseNode = new BaseDecoratorNode();
                break;

            default:
                Debug.LogError($"错误!!行为树节点类型错误 ClassType:{classType}");
                break;
            }
            baseNode.NodeInfo = nodeProxyInfo;
            return(baseNode);
        }
예제 #5
0
 public override void OnDestroy()
 {
     CompositeNode = null;
     base.OnDestroy();
 }
예제 #6
0
 public override void OnAwake()
 {
     CompositeNode = Node as BaseCompositeNode;
 }