コード例 #1
0
    public void SetData(BehaviorTreeData behaviorTreeData)
    {
        BehaviorAnalysis analysis = new BehaviorAnalysis();

        _iconditionCheck = new ConditionCheck();
        _rootNode        = analysis.Analysis(behaviorTreeData, ref _iconditionCheck);
    }
コード例 #2
0
        public BehaviorTreeEntity(string content)
        {
            _iconditionCheck = new ConditionCheck();
            BehaviorAnalysis analysis = new BehaviorAnalysis();

            _rootNode = analysis.Analysis(content, _iconditionCheck, AddActionNode);
        }
コード例 #3
0
    public void SetData(string content)
    {
        BehaviorAnalysis analysis = new BehaviorAnalysis();

        _iconditionCheck = new ConditionCheck();
        _rootNode        = analysis.Analysis(content, ref _iconditionCheck);
    }
コード例 #4
0
        private AbstractNode AnalysisNode(NodeValue nodeValue, IConditionCheck iConditionCheck)
        {
            AbstractNode nodeBase = BehaviorConfigNode.Instance.GetNode(nodeValue.identificationName);

            if (nodeValue.NodeType == (int)NODE_TYPE.CONDITION)  // 条件节点
            {
                NodeCondition condition = (NodeCondition)nodeBase;
                condition.SetData(nodeValue.parameterList, nodeValue.conditionGroupList);
                condition.SetConditionCheck(iConditionCheck);
            }
            else if (nodeValue.NodeType == (int)NODE_TYPE.ACTION)
            {
                NodeAction action = (NodeAction)nodeBase;
                action.SetParameters(nodeValue.parameterList);
            }
            else if (nodeValue.NodeType == (int)NODE_TYPE.IF_JUDEG_PARALLEL || nodeValue.NodeType == (int)NODE_TYPE.IF_JUDEG_SEQUENCE)
            {
                NodeIfJudge ifJudge = (NodeIfJudge)nodeBase;
                ifJudge.SetData(nodeValue.ifJudgeDataList);
                ifJudge.SetDefaultResult((ResultType)nodeValue.defaultResult);
            }
            else if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_REPEAT)
            {
                NodeDecoratorRepeat repeat = (NodeDecoratorRepeat)nodeBase;
                repeat.SetRepeatCount(nodeValue.repeatTimes);
            }

            return(nodeBase);
        }
コード例 #5
0
        public NodeBase Analysis(long aiFunction, BehaviorTreeData data, IConditionCheck iConditionCheck, Action <int> InvalidSubTreeCallBack)
        {
            int      entityId = NewEntityId;
            NodeBase rootNode = AnalysisTree(entityId, aiFunction, data, iConditionCheck, InvalidSubTreeCallBack);

            return(rootNode);
        }
コード例 #6
0
        public BehaviorTreeEntity(BehaviorTreeData data)
        {
            _iconditionCheck = new ConditionCheck();
            BehaviorAnalysis analysis = new BehaviorAnalysis();

            _rootNode = analysis.Analysis(data, _iconditionCheck, AddActionNode);
        }
コード例 #7
0
        public NodeCondition GetCondition(NodeValue nodeValue, IConditionCheck iConditionCheck)
        {
            NodeCondition condition = (NodeCondition)CustomNode.Instance.GetNode(nodeValue.identification);

            condition.SetData(nodeValue.parameterList, nodeValue.conditionGroupList);
            condition.SetConditionCheck(iConditionCheck);
            return(condition);
        }
コード例 #8
0
        public void Reset(SkillHsmConfigHSMTreeData HSMTreeData)
        {
            HSMAnalysis analysis = new HSMAnalysis();

            _iconditionCheck = new ConditionCheck();
            analysis.Analysis(HSMTreeData, _iconditionCheck, this, ref _hsmStateMachine);
            _hsmStateMachine.SetAutoTransitionState(true);
        }
コード例 #9
0
ファイル: BehaviorLoad.cs プロジェクト: shimoop/BehaviorTree
    private void Load()
    {
        TextAsset        textAsset = Resources.Load <TextAsset>("Data/AbilityGeneric");
        BehaviorAnalysis analysis  = new BehaviorAnalysis();

        iconditionCheck = new ConditionCheck();
        _rootNode       = analysis.Analysis(textAsset.text, ref iconditionCheck);
        int a = 0;
    }
