示例#1
0
        public static BTState TickNode(NodeBase node, float deltaTime)
        {
            if (node.nodeState == NodeState.Raw)
            {
                throw new Exception("Trying to tick a raw node!");
            }

            if (node.nodeState == NodeState.Visited)
            {
                throw new Exception("Trying to tick a visited node!");
            }

            // first time
            if (node.nodeState == NodeState.Ready)
            {
                node.OnEnter();
                node.nodeState = NodeState.Visiting;
            }

            // regular tick
            BTState ret = node.Update(deltaTime);

            if (ret == BTState.Running)
            {
                return(ret);
            }

            // last time
            node.OnExit();
            node.nodeState = NodeState.Visited;
            return(ret);
        }
示例#2
0
        public void OnFireEvent(BTState state, BTEvent btEvent)
        {
            //XLogger.Log( state.ToString(), state );
            var currNode = FindBTNode(state);

            currNode.FireEvent(btEvent);
        }
示例#3
0
        public BTNode AddNewBTNode(BTState newBTState)
        {
            var newNode = new BTNode(newBTState);

            totalNode.Add(newNode);
            return(newNode);
        }
示例#4
0
 // Update is called once per frame
 void Update()
 {
     if (state == BTState.RUNNING)
     {
         state = EBUpdate();
     }
 }
示例#5
0
 public static void AddStateToFsm(BTFsm owner, BTState targetState)
 {
     if (BTEditorWindow.HasPrefab(owner))
     {
         if (owner.template == null)
         {
             AddTemplateToFsm(owner);
             owner.template.startEvent = owner.startEvent;
             owner.template.totalEvent = owner.totalEvent;
             if (owner.template.totalState == null)
             {
                 owner.template.totalState = new List <BTState>();
             }
         }
         BTEditorWindow.AddObjectToAsset(targetState, owner.template);
         owner.template.totalState.Add(targetState);
         EditorUtility.SetDirty(owner);
     }
     else if (owner.template != null)
     {
         owner.template.totalState.Add(targetState);
         BTEditorWindow.AddObjectToAsset(targetState, owner.template);
         EditorUtility.SetDirty(owner.template);
     }
 }
示例#6
0
        internal static BTState NodeTick(NodeBase node, float deltaTime)
        {
            if (node.nodeState == NodeState.Raw)
            {
                throw new Exception("A raw node can not tick!");
            }

            if (node.nodeState == NodeState.Visited)
            {
                throw new Exception("A visited node can not tick!");
            }

            // first time
            if (node.nodeState == NodeState.Ready)
            {
                node.OnEnter();
                node.nodeState = NodeState.Visiting;
            }

            // regular tick
            BTState ret = node.Update(deltaTime);

            node.behaviorTree.logger.Debug(node.ToString() + " : " + ret);
            if (ret == BTState.Running)
            {
                return(ret);
            }

            // last time
            node.OnExit();
            node.nodeState = NodeState.Visited;
            return(ret);
        }
示例#7
0
        public void ClickNode(object obj)
        {
            var className = obj as string;
            var btNode    = currNode as BTNode;

            if (className == "NewEvent")
            {
                BTEvent.Create(btNode.BtState);
            }
            else if (className == "OpenScript")
            {
                btNode.OpenScript();
            }
            else if (className == "DeleteState")
            {
                DeleteCurrState();
            }
            else if (className == "CopyState")
            {
                copyState = btNode.BtState;
            }
            else
            {
                var type = Type.GetType(className);
                if (type.IsSubclassOf(typeof(BTAction)))
                {
                    var newAction = CreateAction(type, btNode.BtState);
                    newAction.OnCreate();
                    EditorUtility.SetDirty(newAction);
                    Debug.Log(type.ToString());
                }
            }
        }
示例#8
0
    public sealed override BTState Tick()
    {
        if (this.current == -1)
        {
            this.current = target;
        }

        state = child.Tick();

        if (state == BTState.Running)
        {
            return(BTState.Running);
        }
        else
        {
            if (this.current > 0)
            {
                this.current--;
                return(BTState.Running);
            }
            else
            {
                this.current = -1;
                return(state);
            }
        }
    }
