Пример #1
0
    IEnumerator PatrolState()
    {
        currentBehaviour       = BehaviourState.Patrol;
        agent.autoBraking      = false;
        agent.stoppingDistance = 0;
        agent.speed            = 2;
        agent.angularSpeed     = 200;
        GotoNextPoint();
        thiefAnim.SetFloat("Speed_f", agent.speed);
        while (currentBehaviour == BehaviourState.Patrol)
        {
            if (!agent.pathPending && agent.remainingDistance < 0.1f)
            {
                if (points[prevPoint].CompareTag("WindowPoint"))
                {
                    currentCoroutine = StartCoroutine(SpyState());
                }

                else
                {
                    GotoNextPoint();
                }
            }

            yield return(new WaitForEndOfFrame());
        }
    }
Пример #2
0
    public virtual TaskStatus Behave(BehaviourState state)
    {
        TaskStatus status = OnBehave(state);

        if (debug && !debugTypeBlacklist.Contains(GetType().Name))
        {
            string result = "Unknown";
            switch (status)
            {
            case TaskStatus.SUCCESS:
                result = "success";
                break;

            case TaskStatus.FAILURE:
                result = "failure";
                break;

            case TaskStatus.RUNNING:
                result = "running";
                break;
            }
            Debug.Log("Behaving: " + GetType().Name + " - " + result);
        }
        ticks++;
        starting = false;

        if (status != TaskStatus.RUNNING)
        {
            Reset();
        }


        return(status);
    }
Пример #3
0
    public override NodeStatus OnBehave(BehaviourState state)
    {
        NodeStatus ret = children[currentChild].Behave(state);

        switch (ret)
        {
        case NodeStatus.SUCCESS:
            currentChild++;
            break;

        case NodeStatus.FAILURE:
            return(NodeStatus.FAILURE);
        }

        if (currentChild >= children.Count)
        {
            return(NodeStatus.SUCCESS);
        }
        else if (ret == NodeStatus.SUCCESS)
        {
            // if we succeeded, don't wait for the next tick to process the next child
            return(OnBehave(state));
        }

        return(NodeStatus.RUNNING);
    }
    /// <summary>
    /// This method places new _States inside the FSM,
    /// or prints an ERROR message if the state was already inside the List.
    /// First state added is also the initial state.
    /// </summary>
    public void AddState(BehaviourState s)
    {
        if (s == null)
        {
            Debug.LogError("FSM ERROR: Null reference is not allowed");
        }

        // First State inserted is also the Initial state,
        // the state the machine is in when the simulation begins
        if (_States.Count == 0)
        {
            _States.Add(s);
            _CurState   = s;
            _CurStateID = s.ID;
            _CurState.OnEnter();
            return;
        }

        // Add the state to the List if it's not inside it
        foreach (BehaviourState state in _States)
        {
            if (state.ID == s.ID)
            {
                Debug.LogError("FSM ERROR: Impossible to add state " + s.ID.ToString() +
                               " because state has already been added");
                return;
            }
        }
        _States.Add(s);
    }
    void MoveForward()
    {
        RaycastHit target;

        if (Physics.Raycast(transform.position, raycastDirection, 1f, wallLayer) && EnemyType != EnemyClass.Swarm)
        {
            raycastCheck = 10;
            isMoving     = false;
        }

        if (Physics.Raycast(transform.position, raycastDirection, out target, 2.0f, enemyLayer) && EnemyType != EnemyClass.Phantom)
        {
            if (target.collider.GetComponent <EnemyAIScript>().EnemyType != EnemyClass.Swarm && EnemyType != EnemyClass.Phantom)
            {
                PrevBehaviour = BehaveState;
                BehaveState   = BehaviourState.Bumped;
            }
        }
        else if (Physics.Raycast(transform.position + raycastDirection / 2, Vector3.down, raycastDistance, floorLayer) ||
                 Physics.Raycast(transform.position + raycastDirection, Vector3.down, raycastDistance, floorLayer))
        {
            transform.Translate(Vector3.forward * speed * Time.deltaTime);

            if (targetPos != null)
            {
                CheckSides();
            }
        }
        else
        {
            raycastCheck = 1;
            isMoving     = false;
        }
    }
    public virtual NodeStatus Update(BehaviourState State)
    {
        NodeStatus ret = OnUpdate(State);

        if (debug && !debugTypeBlacklist.Contains(GetType().Name))
        {
            string result = "Unknown";
            switch (ret)
            {
            case NodeStatus.SUCCESS:
                result = "Success";
                break;

            case NodeStatus.FAILURE:
                result = "Failure";
                break;

            case NodeStatus.RUNNING:
                result = "Running";
                break;
            }
            Debug.Log("Behaving: " + GetType().Name + " - " + result);
        }

        ticks++;
        starting = false;
        if (ret != NodeStatus.RUNNING)
        {
            Reset();
        }

        return(ret);
    }