コード例 #10
0
        public NodeBase Analysis(string content, ref IConditionCheck iConditionCheck)
        {
            BehaviorTreeData behaviorTreeData = JsonMapper.ToObject <BehaviorTreeData>(content);

            if (null == behaviorTreeData)
            {
                Debug.LogError("behaviorTreeData is null");
                return(null);
            }
            return(Analysis(behaviorTreeData, ref iConditionCheck));
        }
コード例 #11
0
 public BehaviorTreeEntity(long aiFunction, BehaviorTreeData data)
 {
     _iconditionCheck = new ConditionCheck();
     //UnityEngine.Profiling.Profiler.BeginSample("Analysis");
     _rootNode = BehaviorAnalysis.GetInstance().Analysis(aiFunction, data, _iconditionCheck, AddInvalidSubTree);
     //UnityEngine.Profiling.Profiler.EndSample();
     if (null != _rootNode)
     {
         _entityId = _rootNode.EntityId;
     }
 }
コード例 #12
0
        public NodeCondition GetCondition(NodeValue nodeValue, IConditionCheck iConditionCheck)
        {
            UnityEngine.Profiling.Profiler.BeginSample("GetCondition1");
            NodeCondition condition = (NodeCondition)CustomNode.Instance.GetNode(nodeValue.identificationName);

            UnityEngine.Profiling.Profiler.EndSample();

            condition.SetData(nodeValue.parameterList, nodeValue.conditionGroupList);
            condition.SetConditionCheck(iConditionCheck);

            return(condition);
        }
コード例 #13
0
        public NodeBase Analysis(string content, IConditionCheck iConditionCheck, Action <NodeAction> ActionNodeCallBack)
        {
            BehaviorTreeData behaviorTreeData = JsonMapper.ToObject <BehaviorTreeData>(content);

            if (null == behaviorTreeData)
            {
                Debug.LogError("behaviorTreeData is null");
                return(null);
            }

            iConditionCheck.AddParameter(behaviorTreeData.parameterList);
            return(Analysis(behaviorTreeData, iConditionCheck, ActionNodeCallBack));
        }
コード例 #14
0
        public BehaviorTreeEntity(long aiFunction, BehaviorTreeData data, LoadConfigInfoEvent loadEvent)
        {
            _iconditionCheck = new ConditionCheck();
            BehaviorAnalysis analysis = new BehaviorAnalysis();

            analysis.SetLoadConfigEvent(loadEvent);
            UnityEngine.Profiling.Profiler.BeginSample("Analysis");
            _rootNode = analysis.Analysis(aiFunction, data, _iconditionCheck, AddInvalidSubTree);
            UnityEngine.Profiling.Profiler.EndSample();
            if (null != _rootNode)
            {
                _entityId = _rootNode.EntityId;
            }
        }
コード例 #15
0
        public NodeBase Analysis(long aiFunction, BehaviorTreeData data, IConditionCheck iConditionCheck, Action <int> InvalidSubTreeCallBack)
        {
            NodeBase rootNode = null;

            if (null == data || data.rootNodeId < 0)
            {
                //ProDebug.Logger.LogError("数据无效");
                return(rootNode);
            }

            iConditionCheck.AddParameter(data.parameterList);

            int entityId = NewEntityId;

            rootNode = AnalysisNode(entityId, aiFunction, data, data.rootNodeId, iConditionCheck, InvalidSubTreeCallBack);

            return(rootNode);
        }
コード例 #16
0
    public void Init()
    {
        SkillHsmConfigHSMTreeData skillHsmData = SkillEventHandler.Instance.GetSkillHsmConfigData(_skill.SkillData.HandleFile);

        if (null == skillHsmData)
        {
            UnityEngine.Debug.LogError("SkillHsmData is null:" + _skill.weaponId + "    " + _skill.SkillData.HandleFile);
            return;
        }

        _iconditionCheck = new ConditionCheck();

        HSMAnalysis analysis = new HSMAnalysis();

        analysis.Analysis(skillHsmData, _iconditionCheck, this, ref _hsmStateMachine);
        if (null != _hsmStateMachine)
        {
            _hsmStateMachine.SetAutoTransitionState(false);
        }

        Clear();
    }
