IEnumerator AI() { float baseSpeed = myMovement_.GetSpeed(); while (true) { while (true) { if (me_.IsDead) { yield break; } bool hasRecentlySeenPlayer = mySenses_.GetPlayerLatestKnownPositionAge() < 2.0f; if (!hasRecentlySeenPlayer) { break; } var target = mySenses_.GetPlayerLatestKnownPosition(PlayerPositionType.Feet); myMovement_.MoveTo(target, baseSpeed * 2); yield return(null); } var pos = myMovement_.GetPosition(); var direction = CollisionUtil.GetRandomFreeDirection(pos) * (Random.value * 0.8f + 0.1f); myMovement_.MoveTo(pos + direction, baseSpeed); float endTime = Time.time + 4 + Random.value; while (true) { if (myMovement_.MoveTargetReached()) { break; } if (Time.time > endTime) { break; } bool hasRecentlySeenPlayer = mySenses_.GetPlayerLatestKnownPositionAge() < 2.0f; if (hasRecentlySeenPlayer) { break; } yield return(null); } yield return(null); } }
void CheckFire(float time) { if (time < reloadEnd_ || me_.IsDead) { return; } bool hasRecentlySeenPlayer = senses_.GetPlayerLatestKnownPositionAge() < 2.0f; if (hasRecentlySeenPlayer && pendingShots_ == 0) { pendingShots_ = 2; } if (pendingShots_ > 0) { if (time > coolDownEnd_) { var myCenter = movable_.GetPosition() + Vector3.up * 0.5f; var playerCenter = senses_.GetPlayerLatestKnownPosition(PlayerPositionType.Center); var directionToPlayer = (playerCenter - myCenter).normalized; var bulletStartPos = myCenter + directionToPlayer * 0.2f; var bulletDirection = (playerCenter - bulletStartPos).normalized; float angleOffset = (Random.value - 0.5f) * 15; var offsetDirection = Quaternion.AngleAxis(angleOffset, Vector3.forward) * bulletDirection; Fire(bulletStartPos, offsetDirection); coolDownEnd_ = time + 0.4f; if (--pendingShots_ == 0) { reloadEnd_ = time + 3.0f + Random.value; } } } }