示例#9
0
        public override void OnPaste()
        {
            base.OnPaste();

            List <BTState> newStates = new List <BTState>();

            for (int i = 0; i < copiedStates.Count; i++)
            {
                var copyState = copiedStates[i];
                var newState  = BTState.Create(target, copyState);
                newState.name = copyState.name;
                newState.OnCreate();
                BTEditorWindow.instance.AddNewBTNode(newState);
                EditorUtility.SetDirty(target);
                BTGenericMenu.AddStateToFsm(target, newState);
                newStates.Add((newState));
            }

            for (int j = 0; j < newStates.Count; j++)
            {
                var newState = newStates[j];
                newState.ReFindEvent();
                for (int i = 0; i < newState.totalActions.Count; i++)
                {
                    BTGenericMenu.AddActionToState(newState, newState.totalActions[i]);
                }
            }
            EditorUtility.SetDirty(target);

            ShowNotification(new GUIContent("Pasted {0} State.".Format(newStates.Count)));
        }
示例#10
0
    public sealed override BTState Tick()
    {
        if (fn != null)
        {
            fn();
            return(BTState.Success);
        }
        else
        {
            if (coroutine == null || this.bt.previousTick != this.tick)
            {
                coroutine = coroutineFactory();
            }

            this.tick = this.bt.currentTick;

            if (!coroutine.MoveNext())
            {
                coroutine = null;
                return(BTState.Success);
            }

            result = coroutine.Current;

            if (result == BTState.Running)
            {
                return(BTState.Running);
            }
            else
            {
                coroutine = null;
                return(result);
            }
        }
    }
示例#11
0
文件: BT.cs 项目: chickening/TeemoRPG
    public override BTState Update()
    {
        BT selected;

        if (lastContinue != null)
        {
            selected = lastContinue;
        }
        else
        {
            selected = child[UnityEngine.Random.Range(0, childSize - 1)];
        }

        BTState state = selected.Update();

        if (state == BTState.CONTINUE)
        {
            lastContinue = selected;
        }
        else
        {
            lastContinue = null;
        }
        return(state);
    }
示例#12
0
        //public static BTNode<T> CreateNode( T state )
        //{
        //    var t = CreateInstance(typeof( BTNode<T> )) as BTNode<T>;

        //    if( typeof(T).GetCustomAttributes( typeof( StateTitleAttribute ), true ).Length > 0 )
        //    {
        //        t.isCustomState = true;
        //    }
        //    return t;
        //}

        public BTNode(BTState btState)
        {
            this.BtState = btState;
            if (btState.GetType().GetCustomAttributes(typeof(StateTitleAttribute), true).Length > 0)
            {
                isCustomState = true;
            }
        }
示例#13
0
        public static BTAction CreateAction(Type type, BTState parentState)
        {
            BTAction action = XScriptableObject.CreateInstance(type) as BTAction;

            action.Name  = type.Name;
            action.Owner = parentState;
            parentState.totalActions.Add(action);
            AddActionToState(parentState, action);
            return(action);
        }
示例#14
0
    public override void OnEnter()
    {
        base.OnEnter();

        if (targetState != null)
        {
            targetState = Fsm.FindState(targetState);
        }

        targetState.Priority += Increment;
    }
示例#15
0
 public BTNode FindBTNode(BTState currNode)
 {
     for (int i = 0; i < totalNode.Count; i++)
     {
         if (totalNode[i].BtState == currNode)
         {
             return(totalNode[i]);
         }
     }
     return(null);
 }
示例#16
0
 public static BTState Invert(this BTState state)
 {
     if (state == BTState.Fail)
     {
         return(BTState.Completed);
     }
     if (state == BTState.Completed)
     {
         return(BTState.Fail);
     }
     return(state);
 }