コード例 #17
0
 public void SetConditionCheck(IConditionCheck iConditionCheck)
 {
     _iconditionCheck = iConditionCheck;
 }
コード例 #18
0
        private NodeBase AnalysisNode(int entityId, long aiFunction, BehaviorTreeData data, int nodeId, IConditionCheck iConditionCheck, Action <int> InvalidSubTreeCallBack)
        {
            NodeValue nodeValue = null;

            if (!data.nodeDic.TryGetValue(nodeId, out nodeValue))
            {
                return(null);
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.SUB_TREE && nodeValue.subTreeValue > 0)
            {
                if ((aiFunction & nodeValue.subTreeValue) <= 0)
                {
                    InvalidSubTreeCallBack?.Invoke(nodeValue.id);
                    return(null);
                }
            }

            //UnityEngine.Profiling.Profiler.BeginSample("AnalysisNode CreateNode");
            NodeBase nodeBase = AnalysisNode(nodeValue, iConditionCheck) as NodeBase;

            nodeBase.NodeId   = nodeValue.id;
            nodeBase.EntityId = entityId;
            nodeBase.Priority = nodeValue.priority;
            //UnityEngine.Profiling.Profiler.EndSample();

            if (nodeValue.NodeType == (int)NODE_TYPE.SUB_TREE && nodeValue.subTreeType == (int)SUB_TREE_TYPE.CONFIG)
            {
                BehaviorTreeData subTreeData = _loadConfigInfoEvent(nodeValue.subTreeConfig);
                if (null != subTreeData)
                {
                    NodeBase      subTreeNode = AnalysisTree(entityId, aiFunction, subTreeData, iConditionCheck, InvalidSubTreeCallBack);
                    NodeComposite composite   = (NodeComposite)(nodeBase);
                    composite.AddNode(subTreeNode);
                }
            }

            //UnityEngine.Profiling.Profiler.BeginSample("AnalysisNode IsLeafNode");
            if (!IsLeafNode(nodeValue.NodeType))
            {
                NodeComposite composite = (NodeComposite)nodeBase;
                for (int i = 0; i < nodeValue.childNodeList.Count; ++i)
                {
                    int      childNodeId = nodeValue.childNodeList[i];
                    NodeBase childNode   = AnalysisNode(entityId, aiFunction, data, childNodeId, iConditionCheck, InvalidSubTreeCallBack);
                    if (null != childNode)
                    {
                        composite.AddNode(childNode);
                    }
                }
            }
            //UnityEngine.Profiling.Profiler.EndSample();

            return(nodeBase);
        }
