예제 #1
0
    protected override BTRunningStatus DoTick(BTInput input, ref BTOutput output)
    {
        base.DoTick(input, ref output);

        var runningStatus = BTRunningStatus.Finish;

        if (_lastSelectIndex != -1 && _lastSelectIndex != _currentSelectIndex)
        {
            var node = _childNodes[_lastSelectIndex];
            node.Transition(input);
            _lastSelectIndex = _currentSelectIndex;
        }

        if (_lastSelectIndex != -1)
        {
            var node = _childNodes[_lastSelectIndex];
            runningStatus = node.Tick(input, ref output);
            if (runningStatus == BTRunningStatus.Finish)
            {
                _lastSelectIndex = -1;
            }
        }

        return(runningStatus);
    }
예제 #2
0
    protected override BTRunningStatus DoTick(BTInput input, ref BTOutput output)
    {
        base.DoTick(input, ref output);
        var runningStatus = BTRunningStatus.Finish;

        if (_currentNodeIndex == -1)
        {
            _currentNodeIndex = 0;
        }

        var node = _childNodes[_currentNodeIndex];

        runningStatus = node.Tick(input, ref output);
        if (runningStatus == BTRunningStatus.Finish)
        {
            _currentNodeIndex++;
            if (_currentNodeIndex == _childNodes.Count)
            {
                _currentNodeIndex = -1;
            }
            else
            {
                runningStatus = BTRunningStatus.Executing;
            }
        }
        else if (runningStatus == BTRunningStatus.Error)
        {
            _currentNodeIndex = -1;
        }

        return(runningStatus);
    }
예제 #3
0
    protected override BTRunningStatus DoTick(BTInput input, ref BTOutput output)
    {
        BTRunningStatus runningStatus = base.DoTick(input, ref output);

        switch (_status)
        {
        case BTNodeStatus.Ready:
            DoEnter(input);
            _needExit = true;
            _status   = BTNodeStatus.Running;
            SetActiveNode(this);
            break;

        case BTNodeStatus.Running:
            runningStatus = DoExecute(input, ref output);
            SetActiveNode(this);
            if (runningStatus == BTRunningStatus.Finish || runningStatus == BTRunningStatus.Error)
            {
                _status = BTNodeStatus.Finish;
            }
            break;

        case BTNodeStatus.Finish:
            if (_needExit)
            {
                DoExit(input, runningStatus);
            }
            _status   = BTNodeStatus.Ready;
            _needExit = false;
            SetActiveNode(null);
            break;
        }

        return(runningStatus);
    }
예제 #4
0
 public override void Visit(BTInput input, BTOutput output)
 {
     //Debug.Log(string.Format("ActionEventNode status={0}", status));
     if (status == BehaviourStatus.Ready)
     {
         status = BehaviourStatus.Running;
         output.leafNode = this;
         action(input, output);
     }
 }
예제 #5
0
 public void Tick(BTInput input, ref BTOutput output)
 {
     if (_root.Check(input))
     {
         _root.Tick(input, ref output);
     }
     else
     {
         _root.Transition(input);
     }
 }
예제 #6
0
    protected override BTRunningStatus DoTick(BTInput input, ref BTOutput output)
    {
        base.DoTick(input, ref output);

        var finishChildCount = 0;
        var childCount       = _childNodes.Count;

        for (int i = 0; i < childCount; i++)
        {
            var node = _childNodes[i];
            if (_finishCondition == BTParallelFinishCondition.OR)
            {
                if (_childNodesStatus[i] == BTRunningStatus.Executing)
                {
                    _childNodesStatus[i] = node.Tick(input, ref output);
                }
                else
                {
                    RestChildNodeStatus();
                    return(BTRunningStatus.Finish);
                }
            }
            else  /* if (_finishCondition == BTParallelFinishCondition.AND)*/
            {
                if (_childNodesStatus[i] == BTRunningStatus.Executing)
                {
                    _childNodesStatus[i] = node.Tick(input, ref output);
                }
                else
                {
                    finishChildCount++;
                }
            }
        }

        if (finishChildCount == _childNodes.Count)
        {
            RestChildNodeStatus();
            return(BTRunningStatus.Finish);
        }

        return(BTRunningStatus.Executing);
    }
예제 #7
0
    public override void Visit(BTInput input, BTOutput output)
    {
        float currTime = Time.unscaledTime;

        if (status != BehaviourStatus.Running)
        {
            wakeTime = currTime + duration+Random.Range(0,variation);
            status = BehaviourStatus.Running;
        }

        if (status == BehaviourStatus.Running)
        {
            if (currTime >= wakeTime)
                status = BehaviourStatus.Success;
        }
    }