示例#17
0
文件: BT.cs 项目: chickening/TeemoRPG
 public override BTState Update()
 {
     lastState = BTState.FAILURE; //처음에 끝나는거 방지
     if (condition())
     {
         lastState = child.Update();
         return(BTState.CONTINUE);
     }
     else
     {
         return(lastState);
     }
 }
示例#18
0
    public sealed override BTState Tick(BTState overrideState)
    {
        for (int i = this.children.Count - 1; i >= 0; i--)
        {
            this.index      = this.remaining[i];
            this.childState = this.children[this.index].Tick();

            switch (this.childState)
            {
            case BTState.Success:
                this.numberOfSuccess++;
                this.remaining.Remove(this.index);
                if (this.remaining.Count == 0)
                {
                    if (this.numberOfSuccess == this.children.Count)
                    {
                        return(BTState.Success);
                    }
                    else
                    {
                        return(BTState.Failure);
                    }
                }
                break;

            case BTState.Failure:
                this.remaining.Remove(this.index);
                if (this.remaining.Count == 0)
                {
                    if (this.numberOfSuccess == this.children.Count)
                    {
                        return(BTState.Success);
                    }
                    else
                    {
                        return(BTState.Failure);
                    }
                }
                break;

            case BTState.Running:
                break;

            default:
                return(BTState.Failure);
            }
        }

        this.bt.currentRunningNode = this;
        return(BTState.Running);
    }
        private BTState Invert(BTState state)
        {
            switch (state)
            {
            case BTState.Failure:
                return(BTState.Success);

            case BTState.Success:
                return(BTState.Failure);

            default:
                return(BTState.Running);
            }
        }
示例#20
0
        void AddCustomState(object obj)
        {
            var para     = obj as string;
            var type     = Type.GetType(para);
            var newState = BTState.Create(currFsm, type);

            newState.Name = type.Name;
            var newNode = BTEditorWindow.instance.AddNewBTNode(newState);

            newState.OnCreate();
            newNode.SetPosition(BTEditorWindow.instance.GetMousePosition());
            EditorUtility.SetDirty(currFsm);
            AddStateToFsm(currFsm, newState);
        }
示例#21
0
        public static void AddActionToState(BTState Owner, BTAction action)
        {
            var Fsm = Owner.Owner;

            if (BTEditorWindow.HasPrefab(Fsm))
            {
                if (Fsm.template == null)
                {
                    AddTemplateToFsm(Fsm);
                    Fsm.template.startEvent = Fsm.startEvent;
                    Fsm.template.totalEvent = Fsm.totalEvent;
                }
                BTEditorWindow.AddObjectToAsset(action, Owner);
            }
            EditorUtility.SetDirty(Fsm);
        }
示例#22
0
文件: BT.cs 项目: chickening/TeemoRPG
 public override BTState Update()
 {
     for (int i = 0; i < childSize; i++)
     {
         BTState state = child[i].Update();
         if (state == BTState.SUCCESS)
         {
             continue;
         }
         else
         {
             return(state);
         }
     }
     return(BTState.FAILURE);
 }
示例#23
0
文件: BT.cs 项目: chickening/TeemoRPG
    public override BTState Update()
    {
        BTState state = BTState.FAILURE;

        if (isFinish && UnityEngine.Random.Range(0f, 1f) <= probability)
        {
            isFinish = false;
        }
        if (!isFinish)
        {
            state = child.Update();
            if (state != BTState.CONTINUE)
            {
                isFinish = true;
            }
        }
        return(state);
    }
示例#24
0
        public static void AddActionToState(BTState Owner, BTAction action)
        {
            var Fsm = Owner.Owner;

            if (BTEditorWindow.HasPrefab(Fsm))
            {
                if (Fsm.template == null)
                {
                    Fsm.template = XScriptableObject.CreateInstance <BTTemplate> ();
                    BTEditorWindow.AddObjectToAsset(Fsm.template, Fsm.gameObject);
                    EditorUtility.SetDirty(Fsm);
                    Fsm.template.startEvent = Fsm.startEvent;
                    Fsm.template.totalEvent = Fsm.totalEvent;
                }
                BTEditorWindow.AddObjectToAsset(action, Owner);
            }
            EditorUtility.SetDirty(Fsm);
        }