コード例 #19
0
        private NodeBase AnalysisNode(NodeValue nodeValue, IConditionCheck iConditionCheck)
        {
            if (nodeValue.NodeType == (int)NODE_TYPE.CONDITION)  // 条件节点
            {
                return(GetCondition(nodeValue, iConditionCheck));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.ACTION)  // 行为节点
            {
                return(GetAction(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.SUB_TREE) // 子树
            {
                return(GetSubTree());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.SELECT)  // 选择节点
            {
                return(GetSelect());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.SEQUENCE)  // 顺序节点
            {
                return(GetSequence());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.PARALLEL)  // 并行节点
            {
                return(GetParallel());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.PARALLEL_SELECT)// 并行选择节点
            {
                return(GetParallelSelect());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.PARALLEL_ALL)   // 并行执行所有节点
            {
                return(GetParallelAll());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.IF_JUDEG)       // 判断节点
            {
                return(GetIfJudge(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.RANDOM)  // 随机节点
            {
                return(GetRandom());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.RANDOM_SEQUEUECE)// 随机顺序节点
            {
                return(GetRandomSequence());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.RANDOM_PRIORITY) // 随机权重节点
            {
                return(GetRandomPriority());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_INVERTER)  // 修饰节点_取反
            {
                return(GetInverter());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_REPEAT)  // 修饰节点_重复
            {
                return(GetRepeat(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_RETURN_FAIL)  // 修饰节点_返回Fail
            {
                return(GetReturenFail());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_RETURN_SUCCESS)  // 修饰节点_返回Success
            {
                return(GetReturnSuccess());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_UNTIL_FAIL)  // 修饰节点_直到Fail
            {
                return(GetUntilFail());
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_UNTIL_SUCCESS)  // 修饰节点_直到Success
            {
                return(GetUntilSuccess());
            }

            return(null);
        }
コード例 #20
0
        public NodeBase Analysis(BehaviorTreeData data, IConditionCheck iConditionCheck, Action <NodeAction> ActionNodeCallBack)
        {
            NodeBase rootNode = null;

            if (null == data)
            {
                Debug.LogError("数据无效");
                return(rootNode);
            }

            if (data.rootNodeId < 0)
            {
                Debug.LogError("没有跟节点");
                return(rootNode);
            }

            iConditionCheck.AddParameter(data.parameterList);

            Dictionary <int, NodeBase>    compositeDic = new Dictionary <int, NodeBase>();
            Dictionary <int, NodeBase>    allNodeDic   = new Dictionary <int, NodeBase>();
            Dictionary <int, List <int> > childDic     = new Dictionary <int, List <int> >();

            for (int i = 0; i < data.nodeList.Count; ++i)
            {
                NodeValue nodeValue = data.nodeList[i];
                NodeBase  nodeBase  = AnalysisNode(nodeValue, iConditionCheck);
                nodeBase.NodeId = nodeValue.id;

                if (!IsLeafNode(nodeValue.NodeType))
                {
                    compositeDic[nodeValue.id] = nodeBase;
                    childDic[nodeValue.id]     = nodeValue.childNodeList;

                    if (data.rootNodeId == nodeValue.id)
                    {
                        rootNode = nodeBase;
                    }
                }

                if (null == nodeBase)
                {
                    Debug.LogError("AllNODE:" + nodeValue.id + "     " + (null != nodeBase));
                }

                if (nodeValue.NodeType == (int)NODE_TYPE.ACTION && null != ActionNodeCallBack)
                {
                    ActionNodeCallBack((NodeAction)nodeBase);
                }

                allNodeDic[nodeValue.id] = nodeBase;
            }

            foreach (var kv in compositeDic)
            {
                int           id        = kv.Key;
                NodeComposite composite = (NodeComposite)(kv.Value);

                List <int> childList = childDic[id];
                for (int i = 0; i < childList.Count; ++i)
                {
                    int      nodeId    = childList[i];
                    NodeBase childNode = allNodeDic[nodeId];
                    if (null == childNode)
                    {
                        Debug.LogError("null node :" + nodeId);
                        continue;
                    }
                    composite.AddNode(childNode);
                }
            }

            return(rootNode);
        }
コード例 #21
0
        private NodeBase AnalysisNode(NodeValue nodeValue, IConditionCheck iConditionCheck)
        {
            NodeBase node = null;

            if (nodeValue.NodeType == (int)NODE_TYPE.SELECT)  // 选择节点
            {
                return(GetSelect(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.SEQUENCE)  // 顺序节点
            {
                return(GetSequence(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.RANDOM)  // 随机节点
            {
                return(GetRandom(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.PARALLEL)  // 并行节点
            {
                return(GetParallel(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_INVERTER)  // 修饰节点_取反
            {
                return(GetInverter(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_REPEAT)  // 修饰节点_重复
            {
                return(GetRepeat(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_RETURN_FAIL)  // 修饰节点_返回Fail
            {
                return(GetReturenFail(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_RETURN_SUCCESS)  // 修饰节点_返回Success
            {
                return(GetReturnSuccess(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_UNTIL_FAIL)  // 修饰节点_直到Fail
            {
                return(GetUntilFail(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.DECORATOR_UNTIL_SUCCESS)  // 修饰节点_直到Success
            {
                return(GetUntilSuccess(nodeValue));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.CONDITION)  // 条件节点
            {
                return(GetCondition(nodeValue, iConditionCheck));
            }

            if (nodeValue.NodeType == (int)NODE_TYPE.ACTION)  // 行为节点
            {
                return(GetAction(nodeValue));
            }

            return(node);
        }