Пример #7
0
    public override TaskStatus OnBehave(BehaviourState state)
    {
        TaskStatus status = children[currentChild].Behave(state);

        switch (status)
        {
        case TaskStatus.SUCCESS:
            currentChild++;
            break;

        case TaskStatus.FAILURE:
            return(TaskStatus.FAILURE);
        }

        if (currentChild >= children.Count)
        {
            return(TaskStatus.SUCCESS);
        }
        else if (status == TaskStatus.SUCCESS)
        {
            return(OnBehave(state));
        }

        return(TaskStatus.RUNNING);
    }
Пример #8
0
    void Update()
    {
        xAxis += 1f * Time.deltaTime;
        yAxis += 1f * Time.deltaTime;

        if (PlayerShootLaser.bCanShoot &&
            Input.GetKey(Shoot) &&
            Camera.main.GetComponent <PlayerShootLaser> ().fShootTimer <= 0)
        {
            CurrentState = BehaviourState.Shooting;
            gunModel.transform.localPosition = ModelOrigin;
        }

        if (CurrentState == BehaviourState.Shooting)
        {
            gunModel.transform.Translate(new Vector3(0, 0, -0.1f), Space.Self);

            if (gunModel.transform.localPosition.z < -0.4f)
            {
                CurrentState = BehaviourState.Recharging;
            }
        }
        else if (CurrentState == BehaviourState.Recharging)
        {
            gunModel.transform.Translate(new Vector3(0, 0, 0.05f), Space.Self);

            if (gunModel.transform.localPosition.z >= 0)
            {
                CurrentState = BehaviourState.Other;
            }
        }
        else if (moveScript.bHasJumped)
        {
            fGunSineChange.z = ModelOrigin.z;

            fGunSineChange.x = ModelOrigin.x + Mathf.Sin(Time.realtimeSinceStartup * 0.1f) * 0.06f;
            fGunSineChange.y = ModelOrigin.y + Mathf.Sin(Time.realtimeSinceStartup * 0.1f) * 0.04f;

            gunModel.transform.localPosition = fGunSineChange;
        }
        else if (moveScript.CurrSpeed.magnitude > 0f)
        {
            fGunSineChange.z = ModelOrigin.z + Mathf.Sin(Time.realtimeSinceStartup * Mathf.Abs(moveScript.CurrSpeed.y * 0.5f)) * 0.1f;
            fGunSineChange.x = ModelOrigin.x + Mathf.Sin(Time.realtimeSinceStartup * Mathf.Abs(moveScript.CurrSpeed.x * 0.4f)) * 0.04f;
            fGunSineChange.y = ModelOrigin.y + Mathf.Sin(Time.realtimeSinceStartup * 0.2f) * 0.04f;

            gunModel.transform.localPosition = fGunSineChange;
        }
        else
        {
            fGunSineChange.x = ModelOrigin.x;
            fGunSineChange.z = ModelOrigin.z;

            fGunSineChange.y = ModelOrigin.y + Mathf.Sin(Time.realtimeSinceStartup * 0.2f) * 0.04f;

            gunModel.transform.localPosition = fGunSineChange;
        }

        transform.eulerAngles = new Vector3(parentObj.transform.eulerAngles.x + Mathf.Sin(xAxis) * 2, transform.eulerAngles.y + ((Input.GetAxis("Vertical") != 0) ? Mathf.Sin(0) * 0.5f : Mathf.Sin(0) * 0.02f), transform.eulerAngles.z);
    }