示例#25
0
    public sealed override BTState Tick(BTState overrideState)
    {
        switch (this.CheckCondition())
        {
        case BTState.Success:
            break;

        case BTState.Failure:
            return(BTState.Failure);

        case BTState.Running:
            return(BTState.Running);
        }

        this.childState = (overrideState == BTState.None) ? this.children[this.activeChild].Tick() : overrideState;

        switch (this.childState)
        {
        case BTState.Success:
            this.activeChild++;
            if (this.activeChild == this.children.Count)
            {
                this.activeChild = 0;
                return(BTState.Success);
            }
            else
            {
                this.bt.currentRunningNode = this;
                return(BTState.Running);
            }

        case BTState.Running:
            this.bt.currentRunningNode = this.children[this.activeChild];
            return(BTState.Running);

        case BTState.Failure:
            this.activeChild = 0;
            return(BTState.Failure);

        default:
            return(BTState.Failure);
        }
    }
        public void Tick(float deltaTime)
        {
            if (!isRunning)
            {
                return;
            }

            BTState ret = NodeBase.TickNode(root, deltaTime);

            if (ret != BTState.Running)
            {
                isRunning = false;

                if (OnBehaviorTreeCompleted != null)
                {
                    OnBehaviorTreeCompleted.Invoke(this, ret);
                }
            }

            logger.Debug("tree ret = " + ret);
        }
示例#27
0
        public Mapper(BTState child, bool trueValue, bool falseValue)
        {
            f_childState = child;

            if (trueValue)
            {
                f_trueValue = BTStateReturn.True;
            }
            else
            {
                f_trueValue = BTStateReturn.False;
            }

            if (falseValue)
            {
                f_falseValue = BTStateReturn.True;
            }
            else
            {
                f_falseValue = BTStateReturn.False;
            }
        }
示例#28
0
 public virtual BTState Tick(BTState overrideState)
 {
     Debug.LogWarning("Should have redefined this 'Tick' !");
     return(BTState.Failure);
 }
示例#29
0
 public BehaviourTree(BTState root)
 {
     f_root = root;
 }
示例#30
0
        public void ClickNone(object obj)
        {
            var para = obj as string;

            switch (para)
            {
            case "NewGlobalEvent":
            {
                var newEvent = BTEvent.Create(currFsm);
                var newState = BTState.Create <BTState>(currFsm);
                newEvent.TargetState = newState;
                newState.GlobalEvent = newEvent;
                BTEditorWindow.instance.AddNewBTNode(newState);
                AddStateToFsm(currFsm, newState);
            }
            break;

            case "NewState":
            {
                var newState = BTState.Create <BTState>(currFsm);
                newState.Name = "NewState";
                var newNode = BTEditorWindow.instance.AddNewBTNode(newState);
                newNode.SetPosition(BTEditorWindow.instance.GetMousePosition());
                EditorUtility.SetDirty(currFsm);
                AddStateToFsm(currFsm, newState);
            }
            break;

            case "PasteState":
            {
                var newState = BTState.Create(currFsm, copyState);
                newState.Name = "NewState";
                newState.OnCreate();
                BTEditorWindow.instance.AddNewBTNode(newState);
                EditorUtility.SetDirty(currFsm);
                AddStateToFsm(currFsm, newState);
                for (int i = 0; i < newState.totalActions.Count; i++)
                {
                    AddActionToState(newState, newState.totalActions[i]);
                }
            }
            break;

            case "CancelEditFsm":
                BTEditorWindow.target = null;
                break;

            default:
            {
                var type = Type.GetType(para);
                if (type.IsSubclassOf(typeof(BTVariable)))
                {
                    var newVariable = CreateVariable(type, currFsm);
                    newVariable.OnCreate();
                    EditorUtility.SetDirty(newVariable);
                    Debug.Log(type.ToString());
                }
            }
            break;
            }
        }