public override ActionState update(AbstractAI ai, float delta) { ActionState state = this; if (_timer > 0f) //... SEARCH ...// { /* * Check if player is seen -> currentActionState == WALK * Check if Entity got hitted -> currentActionState = SEARCH, spottedPlayer = 3 * Check if playerSpotted == 0 -> currentActionState == IDLE * Check if playerSpotted > 0 -> currentActionState == WALK */ _timer -= delta; //... lookAroundTimer -> wie lang herumdrehen, lookAround, soll sich herum drehen ai.navMeshAgent.isStopped = true; //enemy.walkingTimer = _lifetime;//patience;//Transition! ai.IsLooking(); } else { if (ai.hasAlzheimer && ai.currentSenseState != AbstractAI.SenseStates.neverSeenPlayer && ai.alzheimerTimer < 0f) { state = new Idle(20f); //Forgetful I guess } else { ai.IsRoaming(); //enemy.walkingTimer = _lifetime;//patience;//Transition! state = new Walk(20f); ai.currentSenseState = (ai.currentSenseState == AbstractAI.SenseStates.neverSeenPlayer) ? AbstractAI.SenseStates.neverSeenPlayer : AbstractAI.SenseStates.alarmed; } } return(state); }
private void FixedUpdate() { //Debug.Log(currHP); //============================================================================================================== if (!(_state is Dead)) { ActionState newState = NotDead(); _state = (newState != null) ? newState : _state; if (currentSenseState != SenseStates.neverSeenPlayer) { if (hasAlzheimer) { if (alzheimerTimer >= 0) { alzheimerTimer -= Time.deltaTime; } else { alzheimerTimer = patience; currentSenseState = SenseStates.neverSeenPlayer; _state = new Idle(20f); } } } var playerPosition = Player.transform.position; Vector3 vectorToPlayer = eyes.transform.position - playerPosition; float distanceFromPlayer = vectorToPlayer.magnitude; float angel = Vector3.Angle(-transform.forward, vectorToPlayer); //Debug.Log("distanceFromPlayer: " +distanceFromPlayer); if (distanceFromPlayer > 35) { SwitchEnemyColliderState(false); //Improve performance } else { SwitchEnemyColliderState(true); if ( distanceFromPlayer <= 1.95 && !Physics.Linecast(eyes.position, Player.transform.position, searchMask) || (distanceFromPlayer <= sightDistance && angel <= sightAngle && !Physics.Linecast(eyes.position, Player.transform.position, searchMask)) ) { if (Mathf.Abs(eyes.position.y - playerPosition.y) < 3f) //Vertical distance is narrowed. { //...only when player is on the same level attacking makes sense! _lastSeenPlayerPosition = Player.transform.position; if (!(_state is Attack)) { _state = new Chase(patience); currentSenseState = SenseStates.playerSpotted; } } } } } _state = _state.update(this, Time.deltaTime); _DrawPath(); }