void Update() { if (attackTimer > 0f) { attackTimer -= Time.deltaTime; } timer -= Time.deltaTime; hunger -= Time.deltaTime * HUNGER_LOSS_PER_SECOND; // Lerp colour back to normal (for when hit). spriteRenderer.color = Color.Lerp(spriteRenderer.color, Color.white, Time.deltaTime * 5f); // Pick new target? if (timer <= 0f) { timer = Random.Range(0f, MAX_TIME_BETWEEN_TARGETS); PickNewTarget(); } // Can attack when in range, long enough since last attack, and either hungry or always attacks this target. bool targetInRange = targetAnimal != null && (targetAnimal.transform.position - transform.position).sqrMagnitude < animalType.attackRange * animalType.attackRange; if (targetInRange && attackTimer <= 0 && (Hungry() || animalType.alwaysAttacks.Find(x => x == targetAnimal.animalType) != null)) { // Can attack. attackTimer = animalType.attackCooldown; targetAnimal.TakeDamage(animalType.attackStrength); if (targetAnimal.GetHealth() <= 0) { hunger += targetAnimal.animalType.foodValue; } // If run after hit. if (animalType.runAfterHitDistance > 0f) { var randomDir = Random.onUnitSphere; randomDir.z = 0; randomDir = randomDir.normalized; target = transform.position + randomDir * animalType.runAfterHitDistance; timer = animalType.runAfterHitDistance / (animalType.moveSpeed * health / animalType.health); } } bool targetDefsInRange = targetInRange && targetAnimal != null && (targetAnimal.transform.position - transform.position).sqrMagnitude < (animalType.attackRange * animalType.attackRange / 4f); // Don't move if target is halfway to move distance. if (!targetDefsInRange) { // Move towards target. // Vector3 delta = (target - transform.position).normalized * animalType.moveSpeed * Time.deltaTime; // delta.z = 0; // transform.position += delta; // var direction = target - transform.position; // var angle = Mathf.Atan2(direction.y, direction.x) * Mathf.Rad2Deg - 90; // transform.rotation = Quaternion.AngleAxis(angle, Vector3.forward); if (target != null) { Vector3 delta = (target - transform.position).normalized * animalType.moveSpeed * Time.deltaTime * ((float)health) / animalType.health; delta.z = 0; transform.position += delta; Vector3 direction = (target - transform.position); if (direction.sqrMagnitude > 0.1f) { faceMovement(direction.normalized); } } } UpdateMouseOverText(); }
void Update() { treeTimer += Time.deltaTime; dayTimer += Time.deltaTime; while (treeTimer > TREE_UPDATE_PERIOD) { foreach (var tree in trees) { tree.Grow(); } treeTimer -= TREE_UPDATE_PERIOD; } if (dayTimer > DAY_LENGTH) { if (daysTillNextHunter == 0) { // Remove last hunter. if (hunter != null) { hunter.TakeDamage(100 * hunter.GetHealth()); } CalculateDaysTillNextHunter(); } dayTimer = 0; daysSurvived++; daysTillNextHunter -= 1; if (daysTillNextHunter == 0) { // Add hunter. hunter = SpawnAnimal(AnimalType.animalTypes.Find(x => x.name == "Hunter"), 20f, 30f); Debug.Log("A hunter arrives!"); } for (int i = 0; i < trees.Count; i++) { trees[i].beingChoppedDown = false; } } animalAdjustmentTimer -= Time.deltaTime; if (animalAdjustmentTimer < 0f) { ResetAnimalAdjustTimer(); foreach (var animalType in AnimalType.animalTypes) { var animalsOfThisType = animals.FindAll(x => x.animalType == animalType); float diff = animalType.GetHabitability(trees, animals) - animalsOfThisType.Count; if (diff > 0 && Random.Range(0f, 3f) < diff) { SpawnAnimal(animalType, 20f, 30f); } else if (diff < 0 && Random.Range(0f, 3f) < -diff && animalsOfThisType.Count > 0) { AnimalController a = animalsOfThisType[Random.Range(0, animalsOfThisType.Count)]; a.TakeDamage(a.GetHealth() * 100); } } } timeOfDay = dayTimer / DAY_LENGTH; UIController.instance.OnDaysSurvived(); }