예제 #8
0
    public override void Visit(BTInput input, BTOutput output)
    {
        if (children.Count >= 1)
        {
            var child = children[0];
            child.Visit(input, output);

            if (child.status != BehaviourStatus.Failed)
            {
                status = child.status;
            }
            else
            {
                status = BehaviourStatus.Success;
            }
        }
        else
        {
            status = BehaviourStatus.Success;
        }
    }
예제 #9
0
    public override void Visit(BTInput input, BTOutput output)
    {
        if (status != BehaviourStatus.Running)
        {
            this.currIndex = 0;
        }

        int len = this.children.Count;
        while (this.currIndex < len)
        {
            IBehaviourNode child = children[this.currIndex];
            child.Visit(input, output);
            if (child.status == BehaviourStatus.Running)
            {
                this.status = child.status;
                return;
            }
            else if (child.status == BehaviourStatus.Failed)
            {
                this.status = BehaviourStatus.Success;
                return;
            }
            this.currIndex++;
        }

        this.status = BehaviourStatus.Success;
    }
예제 #10
0
    public override void Visit(BTInput input, BTOutput output)
    {
        if (status == BehaviourStatus.Ready)
        {
            int len = this.children.Count - 1;
            this.currIndex = Random.Range(0, len);
            int start = this.currIndex;

            while (true)
            {
                IBehaviourNode child = children[this.currIndex];
                child.Visit(input, output);
                if (child.status != BehaviourStatus.Failed)
                {
                    this.status = child.status;
                    return;
                }
                this.currIndex++;

                if (this.currIndex == len)
                    this.currIndex = 0;

                if (this.currIndex == start)
                {
                    this.status = BehaviourStatus.Failed;
                    return;
                }
            }
        }
        else
        {
            IBehaviourNode child = children[this.currIndex];
            child.Visit(input, output);
            this.status = child.status;
        }
    }
예제 #11
0
    public override void Visit(BTInput input, BTOutput output)
    {
        bool done = true;
        foreach (IBehaviourNode child in children)
        {
            if (children is ConditionNode)
            {
                child.Reset();
            }

            child.Visit(input, output);

            if (child.status == BehaviourStatus.Running)
                done = false;
            else if (child.status == BehaviourStatus.Success)
            {
                status = child.status;
                return;
            }
        }

        if (!done)
            this.status = BehaviourStatus.Running;
        else
            this.status = BehaviourStatus.Failed;
    }
예제 #12
0
 public override void Visit(BTInput input, BTOutput output)
 {
     this.status = BehaviourStatus.Success;
     output.leafNode = this;
     action(input, output);
 }
예제 #13
0
 protected virtual BTRunningStatus DoExecute(BTInput _input, ref BTOutput _output)
 {
     return(BTRunningStatus.Finish);
 }
예제 #14
0
    public override void Visit(BTInput input, BTOutput output)
    {
        Actor actor = input.actor;
        object data = output.eventData;

        if (data != null)
        {
            //Debug.Log("触发事件" + actor + "=>" + (BrainEventEnum)eventType + " data= " + data);
            //actor.brain.DispatchEvent(eventType, data);
            status = BehaviourStatus.Success;
        }
        else
        {
            status = BehaviourStatus.Failed;
        }
    }
예제 #15
0
    public override void Visit(BTInput input, BTOutput output)
    {
        if (status == BehaviourStatus.Ready && !isInit)
        {
            isInit = true;
            //Debug.Log(string.Format("AddEventHandler {0} status ={1} ,actor ={2} ", this.name + (BrainEventEnum)eventType, status, input.actor));
            //input.actor.brain.AddEventHandler(eventType, OnEvent);
        }

        if (status == BehaviourStatus.Ready && triggered)
        {
            triggered = false;
            status = BehaviourStatus.Running;
            //Debug.Log(string.Format("BeginRunning  EventNode {0} data {1} status ={2}", this.name + (BrainEventEnum)eventType, data, status));
        }
        //Debug.Log(string.Format("Visit  EventNode {0} data {1} status ={2} triggered ={3}", this.name + (BrainEventEnum)eventType, data, status, triggered));

        if (status == BehaviourStatus.Running)
        {
            if (children.Count >= 1)
            {
                BTOutput oup = output;
                oup.eventData = data;
                var child = children[0];
                child.Visit(input, output);
                status = child.status;
                oup.eventData = null;
                //if (status != BehaviourStatus.Running)
                //{
                //Debug.Log(string.Format(" EventNode {0} Complete {1} ", this.name, status));
                //MyDebug.StackTrace();
                //}
            }
            else
            {
                status = BehaviourStatus.Failed;
            }
        }
    }
