コード例 #1
0
    public void distanceFromPlayer()
    {
        distance = Vector3.Distance(player.transform.position, transform.position);
        // In attack range
        if (distance < 2)
        {
            canAttack = true;
            state     = enemyStates.idle;         // Should be attack!
        }
        else
        {
            canAttack = false;
        }

        if (distance > 15)
        {
            //Debug.Log("The player is out of reach!");
            //outOfReach = true;
            //state = enemyStates.walkBack;
            Vector3 startDirection = startPos - transform.position;
            Vector3 lookAt         = startPos;
            transform.LookAt(lookAt);
            RunHome(startDirection);
        }
    }
コード例 #2
0
    // Update is called once per frame
    void FixedUpdate()
    {
        DeathCheck();
        healthBar.value = m_stats.ReturnHealthFraction();

        switch (myState)
        {
        case enemyStates.idle:
            if (stateInit)
            {
                stateInit = false;
            }
            AgroCheck();
            break;

        case enemyStates.charge:
            if (stateInit)
            {
                m_animator.SetBool("Charge", true);
                stateInit = false;
            }
            myNavMeshAgent.SetDestination(player.transform.position);

            transform.LookAt(player.transform);
            if (AttackRangeCheck())
            {
                myState = enemyStates.attacking;
            }

            break;

        case enemyStates.attacking:
            if (stateInit)
            {
                myNavMeshAgent.Stop();
                m_animator.SetBool("Attacking", true);
                stateInit = false;
            }
            if (!AttackRangeCheck())
            {
                stateInit = true;
                m_animator.SetBool("Attacking", false);
                myState = enemyStates.charge;
            }

            if (shotReady)
            {
                Shoot();
            }
            break;

        case enemyStates.dead:
            if (stateInit)
            {
                m_animator.SetBool("Dead", true);
                stateInit = false;
            }
            break;
        }
    }
コード例 #3
0
    // Start is called before the first frame update
    private void Start()
    {
        npcDistance   = 99;
        deathLayer    = 24;
        rig           = GetComponent <Rigidbody>();
        torque        = GetComponent <TorqueLookRotation>();
        outline       = GetComponent <Outline>();
        enemyCollider = GetComponent <Collider>();

        radius.OnRadiusFindAlly += StartPursuit;

        currentState     = initialState;
        selectedWaypoint = initialWaypoint;

        SwitchRotationTarget();

        finalSpeed             = speed;
        originalDistanceToStop = distanceToStop;
        finalDistanceToStop    = originalDistanceToStop;
        GameManager.Get().enemies.Add(gameObject);
        deathTimer = -1;
        deathTime  = 1;

        animator.SetBool("IsWalking", true);
        animator.SetBool("IsEating", false);
        deathParticle.SetActive(false);
    }
コード例 #4
0
    void OnTriggerStay(Collider other)
    {
        if (IsPlayer(other.gameObject))                 // Collision with a gameObject with tag player
        {
            Vector3 direction = player.transform.position - transform.position;
            float   angle     = Vector3.Angle(direction, transform.forward);
            //RaycastHit hit;
            //Debug.Log("Angle: " + angle + " fieldOfView: " + fieldOfView*0.5f + " CanAttackBool :" + canAttack);

            /*
             * Debug.DrawLine(transform.position + (transform.up * 0.5f) + transform.forward, player.transform.position + (transform.up * 0.5f));
             * if(Physics.Raycast(transform.position + (transform.up * 0.5f) + transform.forward, direction.normalized, out hit, col.radius) == false){
             *      canAttack = true;
             * }
             */

            if (angle < fieldOfView * 0.5f)             // 110/2 == 55 on both sides of the wolf (therefore 110 field of view.
            {
                if (canAttack == false)
                {
                    Debug.DrawLine(transform.position + (transform.up * 0.5f) + transform.forward, player.transform.position + (transform.up * 0.5f));
                    state        = enemyStates.run;
                    youGotCaught = true;
                }
            }
        }
    }
コード例 #5
0
 private void OnTriggerExit2D(Collider2D col)
 {
     if (col.gameObject.tag.Equals("Player"))
     {
         currentState = enemyStates.idle;
     }
 }
