public void UseWeapon() { if (currentWeapon == null || isOnCooldown) { return; } OnUseWeapon.Invoke(); CharacterTeamAssigner myTeam = GetComponent <CharacterTeamAssigner>(); foreach (Collider2D collider in GetCollidersInWeaponRange()) { HealthTracker tracker = collider.GetComponentInParent <HealthTracker>(); if (tracker != null) { CharacterTeamAssigner otherTeam = collider.GetComponentInParent <CharacterTeamAssigner>(); if (otherTeam == null || myTeam == null || myTeam.team != otherTeam.team) { tracker.TakeDamage(currentWeapon.damage); Rigidbody2D rb = collider.GetComponentInParent <Rigidbody2D>(); if (rb != null) { rb.AddForce((rb.position - (Vector2)transform.position).normalized * currentWeapon.force, ForceMode2D.Impulse); } } } } StartCoroutine(WaitForCooldown(currentWeapon.cooldown)); }
public override void UpdateLogic(CharacterLogicController controller) { NavigationTargeter targeter = controller.GetComponent <NavigationTargeter>(); WaypointChainFollower follower = controller.GetComponent <WaypointChainFollower>(); HealthTracker tracker = controller.GetComponent <HealthTracker>(); ExcitementTracker excitementTracker = controller.GetComponent <ExcitementTracker>(); CharacterTeamAssigner teamAssigner = controller.GetComponent <CharacterTeamAssigner>(); WeaponController weaponController = controller.GetComponent <WeaponController>(); bool canAttack = !weaponController.isOnCooldown; bool isPanicked = tracker.currentHealth / tracker.maxHealth <= panicPercentage; List <CharacterTeamAssigner> enemiesInVision = new List <CharacterTeamAssigner>(); List <Potion> potionsInVision = new List <Potion>(); foreach (Collider2D collider in Physics2D.OverlapCircleAll(controller.transform.position, visionRange)) { CharacterTeamAssigner otherTeamAssigner = collider.GetComponent <CharacterTeamAssigner>(); Potion potion = collider.GetComponent <Potion>(); if (otherTeamAssigner != null && otherTeamAssigner.team != teamAssigner.team) { enemiesInVision.Add(otherTeamAssigner); } if (potion != null) { potionsInVision.Add(potion); } } List <CharacterTeamAssigner> enemiesInAttackRange = ClosestUtility.ThresholdList(controller.transform, enemiesInVision, enemyAttackRange); bool inCombat = enemiesInAttackRange.Count > 0; if (inCombat) { excitementTracker.GainExcitement(excitementGainedWhenInCombatPerSecond * Time.deltaTime * (isPanicked ? panicExcitementMultiplier : 1.0f)); } if (inCombat && !isPanicked && canAttack) { targeter.target = ClosestUtility.GetClosestInList(controller.transform, enemiesInAttackRange).transform; return; } bool canGetToPotion = potionsInVision.Count > 0; bool wantsPotion = tracker.currentHealth < tracker.maxHealth; if (wantsPotion && canGetToPotion) { targeter.target = ClosestUtility.GetClosestInList(controller.transform, potionsInVision).transform; return; } targeter.target = follower.currentWaypoint; }
private void OnTriggerEnter2D(Collider2D collision) { #if UNITY_EDITOR if (!EditorApplication.isPlaying) { return; } #endif CharacterTeamAssigner teamAssigner = collision.GetComponent <CharacterTeamAssigner>(); if (teamAssigner != null && teamAssigner.team == potionSettings.teamToHeal) { HealthTracker tracker = collision.GetComponent <HealthTracker>(); tracker.RestoreHealth(potionSettings.healAmount); } gameObject.SetActive(false); }
public bool AreEnemiesInRange() { CharacterTeamAssigner myTeam = GetComponent <CharacterTeamAssigner>(); foreach (Collider2D collider in GetCollidersInWeaponRange()) { HealthTracker tracker = collider.GetComponentInParent <HealthTracker>(); if (tracker != null) { CharacterTeamAssigner otherTeam = collider.GetComponentInParent <CharacterTeamAssigner>(); if (otherTeam == null || myTeam == null || myTeam.team != otherTeam.team) { return(true); } } } return(false); }
public override void UpdateLogic(CharacterLogicController controller) { NavigationTargeter targeter = controller.GetComponent <NavigationTargeter>(); if (targeter == null) { return; } if (targeter.target != null) { return; } Transform target = null; float closestDistance = Mathf.Infinity; foreach (Collider2D collider in Physics2D.OverlapCircleAll(controller.transform.position, seekRange)) { CharacterTeamAssigner assigner = collider.GetComponent <CharacterTeamAssigner>(); if (assigner != null) { if (assigner.team == teamToSeek) { float distance = Vector2.Distance(controller.transform.position, assigner.transform.position); if (distance < closestDistance) { target = assigner.transform; closestDistance = distance; } } } } targeter.target = target; targeter.RecomputeWaypoints(); }