private void Update() { //set animation states animator.SetBool(IsAttacking, _isAttacking); animator.SetBool(IsAgro, _isAgro); if (_isAgro) { if (!_vision.CanSeeObject()) { return; } // Move towards players var position = _vision.GetVisibleObjects()[0].transform.position; var path = _pathFinding.GetPath(position); _movement.SetPath(path); // Look at player _rotation.RotateTowards(position); if (!_isAttacking && Vector3.Distance(transform.position, position) <= attackDistance && !_isAttackCoolingDown) { _isAttacking = true; } } else { // Wander _movement.SetPath(null); //TODO: wander around _isAgro = _vision.CanSeeObject(); } if (_health.GetHealth() <= 0) { gameObject.SetActive(false); } }
private void Update() { //set animation states animator.SetBool(IsAttacking, _isAttacking); animator.SetBool(IsAgro, _isAgro); if (_isAgro) { if (!_isStrafing && !_movingCloser && !_movingAway) { _movingCloser = true; } if (_vision.CanSeeObject()) { if (_isStrafing) { var path = _pathFinding.GetPath(transform.position); _movement.SetPath(path); if (!_isAttacking && !_isAttackCoolingDown) { _isAttacking = true; } var distance = Vector3.Distance(transform.position, _vision.GetVisibleObjects()[0].transform.position); if (distance < minStrafeDistance) { _movingCloser = false; _movingAway = true; _isStrafing = false; } else if (distance > maxStrafeDistance) { _movingCloser = true; _movingAway = false; _isStrafing = false; } else if (Mathf.Abs(maxStrafeDistance - distance) < 0.3) { _movingCloser = false; _movingAway = false; _isStrafing = true; } else if (distance > minStrafeDistance && distance < maxStrafeDistance) { float ran = Random.Range(0, 1); if (ran < 0.6) { _movingCloser = false; _movingAway = false; _isStrafing = true; } } _rotation.RotateTowards(_vision.GetVisibleObjects()[0].transform.position); } else if (_movingCloser) { _lastSeenPlayerPos = _vision.GetVisibleObjects()[0].transform.position; _lastSawPlayerTime = Time.time; _hasLastPlayerPos = true; var position = transform.position; var path = _pathFinding.GetPath(position); _movement.SetPath(path); var distance = Vector3.Distance(position, _vision.GetVisibleObjects()[0].transform.transform.position); if (distance < minStrafeDistance) { _movingCloser = false; _movingAway = true; _isStrafing = false; } else if (distance > maxStrafeDistance) { _movingCloser = true; _movingAway = false; _isStrafing = false; } else if (Mathf.Abs(maxStrafeDistance - distance) < 0.3) { _movingCloser = false; _movingAway = false; _isStrafing = true; } else if (distance > minStrafeDistance && distance < maxStrafeDistance) { float ran = Random.Range(0, 1); if (ran < 0.6) { _movingCloser = false; _movingAway = false; _isStrafing = true; } } var lookPos = _vision.GetVisibleObjects()[0].transform.position - transform.position; lookPos.y = 0; var rotation = Quaternion.LookRotation(lookPos); _rotation.RotateTowards(_vision.GetVisibleObjects()[0].transform.position); } else if (_movingAway) { if (!_isAttacking && !_isAttackCoolingDown) { _isAttacking = true; } _lastSeenPlayerPos = _vision.GetVisibleObjects()[0].transform.position; _lastSawPlayerTime = Time.time; _hasLastPlayerPos = true; var backwardTarget = transform.position - transform.forward; var path = _pathFinding.GetPath(backwardTarget); _movement.SetPath(path); _rotation.RotateTowards(_vision.GetVisibleObjects()[0].transform.position); var distance = Vector3.Distance(transform.position, _vision.GetVisibleObjects()[0].transform.transform.position); if (distance < minStrafeDistance) { _movingCloser = false; _movingAway = true; _isStrafing = false; } else if (distance > maxStrafeDistance) { _movingCloser = true; _movingAway = false; _isStrafing = false; } else if (Mathf.Abs(maxStrafeDistance - distance) < 0.3) { _movingCloser = false; _movingAway = false; _isStrafing = true; } else if (distance > minStrafeDistance && distance < maxStrafeDistance) { float ran = Random.Range(0, 1); if (ran < 0.6) { _movingCloser = false; _movingAway = false; _isStrafing = true; } } } } else { var path = _pathFinding.GetPath(_hasLastPlayerPos ? _lastSeenPlayerPos : transform.position); _movement.SetPath(path); if (!(Time.time - _lastSawPlayerTime >= lookForLostPlayerMs)) { return; } _isAgro = false; _hasLastPlayerPos = false; } } else { var path = _pathFinding.GetPath(transform.position); _movement.SetPath(path); //TODO: wander around _hasLastPlayerPos = false; _isAgro = _vision.CanSeeObject(); } if (_health.GetHealth() <= 0) { gameObject.SetActive(false); } }