Пример #9
0
    public virtual BehaviourState Update()
    {
        IBehaviour newBehaviour = Evaluate();

        if (newBehaviour == null)
        {
            lastState = BehaviourState.Completed;
            return(BehaviourState.Completed);
        }
        else
        {
            if (newBehaviour != lastBehaviour)
            {
                lastBehaviour.End();
                lastBehaviour = newBehaviour;
                return(newBehaviour.Start());
            }
            else
            {
                lastBehaviour = newBehaviour;
                BehaviourState state = newBehaviour.Update();
                if (state == BehaviourState.Completed)
                {
                    newBehaviour.End();
                }
                lastState = state;
                return(state);
            }
        }
    }
Пример #10
0
        public override BehaviourState UpdateNodeBehaviour()
        {
            for (int i = m_SequenceLocation; i < m_ChildNodes.Count; i++)
            {
                if (!m_ChildNodes[i].FirstCallActivated)
                {
                    m_ChildNodes[i].OnFirstTreeCall();
                }

                BehaviourState nodeState = m_ChildNodes[i].UpdateNodeBehaviour();

                switch (nodeState)
                {
                //if the nodeState has failed it means the node and therefore the sequence have failed
                case BehaviourState.Failed:
                    Reset();
                    return(BehaviourState.Failed);

                //if the nodeState has succeeded then we move to the next node in the seqeuence
                case BehaviourState.Succeed:
                    continue;

                //in the situation were the node is running then that means that there is still more to do in the sequence.
                //we need to remember the index of the current child node in the sequence so we may continue from the node and then return running.
                case BehaviourState.Running:
                    m_SequenceLocation = i;
                    return(BehaviourState.Running);
                }
            }

            //if we exit to this location it means that the sequence is finished and has succeeded
            Reset();
            return(BehaviourState.Succeed);
        }
Пример #11
0
    private void MakeDeciscion()
    {
        bool inRangeToAttack = Vector3.Distance(_agent.Target.transform.position, transform.position) < _attackDist;

        _curState = (BehaviourState)Random.Range(1, 3 + (inRangeToAttack ? 1 : 0));
        switch (_curState)
        {
        case BehaviourState.WANDER:
            StartCoroutine(StartWander());
            break;

        case BehaviourState.APPROACH:
            StartCoroutine(StartApproach());

            break;

        case BehaviourState.ATTACK:
            StartCoroutine(StartAttack());

            break;

        default:
            break;
        }
    }
Пример #12
0
 public override void Stun()
 {
     StopAllCoroutines();
     _agent.MovementSpeed = 0;
     _curState            = BehaviourState.HITLOCK;
     _sprite.color        = Color.white;
 }
Пример #13
0
 void Start()
 {
     base.Start();
     behaviour   = BehaviourState.PATROL;
     facingRight = false;
     savedAccel  = acceleration;
 }
Пример #14
0
    public virtual BehaviourStatus Behave(BehaviourState state)
    {
        BehaviourStatus currentState = OnBehave(state);

        if (debug && !debugTypeBlacklist.Contains(GetType().Name))
        {
            string result = "N/A";
            switch (currentState)
            {
            case BehaviourStatus.SUCCESS:
                result = "success";
                break;

            case BehaviourStatus.FAILURE:
                result = "failure";
                break;

            case BehaviourStatus.RUNNING:
                result = "running";
                break;
            }

            Debug.Log("Behaving: " + GetType().Name + " - " + result);
        }

        ticks++;
        starting = false;

        if (currentState != BehaviourStatus.RUNNING)
        {
            Reset();
        }

        return(currentState);
    }
    public override NodeStatus OnBehave(BehaviourState state)
    {
        Context context = (Context)state;

        Living[] livingObjects = context.me.players.GetComponentsInChildren <Living>();
        Array.Sort(livingObjects, delegate(Living l1, Living l2)
        {
            float d1 = context.me.DistanceTo(l1.transform.position);
            float d2 = context.me.DistanceTo(l2.transform.position);

            return(d1.CompareTo(d2));
        });

        foreach (Living l in livingObjects)
        {
            if (l.gameObject != context.me.gameObject)
            {
                if (context.me.DistanceTo(l.gameObject.transform.position) > distanceThreshold)
                {
                    context.enemy = null;
                    return(NodeStatus.FAILURE);
                }

                context.enemy = l;
                return(NodeStatus.SUCCESS);
            }
        }
        context.enemy = null;
        return(NodeStatus.FAILURE);
    }
