public void TakeDamage(int damage) { _nextState = SnowMonsterState.TakingDamage; InterruptActiveState(); health -= damage; }
private void StartAttacking() { Debug.Log("Start Attacking"); _state = SnowMonsterState.Attacking; _monsterNavMesh.transform.LookAt(GetPlayerDestinationBendSafe()); _animator.ResetTrigger(_runForwardInPlaceHash); _nextAttack = Time.time; }
private void ExecuteTakingDamageState() { _monsterNavMesh.SetDestination(gameObject.transform.position); //Stop moving _animator.SetTrigger(_takeDamageHash); _audioSource.PlayOneShot(painSound); _nextState = SnowMonsterState.Idle; NextCheckInSeconds(1f); }
private void ExecuteIdleState() { if (PlayerIsInRange()) { _nextState = SnowMonsterState.MovingToPlayer; } NextCheckInSeconds(0.1f); }
public void TakeDamage(int damage) { _state = SnowMonsterState.TakingDamage; _monsterNavMesh.SetDestination(gameObject.transform .position); //Set current position as destination to stop moving _animator.ResetTrigger(_runForwardInPlaceHash); _animator.SetTrigger(_takeDamageHash); _stopTakingDamage = Time.time + 1f; //Expires after 2seconds if no further damage is taken health -= damage; if (health <= 0 && MonsterIsAlive()) { Die(); } }
private void ExecuteAttackingState() { _monsterNavMesh.transform.LookAt(_currentTarget.transform); _animator.SetTrigger(_slapAttackRight); _currentTarget.TakeDamage(10); _audioSource.PlayOneShot(meleeAttackSound); if (!PlayerIsCloseEnoughToAttack()) { _nextState = SnowMonsterState.Idle; } NextCheckInSeconds(1f); }
private void Attack() { float distanceToPlayer = Vector3.Distance(_playerTransform.position, transform.position); if (distanceToPlayer < _monsterNavMesh.stoppingDistance) { Debug.Log("Attack"); _monsterNavMesh.transform.LookAt(GetPlayerDestinationBendSafe()); _animator.ResetTrigger(_runForwardInPlaceHash); _animator.SetTrigger(_slapAttackRight); _player.TakeDamage(10); _nextAttack = Time.time + 1f; } else { _animator.ResetTrigger(_slapAttackRight); _state = SnowMonsterState.Idle; } }
private void ExecuteMovingToPlayerState() { _animator.SetTrigger(_runForwardInPlaceHash); _monsterNavMesh.transform.LookAt(_currentTarget.transform); _monsterNavMesh.SetDestination(_currentTarget.transform.position); //Detect state transitions if (!PlayerIsInRange()) { _nextState = SnowMonsterState.Idle; } if (PlayerIsCloseEnoughToAttack()) { _nextState = SnowMonsterState.Attacking; } //Next check should be asap }
private void Die() { _state = SnowMonsterState.Dead; _animator.SetTrigger(_dieHash); Destroy(gameObject, 5); }
// Update is called once per frame void Update() { //TODO: maybe reduce checks if this is bad for performance _currentTarget = _playerManager.GetClosestPlayer(transform); if (Time.time > _nextCheck) { if (_currentState != _nextState) { if (_currentState == SnowMonsterState.Dead) { // Prevents reviving after interrupts from outside sources _nextState = SnowMonsterState.Dead; } if (_currentState == SnowMonsterState.MovingToPlayer) { //Stop moving _monsterNavMesh.SetDestination(gameObject.transform.position); } ResetAllAnimations(); if (_currentState != SnowMonsterState.Dead && _nextState == SnowMonsterState.Dead) { Die(); } //Finally set states equal Debug.Log("State transition from " + _currentState + " to " + _nextState); _currentState = _nextState; } else { switch (_currentState) { case SnowMonsterState.Idle: ExecuteIdleState(); return; case SnowMonsterState.MovingToPlayer: ExecuteMovingToPlayerState(); return; case SnowMonsterState.Attacking: ExecuteAttackingState(); return; case SnowMonsterState.TakingDamage: ExecuteTakingDamageState(); return; case SnowMonsterState.Dead: return; // A dead monster is dead } } } if (health <= 0) { _nextState = SnowMonsterState.Dead; InterruptActiveState(); } }