예제 #16
0
    public override void Visit(BTInput input, BTOutput output)
    {
        output.leafNode = this;

        if (_condition != null)
        {
            if (_condition(input, output))
            {
                this._status = BehaviourStatus.Success;
            }
            else
            {
                this._status = BehaviourStatus.Running;
            }
        }
        else if (_fn != null)
        {
            object[] res = (object[])_fn.call(input, output);
            if (res!=null && res.Length > 0 && res[0].Equals(true))
            {
                this._status = BehaviourStatus.Success;
            }
            else
            {
                this._status = BehaviourStatus.Running;
            }
        }
        else
        {
            this._status = BehaviourStatus.Failed;
        }
    }
예제 #17
0
 public override void Visit(BTInput input, BTOutput output)
 {
     float dt = Time.unscaledTime - lastTime; //Debug.Log(string.Format("DeltaConditionNode doit={0} ,dt={1}", dt > delta, dt));
     if (dt > delta)
     {
         output.leafNode = this;
         base.Visit(input, output);
         lastTime = Time.unscaledTime;
     }
     else
     {
         this.status = BehaviourStatus.Failed;
     }
 }
예제 #18
0
    public override void Visit(BTInput input, BTOutput output)
    {
        var child = this.children[0];
        child.Visit(input, output);

        if (child.status == BehaviourStatus.Success)
            status = BehaviourStatus.Failed;
        else if (child.status == BehaviourStatus.Failed)
            status = BehaviourStatus.Success;
        else
            status = child.status;
    }
예제 #19
0
파일: Brain.cs 프로젝트: zhaoluxyz/Hugula
 /// <summary>
 /// 开始
 /// </summary>
 internal void Start()
 {
     OnStart();
     isInit = true;
     _input = actor.input;
     _output = actor.output;
 }
예제 #20
0
 public override void Visit(BTInput input, BTOutput output)
 {
     float dt = Time.unscaledTime - lastTime;
     if (dt > delta)
     {
         base.Visit(input, output);
         lastTime = Time.unscaledTime;
     }
     else
     {
         this.status = BehaviourStatus.Success;
     }
 }
예제 #21
0
파일: Actor.cs 프로젝트: zhaoluxyz/Hugula
 void Awake()
 {
     this.input = new BTInput(this);
     this.output = new BTOutput(this);
 }
예제 #22
0
    public override void Visit(BTInput input, BTOutput output)
    {
        if (status != BehaviourStatus.Running)
        {
            this.currIndex = 0;
            this.rep = 0;
        }

        int len = this.children.Count;
        while (this.currIndex < len)
        {
            IBehaviourNode child = children[this.currIndex];
            child.Visit(input, output);
            //Debug.Log(string.Format("LoopNode {0},count ={1}rep={2} status={3} child.name ={4} child.status={5}", name, count, rep, status, child.name, child.status));

            if (child.status == BehaviourStatus.Running || child.status == BehaviourStatus.Failed)
            {
                this.status = child.status;
                return;
            }
            else
            {
                this.status = BehaviourStatus.Running;
            }
            this.currIndex++;
        }

        if (currIndex >= len) //从头开始
        {
            currIndex = 0;//从头开始
            rep++;
        }

        if (rep > count && count>0)
        {
            this.status = BehaviourStatus.Success;
        }
        //else
        //{
        //    foreach (var child in children)
        //        child.Reset();
        //}
    }
예제 #23
0
    public override void Visit(BTInput input, BTOutput output)
    {
        bool done = true;
        bool any_done = false;
        foreach (IBehaviourNode child in children)
        {
            if (children is ConditionNode)
            {
                child.Reset();
            }

            if (child.status != BehaviourStatus.Success)
            {
                child.Visit(input, output);
                if (child.status == BehaviourStatus.Failed)
                {
                    this.status = BehaviourStatus.Failed;
                    return;
                }
            }

            if (child.status == BehaviourStatus.Running)
                done = false;
            else
                any_done = true;

        }

        if (done || (stopOnAnyComplete && any_done))
            this.status = BehaviourStatus.Success;
        else
            this.status = BehaviourStatus.Running;
    }