Пример #16
0
    public override BehaviourStatus OnBehave(BehaviourState state)
    {
        BehaviourContext enemyContext = (BehaviourContext)state;

        if (!enemyContext.enemyInRange(0.5f))
        {
            if (enemyContext.enemyAnimation.GetCurrentAnimatorStateInfo(0).IsName("attack"))
            {
                enemyContext.enemyAnimation.Play("walk");
            }
            return(BehaviourStatus.FAILURE);
        }

        if (GameObject.FindGameObjectWithTag("Player") != null)
        {
            playerPosition = GameObject.FindGameObjectWithTag("Player").transform.position;
        }
        else
        {
            return(BehaviourStatus.SUCCESS);
        }

        enemyContext.enemyPhysics.enemyRotation(playerPosition);
        if (enemyContext.enemyAnimation.GetCurrentAnimatorStateInfo(0).IsName("idle") ||
            enemyContext.enemyAnimation.GetCurrentAnimatorStateInfo(0).IsName("walk"))
        {
            enemyContext.enemyAnimation.Play("attack");
        }
        enemyContext.enemyPhysics.enemyMovement(playerPosition, angle);

        return(BehaviourStatus.RUNNING);
    }
Пример #17
0
 public void ActivateCaughtMode()
 {
     Debug.Log("CAUGHT MODE ACTIVATED");
     BehaviourState = BehaviourState.Caught;
     Speed         *= 3;
     timer.Stop();
 }
Пример #18
0
 // Start is called before the first frame update
 void Start()
 {
     currentState = BehaviourState.Offense;
     towerManager = GameObject.Find("TowerManager").GetComponent <TowerManager>();
     target       = GameObject.Find("Red Tower").transform.position;
     unitCount    = GameObject.Find("MapManager").GetComponent <UnitCount>();
 }
Пример #19
0
        public override NodeStates OnBehave(BehaviourState state)
        {
            var retVal = Children[m_currentChild].Behave(state);

            switch (retVal)
            {
            case NodeStates.Success:
                m_currentChild++;
                break;

            case NodeStates.Failure:
                return(NodeStates.Failure);
            }

            if (m_currentChild >= Children.Count)
            {
                return(NodeStates.Success);
            }

            if (retVal == NodeStates.Success)
            {
                return(OnBehave(state));
            }

            return(NodeStates.Running);
        }
Пример #20
0
    public override NodeStatus OnBehave(BehaviourState state)
    {
        Context context = (Context)state;

        context.moveTarget = new Vector3(UnityEngine.Random.Range(-1024, 1024), 0, UnityEngine.Random.Range(-1024, 1024));
        return(NodeStatus.SUCCESS);
    }
Пример #21
0
        public RabbitModel(GameObject prefab, RabbitData rabbitData)
        {
            if (prefab.GetComponent <Rigidbody>() != null)
            {
                RabbitData          = rabbitData;
                RabbitStruct        = rabbitData.RabbitStruct;
                RabbitTransform     = prefab.transform;
                RabbitRigidbody     = prefab.GetComponent <Rigidbody>();
                RabbitStartPosition = prefab.transform.position;
                _currentHealth      = RabbitStruct.MaxHealth;
                _nextCoord          = rabbitData.RandomNextCoord(prefab.transform, RabbitStartPosition);
                if (RabbitStruct.CanIdle)
                {
                    _rabbitState = BehaviourState.Idling;
                }
                else
                {
                    _rabbitState = BehaviourState.Roaming;
                }

                _physicsService = Services.SharedInstance.PhysicsService;
            }
            else
            {
                Debug.LogError("Invalid Rabbit prefab: no Rigidbody");
            }
        }