コード例 #6
0
    private void FindTarget()
    {
        float targetRange = 5f;  //distanta minima la care incepe urmarirea

        int newX = (int)GameObject.Find("Cube").transform.position.x;
        int newZ = (int)GameObject.Find("Cube").transform.position.z;

        if (Vector3.Distance(transform.position, new Vector3(newX, 1, newZ)) <= 2f) //te-o prins
        {
            gameOver();
            return;
        }

        if (Vector3.Distance(transform.position, new Vector3(newX, 1, newZ)) < targetRange)     //pozitia playerului
        {
            //chase that mf
            if (state != enemyStates.chasing || currentPathIndex >= pathVectorList.Count)
            {
                state = enemyStates.chasing;
                animator.SetBool(state.ToString(), true);
                SetTarget();
            }
        }
        else if (state == enemyStates.chasing)
        {
            animator.SetBool(state.ToString(), false);
            state = enemyStates.roaming;
            endX  = (int)transform.position.x + mapDifference;
            endZ  = (int)transform.position.z + mapDifference;
            SetTarget();
        }
    }
コード例 #7
0
    // Update is called once per frame
    private void Update()
    {
        //A simple State Machine which forms the basis of the enemy AI
        switch (currentEnemyState)
        {
        case enemyStates.PATROL:
            patrol();
            sensePlayer();
            break;

        case enemyStates.CHASE:
            chasePlayer();
            break;

        case enemyStates.GOLASTKNOWNPOSITION:
            searchForPlayer();
            break;

        case enemyStates.CALLBACKUP:
            enemyCommunication.alert = true;
            currentEnemyState        = enemyStates.CHASE;
            break;

        case enemyStates.RESPONDBACKUP:
            sensePlayer();
            backup();
            break;
        }
    }
コード例 #8
0
 void DeathCheck()
 {
     if (m_stats.health < 0)
     {
         stateInit = true;
         myState   = enemyStates.dead;
     }
 }
コード例 #9
0
 void AgroCheck()
 {
     if (Vector3.Distance(player.transform.position, transform.position) < agroRange)
     {
         transform.LookAt(player.transform.position);
         myState = enemyStates.attacking;
     }
 }
コード例 #10
0
 // Use this for initialization
 void Start()
 {
     player     = GameObject.FindGameObjectWithTag("Player");
     m_stats    = gameObject.GetComponent <Stats>();
     myState    = enemyStates.idle;
     m_animator = gameObject.GetComponent <Animator>();
     healthBar  = GetComponentInChildren <Slider>();
 }
コード例 #11
0
 public void lureEnemy()
 {
     transform.LookAt(player.transform);
     playerLure = true;
     moveSpeed  = walkSpeed;
     //Walk(lurePos);
     state = enemyStates.walk;
 }
コード例 #12
0
 void AgroCheck()
 {
     if (Vector3.Distance(player.transform.position, transform.position) < agroRange)
     {
         transform.LookAt(player.transform.position);
         myState   = enemyStates.charge;
         stateInit = true;
     }
 }
コード例 #13
0
    public void StartEating()
    {
        currentState = enemyStates.eating;
        finalSpeed   = 0;

        animator.SetBool("IsWalking", false);
        animator.SetBool("IsEating", true);
        canSpillGoo = false;
    }
コード例 #14
0
 private void Start()
 {
     waitTime               = 2.0f;
     searchTime             = 5.0f;
     currentEnemyState      = enemyStates.PATROL;
     enemyDetected          = false;
     patrolIndex            = 0;
     enemyAgent.destination = patrolPoints[patrolIndex].transform.position;
 }
コード例 #15
0
 void OnTriggerExit(Collider other)
 {
     if (other.gameObject == GameObject.FindGameObjectWithTag("Player"))
     {
         //playerInSight = false;
         //playerIsNear = false;
         healthBar.enabled = false;
         state             = enemyStates.idle;
     }
 }
