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); } }
// 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; } }
// 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); }
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; } } } }
private void OnTriggerExit2D(Collider2D col) { if (col.gameObject.tag.Equals("Player")) { currentState = enemyStates.idle; } }
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(); } }
// 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; } }
void DeathCheck() { if (m_stats.health < 0) { stateInit = true; myState = enemyStates.dead; } }
void AgroCheck() { if (Vector3.Distance(player.transform.position, transform.position) < agroRange) { transform.LookAt(player.transform.position); myState = enemyStates.attacking; } }
// 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>(); }
public void lureEnemy() { transform.LookAt(player.transform); playerLure = true; moveSpeed = walkSpeed; //Walk(lurePos); state = enemyStates.walk; }
void AgroCheck() { if (Vector3.Distance(player.transform.position, transform.position) < agroRange) { transform.LookAt(player.transform.position); myState = enemyStates.charge; stateInit = true; } }
public void StartEating() { currentState = enemyStates.eating; finalSpeed = 0; animator.SetBool("IsWalking", false); animator.SetBool("IsEating", true); canSpillGoo = false; }
private void Start() { waitTime = 2.0f; searchTime = 5.0f; currentEnemyState = enemyStates.PATROL; enemyDetected = false; patrolIndex = 0; enemyAgent.destination = patrolPoints[patrolIndex].transform.position; }
void OnTriggerExit(Collider other) { if (other.gameObject == GameObject.FindGameObjectWithTag("Player")) { //playerInSight = false; //playerIsNear = false; healthBar.enabled = false; state = enemyStates.idle; } }
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); }
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; }
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; } }
private void hitEnemy() { if (lives > 0) { lives--; enemyRenderer.material.color = Color.red; Invoke("switchColorBack", 0.1f); if (lives <= 0) { currentState = enemyStates.dead; } } }
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); } }
bool AttackRangeCheck() { if (Vector3.Distance(player.transform.position, transform.position) < 6f) { m_animator.SetBool("Attacking", true); return(true); myState = enemyStates.attacking; } else { return(false); } }
//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; } }
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; } }
// 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; }
//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); }
//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); }
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); } }
//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; } } }
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; } } }
//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; } }