Пример #22
0
    IEnumerator IdleState(GameObject target)
    {
        currentBehaviour = BehaviourState.Idle;
        thiefAnim.SetFloat("Speed_f", 0);
        currentTarget  = player.position;
        distanceTarget = agent.remainingDistance;
        agent.SetDestination(currentTarget);
        float elapsedTime = 0;

        while (distanceTarget <= agent.stoppingDistance && currentBehaviour == BehaviourState.Idle)
        {
            currentTarget = target.transform.position;
            agent.SetDestination(currentTarget);
            distanceTarget = agent.remainingDistance;
            elapsedTime   += Time.deltaTime;
            if (elapsedTime >= 1)
            {
                StartCoroutine(EscapeState(target));
                StopCoroutine(currentCoroutine);
            }

            yield return(null);
        }

        currentCoroutine = StartCoroutine(RunState(target));
    }
    public override NodeStatus OnBehave(BehaviourState state)
    {
        Context context = (Context)state;

        Heal[] heals = context.me.dynamicEntities.GetComponentsInChildren <Heal>();

        if (heals.Length == 0)
        {
            context.moveTarget = null;
            return(NodeStatus.FAILURE);
        }

        Array.Sort(heals, delegate(Heal h1, Heal h2)
        {
            float d1 = context.me.DistanceTo(h1.transform.position);
            float d2 = context.me.DistanceTo(h2.transform.position);

            return(d1.CompareTo(d2));
        });

        if (context.me.DistanceTo(heals[0].transform.position) > distanceThreshold)
        {
            return(NodeStatus.FAILURE);
        }

        context.moveTarget = heals[0].transform.position;
        return(NodeStatus.SUCCESS);
    }
Пример #24
0
        public override BehaviourState UpdateNodeBehaviour()
        {
            for (int i = m_SelectorIndex; i < m_ChildNodes.Count; i++)
            {
                if (!m_ChildNodes[i].FirstCallActivated)
                {
                    m_ChildNodes[i].OnFirstTreeCall();
                }

                BehaviourState nodeState = m_ChildNodes[i].UpdateNodeBehaviour();

                switch (nodeState)
                {
                case BehaviourState.Failed:
                    continue;

                case BehaviourState.Succeed:
                    Reset();
                    return(BehaviourState.Succeed);

                case BehaviourState.Running:
                    m_SelectorIndex = i;
                    return(BehaviourState.Running);
                }
            }

            Reset();
            return(BehaviourState.Failed);
        }
Пример #25
0
 void Timer()
 {
     if (xMovement > 0)
     {
         xMovement = 0.04f;
     }
     else if (xMovement < 0)
     {
         xMovement = -0.04f;
     }
     tick += Time.deltaTime;
     if (tick >= 1)
     {
         rnd = Random.Range(0, 6);
         if (rnd >= 4)
         {
             xMovement = -xMovement;
         }
         if (rnd == 2)
         {
             currentState = BehaviourState.idle;
         }
         tick = 0;
     }
 }
Пример #26
0
    IEnumerator DeathState()
    {
        alarmController.alarmOn = false;
        soundScript.Death();
        currentBehaviour = BehaviourState.Die;
        GetComponent <NavMeshAgent>().enabled = false;
        GetComponent <Collider>().enabled     = false;
        thiefAnim.SetBool("Death_b", true);
        foreach (GameObject obj in stolenObject)
        {
            obj.transform.position = spawnPos.position;
            obj.transform.parent   = null;
            obj.GetComponent <Collider>().enabled = true;
            //Rigidbody rb = obj.GetComponent<Rigidbody>();
            //print(rb);
            //rb.AddExplosionForce(3, spawnPos.position, 0.5f, 3f);
        }
        stolenObject.Clear();
        yield return(new WaitForSeconds(10));

        thiefAnim.SetBool("Death_b", false);
        yield return(null);

        yield return(new WaitForSeconds(thiefAnim.GetCurrentAnimatorClipInfo(0).Length));

        GetComponent <NavMeshAgent>().enabled = true;
        StartCoroutine(EscapeState(null));
    }