コード例 #16
0
    void Update()
    {
        lureCounter += Time.deltaTime;                          // Counter for Lure

        // IDLE STATE
        if (state == enemyStates.idle)
        {
            if (Input.GetButtonDown("Fire2") && distance < 30)
            {
                isAtHomePos = true;
                lurePos     = player.transform.position - transform.position;
                lureCounter = 0.0f;
                lureEnemy();
                state = enemyStates.walk;
            }
            Idle();
        }
        // WALK/LURE STATE
        if (state == enemyStates.walk)
        {
            moveSpeed = walkSpeed;
            if (lureCounter > 3.0f)                                     // Stop the wolf from the lure
            {
                state      = enemyStates.idle;
                playerLure = false;
            }
            Walk(lurePos);
        }
        // RUN STATE
        if (state == enemyStates.run)
        {
            moveSpeed = runSpeed;
            Vector3 playerPos = player.transform.position;
            Vector3 pos       = transform.position;
            Vector3 deltaPos  = playerPos - pos;

            if (!colliding)
            {
                Run(deltaPos);                 // If he is not colliding with the wolf keep running the run function.
            }
            Vector3 lookAt = playerPos;
            transform.LookAt(lookAt);
        }

        distanceToHome = Vector3.Distance(startPos, transform.position);
        distanceFromPlayer();


        //Debug.Log(distanceToHome);
        //Debug.Log(state);
        //Debug.Log(canAttack);
        //Debug.Log(distance);
        //Debug.Log(outOfReach);
    }
コード例 #17
0
    void OnEnable()
    {
        map           = GameObject.Find("BaseFloor").GetComponent <LabyrinthMakerBehaviour>().map;
        mapSize       = (int)Mathf.Sqrt(map.Length);
        mapDifference = mapSize / 2 - 1;
        getNavigablePositions();
        pathFinder = new PathFinding(map);
        SetTarget();
        animator = GetComponent <Animator>();

        state = enemyStates.roaming;
    }
コード例 #18
0
    private void Update()
    {
        CheckSoundSources();
        AnimationHandler();
        ChangeNodePercentage();
        Node node = GetClosestNode(transform.position);

        Debug.Log("==== NODE ====: " + node.name);

        if (personalLastSighting != previousSighting)
        {
            states = enemyStates.hunting;
        }
        else if (personalLastSighting == previousSighting && !soundSourcePlaying)
        {
            states = enemyStates.roaming;
        }
        else if (soundSourcePlaying)
        {
            states = enemyStates.searchingSound;
        }

        // Checking for states
        switch (states)
        {
        case enemyStates.hunting:
            isWalking = true;
            nav.SetDestination(personalLastSighting);
            previousSighting = personalLastSighting;
            Debug.Log("Hunting Player");
            break;

        case enemyStates.attacking:
            break;

        case enemyStates.roaming:
            isWalking = true;
            Roaming();
            Debug.Log("Roaming");
            break;

        case enemyStates.patroling:
            break;

        case enemyStates.searchingSound:
            nav.SetDestination(soundSourcePosition);
            Debug.Log("Searching Sound Source");
            break;

        default:
            break;
        }
    }
コード例 #19
0
 private void hitEnemy()
 {
     if (lives > 0)
     {
         lives--;
         enemyRenderer.material.color = Color.red;
         Invoke("switchColorBack", 0.1f);
         if (lives <= 0)
         {
             currentState = enemyStates.dead;
         }
     }
 }
コード例 #20
0
 void RunHome(Vector3 deltaPos)
 {
     if (distanceToHome > 2.0f)
     {
         rigidbody.velocity = deltaPos.normalized * moveSpeed * Time.deltaTime;
         anim.SetBool("running", true);
     }
     else
     {
         anim.SetBool("running", false);
         state = enemyStates.idle;
         transform.LookAt(player.transform.position);
     }
 }
コード例 #21
0
    bool AttackRangeCheck()
    {
        if (Vector3.Distance(player.transform.position, transform.position) < 6f)
        {
            m_animator.SetBool("Attacking", true);
            return(true);

            myState = enemyStates.attacking;
        }
        else
        {
            return(false);
        }
    }
コード例 #22
0
    //Called whenever we want the enemy to look for the player, either while patrolling, when searching for enemy, etc...
    private void sensePlayer()
    {
        calculateDotProduct(ref playerDirection, ref dotProduct);
        Vector3 lineToPlayer = playerGO.transform.position - transform.position;
        float   angle        = Vector3.SignedAngle(transform.forward, lineToPlayer, Vector3.up); //Vector3.SignedAngle will include positive & negative values, unlike Vector3.Angle which only returns positive values
                                                                                                 //SignedAngle is useful to determine if an object is in front or behind another object

        int layerMask = 1 << 9;                                                                  //Bitshift through 9 bits and replace 9th bit from 0 with a 1, therefore activating layer 9


        //Check if player is within enemy field of vision and if player is in front of enemy
        if (dotProduct < 55.0f || dotProduct < 120.0f && angle > -0.1f)
        {
            //If enemy view is blocked by obstacle like walls
            if (Physics.Raycast(transform.position, playerDirection, 1000.0f, layerMask)) //This raycast will detect only layer 9
            {
                Debug.DrawRay(transform.position, playerDirection * 1000.0f, Color.red);  //Red raycast if enemy line of sight is blocked
                enemyDetected = false;
            }
            //Else if enemy view is not blocked and can see player clearly
            else
            {
                Debug.DrawRay(transform.position, playerDirection * 1000.0f, Color.green);//Green RayCast if enemy can see player clearly
                enemyDetected          = true;
                enemyAgent.destination = playerGO.transform.position;

                //Depending on which state the enemy is when they saw the player, switch to the new proper state
                if (currentEnemyState == enemyStates.RESPONDBACKUP)
                {
                    enemyCommunication.alert = false;
                    currentEnemyState        = enemyStates.CHASE;
                }
                else if (currentEnemyState == enemyStates.PATROL)
                {
                    currentEnemyState = enemyStates.CALLBACKUP;
                }
                else if (currentEnemyState == enemyStates.CHASE)
                {
                    currentEnemyState = enemyStates.CHASE;
                }
            }
        }
        //If player is not within enemy's line of sight at all
        else
        {
            enemyDetected = false;
        }
    }
コード例 #23
0
    private void Eat()
    {
        eatingTimer += Time.deltaTime;

        if (eatingTimer >= eatingTime)
        {
            eatingTimer  = 0;
            finalSpeed   = speed;
            currentState = enemyStates.move;

            animator.SetBool("IsWalking", true);
            animator.SetBool("IsEating", false);

            SwitchRotationTarget();
            canSpillGoo = true;
        }
    }
コード例 #24
0
ファイル: EnemyAI.cs プロジェクト: xiarui22/SheepPrototype
    // Update is called once per frame
    void Update()
    {
        //Recognize - act cycle
        Detect();

        if (statesDetected.Count == 0)
        {
            DefineState();
        }

        currentState = statesDetected.Values[0];
        CheckProduction(currentState);
        statesDetected.Clear();
        currentAction.Behavior(currentState);

        s = currentState.stateName;
        a = currentAction.actionName;
    }
コード例 #25
0
 //if enemy canhear
 public bool canHear(bool hear)
 {
     if (hear)
     {
         state = enemyStates.Search;
         EnemyStateMachine();
         detectionEye.SetActive(true);
         hearPlayer = true;
     }
     else if (!hear)
     {
         state = enemyStates.Idle;
         EnemyStateMachine();
         detectionEye.SetActive(false);
         hearPlayer = false;
     }
     return(hear);
 }
コード例 #26
0
 //If enemy cansee
 public bool canSee(bool see)
 {
     if (see)
     {
         state = enemyStates.Attack;
         EnemyStateMachine();
         detectionEye.SetActive(true);
         seePlayer = true;
     }
     else if (!see)
     {
         state = enemyStates.Search;
         EnemyStateMachine();
         detectionEye.SetActive(false);
         seePlayer = false;
     }
     return(see);
 }
コード例 #27
0
    void Update()
    {
        //prints state
        print(state);

        //detects if canhear and cansee
        if (hearPlayer == false && seePlayer == false)
        {
            state = enemyStates.Idle;
            EnemyStateMachine();
        }
        if (hearPlayer == true || seePlayer == true)
        {
            Vector3 somethingIliteralydontgiveasingleshitbro = GameManager.gamemanager.player.transform.position - transform.position;
            float   angle = Mathf.Atan2(somethingIliteralydontgiveasingleshitbro.y, somethingIliteralydontgiveasingleshitbro.x) * Mathf.Rad2Deg;
            transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward);
        }
    }