Пример #27
0
        public override BehaviourState UpdateNodeBehaviour()
        {
            for (int i = m_SelectorIndex; i < m_ChildNodes.Count; i++)
            {
                if (!m_ChildNodes[i].FirstCallActivated)
                {
                    m_ChildNodes[i].OnFirstTreeCall();
                }

                BehaviourState nodeState = m_ChildNodes[i].UpdateNodeBehaviour();

                switch (nodeState)
                {
                //if the current child node has failed then we must move onto and try the next node
                case BehaviourState.Failed:
                    continue;

                //if the current child node has been successful then we return succeed
                case BehaviourState.Succeed:
                    Reset();
                    return(BehaviourState.Succeed);

                //in the case that the child node in the selector is running we save that index so that next time we search through we start at the running index
                case BehaviourState.Running:
                    m_SelectorIndex = i;
                    return(BehaviourState.Running);
                }
            }

            //if we escape the loop that means that no successful node to act upon was found and therefore the selector node has failed
            Reset();
            return(BehaviourState.Failed);
        }
Пример #28
0
    public override NodeStatus OnBehave(BehaviourState state)
    {
        Context context = (Context)state;

        context.me.StopMoving();
        return(NodeStatus.SUCCESS);
    }
Пример #29
0
 void Timer()
 {
     tick += Time.deltaTime;
     if (tick >= tickCount)
     {
         rnd = Random.Range(0, maxRange);
         if (rnd == 0)
         {
             if (PlayerBody.tag == "Unstealthed" && PlayerTransform.position.x > transform.position.x + 8 || PlayerBody.tag == "Unstealthed" && PlayerTransform.position.x < transform.position.x - 8)
             {
                 currentstate = BehaviourState.jumping;
                 maxRange     = 6;
             }
             else if (PlayerBody.tag == "Stealthed")
             {
                 currentstate = BehaviourState.jumping;
                 maxRange     = 6;
             }
             else if (PlayerBody.tag == "Unstealthed" && PlayerTransform.position.x < transform.position.x + 8 || PlayerTransform.position.x > transform.position.x - 8)
             {
                 currentstate = BehaviourState.encouraged;
                 maxRange     = 6;
             }
         }
         else if (rnd > 0 && rnd < 4)
         {
             maxRange--;
         }
         else if (rnd == 4 || rnd == 5)
         {
             currentstate = BehaviourState.idle;
         }
         tick = 0;
     }
 }
Пример #30
0
        public override void Update(float deltaTime)
        {
            MeshObject.Rotation += deltaTime * (float)Math.PI * 0.3f;

            behaviourCheckTime -= deltaTime;
            if (behaviourCheckTime < 0f)
            {
                behaviourCheckTime = 0.2f;
                behaviourState     = StateCheck();
            }

            Vector3 towardsTarget = Vector3.Normalize(targetPosition - Position);

            if (behaviourState == BehaviourState.Chasing || behaviourState == BehaviourState.Searching)
            {
                float magnitude = Math.Min(deltaTime * Speed, PlayerStats.thickness + HitRadius);
                Position += Scene.SmoothMovement(Position, towardsTarget * magnitude, HitRadius, ObstacleLayerMask.GetMask(ObstacleLayer.Wall));
            }
            if (behaviourState == BehaviourState.Chasing || behaviourState == BehaviourState.Attacking)
            {
                shootTime += deltaTime;
                if (shootTime > ShootSpeed && !Game.PlayerStats.dead)
                {
                    shootTime = 0f;
                    Attack(towardsTarget);
                }
            }
        }
Пример #31
0
    public BehaviourSM(AIController owner)
    {
        this.owner = owner;

        stateStack = new Stack<BehaviourState>();
        baseState = new Behaviour_Idle();
        baseState.EnterState(owner);
        currentState = baseState;
    }