コード例 #28
0
 //Called whenever the enemy is in RESPONDBACKUP state
 private void backup()
 {
     //Make enemy move to position where player was spotted
     enemyAgent.destination = enemyCommunication.playerPos;
     //Once enemy reached where player was spotted, wait for a few seconds before resetting alert phase and returning to PATROL state
     if (enemyAgent.remainingDistance <= 15.0f && enemyDetected == false)
     {
         waitTime -= Time.deltaTime;
         //Debug.Log("Wait Time : " + waitTime);
         if (waitTime <= 0.0f)
         {
             waitTime = 2.0f;
             Debug.Log("Reached Backup Point");
             enemyCommunication.alert       = false; //Reset alert phase
             enemyCommunication.callOnlyOne = false; //Reset backup call
             currentEnemyState = enemyStates.PATROL;
         }
     }
 }
コード例 #29
0
    private void OnCollisionEnter(Collision collision)
    {
        if (collision.gameObject.tag == "npc")
        {
            if (GameManager.Get().canBeDamaged)
            {
                StartEating();
            }
        }

        if (collision.gameObject.tag == "proyectile")
        {
            if (!hasAlreadyDied)
            {
                if (OnDeath != null)
                {
                    OnDeath(gameObject, pointsToGive);
                }
                gameObject.layer = deathLayer;
                gameObject.tag   = "dead";
                currentState     = enemyStates.dead;
                attachedModel.material.shader = deathShader;
                Destroy(collision.gameObject);
                hasAlreadyDied = true;

                animator.SetTrigger("Die");
                if (isSmallEnemy)
                {
                    AkSoundEngine.PostEvent("monstruo_2_muere_torre", smallDeathTowerSound);
                }
                else
                {
                    AkSoundEngine.PostEvent("monstruo_1_muere_torre", deathTowerSound);
                }

                deathParticle.SetActive(true);
                canSpillGoo = false;
            }
        }
    }
コード例 #30
0
    //Called whenever the enemy is in the CHASE state
    private void chasePlayer()
    {
        calculateDotProduct(ref playerDirection, ref dotProduct);
        Vector3 lineToPlayer = playerGO.transform.position - transform.position;
        float   angle        = Vector3.SignedAngle(transform.forward, lineToPlayer, Vector3.up); //Vector3.SignedAngle will include positive & negative values, unlike Vector3.Angle which only returns positive values
                                                                                                 //SignedAngle is useful to determine if an object is in front or behind another object

        int layerMask = 1 << 9;                                                                  //Bitshift through 9 bits and replace 9th bit from 0 with a 1, therefore activating layer 9



        if (dotProduct < 55.0f || dotProduct < 120.0f && angle > -0.1f)//Check if player is within enemy field of vision and if player is in front of enemy
        {
            //If enemy line of sight to player is blocked while enemy is chasing the player, switch state to GOLASTKNOWNPOSITION
            if (Physics.Raycast(transform.position, playerDirection, 1000.0f, layerMask)) //This raycast will detect only layer 9
            {
                Debug.DrawRay(transform.position, playerDirection * 1000.0f, Color.red);  //Red raycast if enemy line of sight is blocked
                enemyDetected                  = false;
                enemyCommunication.alert       = false;                                   //Reset alert phase
                enemyCommunication.callOnlyOne = false;                                   //Reset backup phase
                currentEnemyState              = enemyStates.GOLASTKNOWNPOSITION;
            }
            //If enemy can see the player clearly while chasing player, keep chasing the player
            else
            {
                Debug.DrawRay(transform.position, playerDirection * 1000.0f, Color.green);//Green RayCast if enemy can see player clearly
                enemyDetected          = true;
                playerPosition         = playerGO.transform.position;
                enemyAgent.destination = playerGO.transform.position;
            }
        }
        //If player not within enemy's line of sight at all while chasing, switch to GOLASTKNOWNPOSITION state
        else
        {
            enemyDetected                  = false;
            enemyCommunication.alert       = false; //Reset alert phase
            enemyCommunication.callOnlyOne = false; //Reset backup phase
            currentEnemyState              = enemyStates.GOLASTKNOWNPOSITION;
        }
    }