Пример #32
0
    public void GotoNewState(BehaviourState newState, TransitionMode transitionMode)
    {
        BehaviourState oldState = currentState;
        oldState.ExitState(owner);

        #if VERBOSE_AI_STATES
        Debug.Log("AI state change: [" + oldState.GetType().Name + "] --> [" + newState.GetType().Name + "] :: <" + transitionMode + ">");
        #endif

        switch(transitionMode) {
            case TransitionMode.PopPrevious:
                // Go back to the previous state on the stack
                BehaviourState nextState = stateStack.Pop();
                if(nextState != null) {
                    currentState = nextState;
                }
                else {
                    // in case there was no state on the stack, go back to base state
                    currentState = baseState;
                }
                break;
            case TransitionMode.PushCurrent:
                // Pushes the current state onto the stack and goes to the returned next state
                stateStack.Push(currentState);
                currentState = newState;
                if(currentState == null) {
                    // If a null state was added, go back tot eh previous one
                    currentState = stateStack.Pop();
                }
                break;
            case TransitionMode.AbandonCurrent:
                // Go to the new state, without pushing the current one on the stack
                if(newState != null) {
                    currentState = newState;
                }
                break;
        }

        currentState.EnterState(owner);
    }
    //TODO prevent from chasing off of platform boundaries
    void FixedUpdate()
    {
        base.FixedUpdate();

        groundInFront = Physics2D.OverlapCircle(forwardGroundCheck.position,groundCheckRadius,groundLayer);

        acceleration = savedAccel;
        savedAccel = acceleration;

        if((target = getTarget())) {
            behaviour = BehaviourState.CHASE;

        } else {
            behaviour = BehaviourState.PATROL;
        }

        if(behaviour == BehaviourState.PATROL) {
            if(anim != null)
                anim.SetBool("walking",true);
            if(!groundInFront && onGround) {
                patrolDir = -patrolDir;
            }
            travelDir = patrolDir;
        } else if(behaviour == BehaviourState.CHASE) {
            if(anim != null)
                anim.SetBool("walking",true);
            travelDir = (target.position - transform.position).normalized.x;
            if(!groundInFront && onGround) {
                if(anim != null)
                    anim.SetBool("walking",false);
                acceleration = 0;
                //rigidbody2D.velocity = new Vector2(0,rigidbody2D.velocity.y);
            }
        }
        //horizontalPhysicsMovement(travelDir,movementPower);
    }
        // Retrieves next behaviour from fuzzy logic module
        private void DoFuzzyLogic()
        {
            if (Target != null)
            {
                Fuzzifier fuzz = new Fuzzifier(HealthPoints / MaxHealth, (Target as Hero).HealthPoints / (Target as Hero).MaxHealth,
                        (Position - Target.Position).Length() / MAX_DISTANCE);
                BehaviouralState = fuzz.GetBehaviour();

                // release any reserved slot if new behaviour does not require one
                if (BehaviouralState != BehaviourState.MeleeCreep && BehaviouralState != BehaviourState.MeleePursue)
                {
                    if (targetslot >= 0)
                    {
                        Target.releaseSlot(this, targetslot);
                    }
                    GroundTarget = new Vector3();
                }
                // forget the target if the bew behaviour does not require one
                if (BehaviouralState == BehaviourState.Wander)
                {
                    Target = null;
                }
            }
        }
        public Zombie(int health, int maxHealth, ZombieType type, ref Model modelwalk, ref Model modelatt, ref Model modelhurt, ref Model modeldie, Action<Entity, Entity> attackFunction, Func<Vector3, Vector3, PathFinding.Node> astarGetter)
            : base()
        {
            this.astarGetter = astarGetter;
            this.model = modelwalk;
            this.HealthPoints = health;
            this.MaxHealth = maxHealth;

            this.MaxVelocity = 0.04f;
            this.MaxAcceleration = 0.04f;
            if (type == ZombieType.Boss)
            {
                this.MaxVelocity *= 2;
                this.MaxAcceleration *= 2;
                this.modelRadius *= 2;
            }
            ArriveRadius = 1;
            FleeRadius = 30;
            TimeToTarget = 0.070f;
            RotationTimeToTarget = 0.00025f;
            InterpolationSpeed = 10;
            TargetRotation = 0.02f;
            SlowRotationThreshold = (float)Math.PI;
            SlowRadiusThreshold = (float)Math.PI * 3;
            MaxRotationSpeed = (float)Math.PI / 12;
            MaxRotationAcceleration = (float)Math.PI;

            PosState = EntityPositionState.SteeringWander;
            OrState = EntityOrientationState.Face;
            BehaviouralState = BehaviourState.Wander;

            zombieType = type;
            MeleeAttack = new Weapon(WeaponType.ZombieHands);
            RangedAttack = new Weapon(WeaponType.Vomit);
            if (type == ZombieType.Boss)
            {
                MeleeAttack.FirePower *= 2;
                RangedAttack.FirePower *= 2;
            }
            this.AttackFunction = attackFunction;
            lastAttackTime = 0;

            // Look up our custom skinning information. for walking
            skinningDatawalk = (SkinningData)modelwalk.Tag;

            if (skinningDatawalk == null)
                throw new InvalidOperationException
                    ("This model does not contain a SkinningData tag.");

            // Create an animation player, and start decoding an animation clip.
            animationPlayerwalk = new AnimationPlayer(skinningDatawalk);
            clipwalk = skinningDatawalk.AnimationClips["Take 001"];
            animationPlayerwalk.StartClip(clipwalk);

            // Look up our custom skinning information. for dying
            skinningDatadie = (SkinningData)modeldie.Tag;

            if (skinningDatadie == null)
                throw new InvalidOperationException
                    ("This model does not contain a SkinningData tag.");

            // Create an animation player, and start decoding an animation clip.
            animationPlayerdie = new AnimationPlayer(skinningDatadie);
            clipdie = skinningDatadie.AnimationClips["Take 001"];
            animationPlayerdie.StartClip(clipdie);

            // Look up our custom skinning information. for attacking
            skinningDataattack = (SkinningData)modelatt.Tag;

            if (skinningDataattack == null)
                throw new InvalidOperationException
                    ("This model does not contain a SkinningData tag.");

            // Create an animation player, and start decoding an animation clip.
            animationPlayerattack = new AnimationPlayer(skinningDataattack);
            clipattack = skinningDataattack.AnimationClips["Take 001"];
            animationPlayerattack.StartClip(clipattack);

            // Look up our custom skinning information. for hurting
            skinningDatahurt = (SkinningData)modelhurt.Tag;

            if (skinningDatahurt == null)
                throw new InvalidOperationException
                    ("This model does not contain a SkinningData tag.");

            // Create an animation player, and start decoding an animation clip.
            animationPlayerhurt = new AnimationPlayer(skinningDatahurt);
            cliphurt = skinningDatahurt.AnimationClips["Take 001"];
            animationPlayerhurt.StartClip(cliphurt);
        }
Пример #36
0
 public StateResponse(TransitionMode transitionMode, BehaviourState newState = null)
 {
     this.transitionMode = transitionMode;
     this.newState = newState;
 }
Пример #37
0
 public void ResetDefault()
 {
     stateStack.Clear();
     if(currentState != baseState) {
         currentState.ExitState(owner);
     }
     baseState = new Behaviour_Idle();
     baseState.EnterState(owner);
     currentState = baseState;
 }
 void Start()
 {
     base.Start ();
     behaviour = BehaviourState.PATROL;
     facingRight = false;
     savedAccel = acceleration;
 }
Пример #39
0
 /// <summary>
 /// Sets the AI behaviour.
 /// </summary>
 /// <param name='behaviour'>
 /// Behaviour.
 /// </param>
 public void SetBehaviour(BehaviourState behaviour)
 {
     if (currentState != null)
     {
         currentState.Clear();
     }
     currentState = behaviour;
     currentState.Start(this);
 }
Пример #40
0
 public BehaviourComponent(GameObject parent, BehaviourTreeNode root)
     : base(parent)
 {
     this.State = BehaviourState.Idle;
     this.Root = root;
 }
Пример #41
0
 // increases the stat with a given name by an ammount
 void SetCurrentState(BehaviourState _state)
 {
     currentState = _state;
     //lastStateChange = Time.time;
     ChangeStates ();
 }
Пример #42
0
    void Start()
    {
        _ship = this.GetComponent<Ship>();
        _ship.shipControllerSendDestroyed += OnShipDestroyed;
        currentState = new IdleState();

        enabled = false;
    }