private void Awake() { _stats = GetComponent <EnemyStatsController>(); _brain = GetComponent <EnemyBrainController>(); _anim = GetComponentInChildren <Animator>(); _agent = GetComponent <NavMeshAgent>(); }
public IEnumerator FunctionalRequirements_PlayerShouldBeRemovedFromSceneWhenItDies() { GameObject magePlayer = Object.Instantiate(TestResourceManager.Instance.GetResource("Mage Player"), Vector3.zero, Quaternion.identity); PlayerStatsController magePlayerStats = magePlayer.GetComponent <PlayerStatsController>(); GameObject enemy = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity); EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>(); magePlayer.transform.position = new Vector3(0, 0, -2); enemy.transform.Rotate(new Vector3(0, 1, 0), 180); magePlayerStats.health.maxValue = 1; magePlayerStats.health.Init(); yield return(new WaitForEndOfFrame()); yield return(new WaitForEndOfFrame()); // Wait for player to despawn float timer = 0; while (magePlayer.activeSelf) { if (timer > 15f) { break; } timer += Time.deltaTime; yield return(new WaitForEndOfFrame()); } Assert.IsTrue(magePlayer.activeSelf == false, "Player was not removed from scene"); yield return(null); }
/// <summary> /// Set up the puzzle /// </summary> protected virtual void Setup() { loadedEnemies.Clear(); numEnemiesDead = 0; if (autoDetermineNumEnemies) { // Base # enemies off number of players numEnemies = playerColours.Length * 2; } else { numEnemies = enemyPrefabs.Length; } // spawn enemies for (int i = 0; i < numEnemies; i++) { int enemyIndex = UnityEngine.Random.Range(0, enemyPrefabs.Length); GameObject enemyObj = Instantiate(enemyPrefabs[enemyIndex], transform); loadedEnemies.Add(enemyObj); // add any modifieres to the enemy EnemyStatsController enemyStats = enemyObj.GetComponent <EnemyStatsController>(); enemyStats.damage.AddModifier(damageModifier); enemyStats.damage.AddModifier(defenseModifier); enemyStats.characterColour = CharacterColour.None; enemyStats.onDeath.AddListener(EnemyDied); } if (isBoss) { GameManager.Instance.SetBossState(); MusicManager.Instance.PlayMusic(); } }
public IEnumerator FunctionalRequirements_EnemyShouldOnlyBeDamagedByPlayersOfSameColour() { GameObject magePlayer = Object.Instantiate(TestResourceManager.Instance.GetResource("Mage Player"), Vector3.zero, Quaternion.identity); PlayerStatsController magePlayerStats = magePlayer.GetComponent <PlayerStatsController>(); GameObject meleePlayer = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), Vector3.zero, Quaternion.identity); PlayerStatsController meleePlayerStats = meleePlayer.GetComponent <PlayerStatsController>(); GameObject enemy = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity); EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>(); magePlayer.transform.position = new Vector3(0, 0, -2); enemy.transform.Rotate(new Vector3(0, 1, 0), 180); magePlayerStats.characterColour = CharacterColour.Green; meleePlayerStats.characterColour = CharacterColour.Red; yield return(new WaitForEndOfFrame()); yield return(new WaitForEndOfFrame()); enemyStats.characterColour = CharacterColour.Red; float initialHp = enemyStats.health.CurrentValue; enemyStats.TakeDamage(magePlayerStats, 10f); yield return(new WaitForSeconds(timeToWait)); Assert.AreEqual(enemyStats.health.CurrentValue, initialHp, "Enemy lost health when player colour was different"); enemyStats.TakeDamage(meleePlayerStats, 10f); yield return(new WaitForSeconds(timeToWait)); Assert.Less(enemyStats.health.CurrentValue, initialHp, "Enemy did not lose health when player colour was same"); yield return(null); }
public void RemoveEnemyInvincibility() { foreach (GameObject enemy in enemyPrefabs) { EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>(); enemyStats.invincible = false; } }
/// <summary> /// Registers a newly spawned plant to be known by the boss /// </summary> /// <param name="plant">The newly spawned plant</param> public void AddPlantToSpawnList(GameObject plant) { EnemyStatsController plantStats = plant.GetComponent <EnemyStatsController>(); if (plantStats) { _spawnedPlants.Add(plantStats); } }
protected override void Start() { numEnemiesDead = 0; numEnemies = enemyPrefabs.Length; foreach (GameObject enemy in enemyPrefabs) { EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>(); enemyStats.invincible = true; enemyStats.onDeath.AddListener(EnemyDied); } }
private void Awake() { _stats = GetComponent <EnemyStatsController>(); _brain = GetComponent <EnemyBrainController>(); _agent = GetComponent <NavMeshAgent>(); // Set avoidance priority to random number (0-99) to prevent enemy clustering if (_agent) { _agent.avoidancePriority = Random.Range(0, 100); } }
protected override void OnTriggerEnter(Collider other) { GameObject col = other.gameObject; // if other object is an enemy, deal damage if (col.CompareTag("Enemy")) { EnemyStatsController enemy = col.GetComponent <EnemyStatsController>(); enemy.TakeDamage(LauncherStats, _damage); // TODO may need to calculate damage differently? } gameObject.SetActive(false); }
protected virtual void Start() { rigid = GetComponent <Rigidbody2D>(); enemyAnim = GetComponent <Animator>(); animationTrigger = GetComponent <EnemyAnimationTrigger>(); statsController = GetComponent <EnemyStatsController>(); attackController = GetComponent <EnemyAttackController>(); facingDirection = 1; statsController.OnAttackedEvent.AddListener(HandleOnAttackedEvent); statsController.OnDeathEvent.AddListener(HandleOnDeathEvent); attackController.OnAttackedDirectionEvent.AddListener(HandleOnAttackedDirectionEvent); }
public Attack PlayerCreateAttack(PlayerStatsController attackerStats, EnemyStatsController defenderStats, Vector2 hitBackForce) { float coreDamage = attackerStats.GetAttackStat(); coreDamage += Random.Range(plusDamage.x, plusDamage.y); bool isCritical = Random.value < criticalChange; if (isCritical) { coreDamage += criticalMultiplier; } return(new Attack((int)coreDamage, isCritical, hitBackForce)); }
public override void TriggerAttack() { base.TriggerAttack(); Collider2D[] hittedEnemies = Physics2D.OverlapCircleAll(playerData.attack1Position.position, playerController.meleeAttack1.radiusRange, playerData.whatIsEnemy); foreach (Collider2D enemy in hittedEnemies) { EnemyStatsController enemyStatsController = enemy.gameObject.GetComponent <EnemyStatsController>(); EnemyAttackController enemyAttackHandler = enemy.gameObject.GetComponent <EnemyAttackController>(); if (enemyAttackHandler != null && enemyStatsController != null) { Attack attack = playerController.meleeAttack1.PlayerCreateAttack(playerController.statsController, enemyStatsController, playerController.meleeAttack1.hitBackForce); enemyAttackHandler.OnAttacked(playerController.gameObject, attack); } } }
public IEnumerator PlayerCombat_MeleePlayerCanDamageEnemyWithPrimaryAndSecondaryAttacks() { GameObject meleePlayer = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), Vector3.zero, Quaternion.identity); PlayerStatsController meleePlayerStats = meleePlayer.GetComponent <PlayerStatsController>(); GameObject enemy = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity); EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>(); Vector3 attackPos = new Vector3(0, 0, -2.5f); meleePlayer.SetActive(true); enemy.SetActive(true); var input = meleePlayer.GetComponent <PlayerInput>(); input.enabled = true; _inputMock.SetInputToMockGamepad(input); meleePlayer.transform.position = attackPos; float initialHealth = enemyStats.health.CurrentValue; enemyStats.characterColour = meleePlayerStats.characterColour; yield return(new WaitForSeconds(0.5f)); // Player attacks with primary attack _inputMock.Press(_inputMock.Gamepad.rightShoulder); yield return(new WaitForSeconds(1f)); _inputMock.Release(_inputMock.Gamepad.rightShoulder); yield return(new WaitForSeconds(1f)); Assert.Less(enemyStats.health.CurrentValue, initialHealth, "Melee player was unable to damage the enemy with primary attack!"); initialHealth = enemyStats.health.CurrentValue; // Player attacks with secondary attack _inputMock.Press(_inputMock.Gamepad.rightTrigger); yield return(new WaitForSeconds(1f)); _inputMock.Release(_inputMock.Gamepad.rightTrigger); yield return(new WaitForSeconds(1f)); Assert.Less(enemyStats.health.CurrentValue, initialHealth, "Melee player was unable to damage the enemy with secondary attack!"); }
/// <summary> /// Set up the puzzle /// </summary> protected override void Setup() { numEnemiesDead = 0; numEnemies = enemies.Length; for (int i = 0; i < numEnemies; i++) { // add any modifieres to the enemy EnemyStatsController enemyStats = enemies[i].GetComponent <EnemyStatsController>(); enemyStats.damage.AddModifier(damageModifier); enemyStats.damage.AddModifier(defenseModifier); enemyStats.characterColour = CharacterColour.None; enemyStats.onDeath.AddListener(EnemyDied); } if (isBoss) { GameManager.Instance.SetBossState(); } }
private void Awake() { if (barType == BarType.Player) { PlayerStatsController stats = transform.parent.GetComponent <PlayerStatsController>(); _healthStat = stats.health; _manaStat = stats.mana; } else if (barType == BarType.Enemy) { EnemyStatsController stats = transform.parent.GetComponent <EnemyStatsController>(); _healthStat = stats.health; // apply enemy name as label string label = gameObject.GetComponentInParent <EntityStatsController>().gameObject.name; Text labelText = gameObject.GetComponentInChildren <Text>(); labelText.text = label; } }
protected override void Start() { CombinationLeverPuzzle combinationPuzzle = GetComponent <CombinationLeverPuzzle>(); EnemyPuzzle enemyPuzzle = GetComponent <EnemyPuzzle>(); // Set colours of all enemies in the task based on combination CharacterColour[] combination = combinationPuzzle.SetColourCombination(); for (int i = 0; i < combination.Length; i++) { EnemyStatsController enemy = enemyPuzzle.enemyPrefabs[i].GetComponent <EnemyStatsController>(); enemy.AssignEnemyColour(combination[i]); } // Hide all platforms RockPuzzle rockPuzzle = GetComponent <RockPuzzle>(); foreach (Platform platform in rockPuzzle.platforms) { platform.Hide(); } }
private void Awake() { switch (barType) { case BarType.Player: { PlayerStatsController stats = transform.parent.GetComponent <PlayerStatsController>(); _healthStat = stats.health; _manaStat = stats.mana; break; } case BarType.Enemy: case BarType.Boss: { EnemyStatsController stats = transform.parent.GetComponent <EnemyStatsController>(); _healthStat = stats.health; // Handle boss specific setup if (barType == BarType.Boss) { // Use the boss' gameObject name for the label string label = stats.gameObject.name; Text labelText = gameObject.GetComponentInChildren <Text>(); labelText.text = label; } break; } } _canvas = GetComponent <Canvas>(); // Start the bars hidden if not set to always show them if (!alwaysShow) { Hide(); } }
protected override void OnTriggerEnter(Collider other) { GameObject col = other.gameObject; if (col.CompareTag("Enemy")) { EnemyStatsController enemy = col.GetComponent <EnemyStatsController>(); enemy.TakeDamage(LauncherStats, LauncherStats.ComputeDamageModifer()); // TODO may need to calculate damage differently? } else if (col.CompareTag("Player")) { PlayerStatsController player = col.GetComponent <PlayerStatsController>(); int healAmount = Random.Range(5, 10); ShowHealing(healAmount, player.transform); player.health.Add(healAmount); // TODO may need to calculate health differently? } else { gameObject.SetActive(false); } }
public override void TriggerAttack() { base.TriggerAttack(); Collider2D[] hittedEnemies = Physics2D.OverlapBoxAll(playerData.attack2Position.position, new Vector2(playerController.meleeAttack2.rangeX, playerController.meleeAttack2.rangeX), 0, playerData.whatIsEnemy); foreach (Collider2D enemy in hittedEnemies) { EnemyStatsController enemyStatsController = enemy.gameObject.GetComponent <EnemyStatsController>(); EnemyAttackController enemyAttackController = enemy.gameObject.GetComponent <EnemyAttackController>(); if (enemyAttackController != null && enemyStatsController != null) { Attack attack = playerController.meleeAttack2.PlayerCreateAttack(playerController.statsController, enemyStatsController, playerController.meleeAttack2.hitBackForce); enemyAttackController.OnAttacked(playerController.gameObject, attack); } //Attack attack = playerController.meleeAttack2.CreateAttack(playerController.statsController, // enemy.gameObject.GetComponent<CharacterStatsController>(), playerController.meleeAttack2.hitBackForce); //enemy.gameObject.GetComponent<AttackHandler>().OnAttacked(playerController.gameObject, attack); } }
public IEnumerator FunctionalRequirements_EnemyShouldTakeDamageFromPlayer() { GameObject magePlayer = Object.Instantiate(TestResourceManager.Instance.GetResource("Mage Player"), Vector3.zero, Quaternion.identity); PlayerStatsController magePlayerStats = magePlayer.GetComponent <PlayerStatsController>(); GameObject enemy = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity); EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>(); magePlayer.transform.position = new Vector3(0, 0, -2); enemy.transform.Rotate(new Vector3(0, 1, 0), 180); yield return(new WaitForEndOfFrame()); yield return(new WaitForEndOfFrame()); float initialHp = enemyStats.health.CurrentValue; enemyStats.TakeDamage(magePlayerStats, 10f); yield return(new WaitForSeconds(timeToWait)); Assert.Less(enemyStats.health.CurrentValue, initialHp, "Enemy did not lose health"); yield return(null); }
protected override void OnTriggerEnter(Collider other) { GameObject col = other.gameObject; if (col.CompareTag("Enemy")) { EnemyStatsController enemy = col.GetComponent <EnemyStatsController>(); enemy.TakeDamage(LauncherStats, _damageAmount); } else if (col.CompareTag("Player")) { PlayerStatsController player = col.GetComponent <PlayerStatsController>(); ShowHealingText(_healAmount, player.transform); player.health.Add(_healAmount); } else { if (!other.isTrigger) { gameObject.SetActive(false); } } }
public IEnumerator CombatScenario_TwoPlayersFightingTwoEnemiesIndividually() { // Set up entities GameObject meleePlayer1 = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(-2f, 0, 0), Quaternion.identity); PlayerStatsController meleePlayerStats1 = meleePlayer1.GetComponent <PlayerStatsController>(); meleePlayerStats1.characterColour = CharacterColour.Green; GameObject meleePlayer2 = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(2f, 0, 0), Quaternion.identity); PlayerStatsController meleePlayerStats2 = meleePlayer2.GetComponent <PlayerStatsController>(); meleePlayerStats2.characterColour = CharacterColour.Red; GameObject enemy1 = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), new Vector3(-6f, 0, 6f), Quaternion.identity); EnemyStatsController enemyStats1 = enemy1.GetComponent <EnemyStatsController>(); enemyStats1.characterColour = CharacterColour.Green; enemyStats1.health.maxValue = 10f; GameObject enemy2 = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), new Vector3(6f, 0, 6f), Quaternion.identity); EnemyStatsController enemyStats2 = enemy2.GetComponent <EnemyStatsController>(); enemyStats2.characterColour = CharacterColour.Red; enemyStats2.health.maxValue = 10f; meleePlayer1.SetActive(true); meleePlayer2.SetActive(true); enemy1.SetActive(true); enemy2.SetActive(true); // Setup inputs PlayerInput input1 = meleePlayer1.GetComponent <PlayerInput>(); input1.enabled = true; _inputMocks[0].SetInputToMockGamepad(input1); PlayerInput input2 = meleePlayer2.GetComponent <PlayerInput>(); input1.enabled = true; _inputMocks[1].SetInputToMockGamepad(input2); // Wait for enemies to approach the players yield return(new WaitForSeconds(1.5f)); // Players each face their enemy _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy1.transform.position.x, enemy1.transform.position.z) - new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized); yield return(new WaitForSeconds(0.1f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy2.transform.position.x, enemy2.transform.position.z) - new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized); // Players attack with both their attacks float timer = 0f; bool usePrimaryAttack = true; while (!enemyStats1.isDead || !enemyStats2.isDead) { if (usePrimaryAttack) { _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy1.transform.position.x, enemy1.transform.position.z) - new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized); yield return(new WaitForSeconds(0.1f)); _inputMocks[0].Press(_inputMocks[0].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.1f)); _inputMocks[0].Release(_inputMocks[0].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.3f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy2.transform.position.x, enemy2.transform.position.z) - new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized); yield return(new WaitForSeconds(0.1f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.1f)); _inputMocks[1].Release(_inputMocks[1].Gamepad.rightShoulder); yield return(new WaitForSeconds(1f)); } else { _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy1.transform.position.x, enemy1.transform.position.z) - new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized); yield return(new WaitForSeconds(0.1f)); _inputMocks[0].Press(_inputMocks[0].Gamepad.rightTrigger); yield return(new WaitForSeconds(0.2f)); _inputMocks[0].Release(_inputMocks[0].Gamepad.rightTrigger); yield return(new WaitForSeconds(0.3f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy2.transform.position.x, enemy2.transform.position.z) - new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized); yield return(new WaitForSeconds(0.1f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightTrigger); yield return(new WaitForSeconds(0.2f)); _inputMocks[1].Release(_inputMocks[1].Gamepad.rightTrigger); yield return(new WaitForSeconds(2f)); } // Alternate attack style usePrimaryAttack = !usePrimaryAttack; // Ensure that the test does not run longer than 15 seconds if (timer > 15f) { break; } timer += usePrimaryAttack ? 1.7f : 2.9f; } Assert.True(enemyStats1.isDead, "Melee player 1 failed to kill the enemy"); Assert.True(enemyStats2.isDead, "Melee player 2 failed to kill the enemy"); Assert.False(meleePlayerStats1.isDead, "Melee Player 1 should not have died in this scenario"); Assert.False(meleePlayerStats2.isDead, "Melee Player 2 should not have died in this scenario"); }
protected override void Start() { base.Start(); statsController = GetComponent <EnemyStatsController>(); }
private void Awake() { _stats = GetComponent <EnemyStatsController>(); _combat = GetComponent <EnemyCombatController>(); }
public IEnumerator CombatScenario_TwoPlayersFightingOneEnemy() { // Set up entities GameObject meleePlayer1 = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(-2.5f, 0, 0), Quaternion.identity); PlayerStatsController meleePlayerStats1 = meleePlayer1.GetComponent <PlayerStatsController>(); GameObject meleePlayer2 = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(2.5f, 0, 0), Quaternion.identity); PlayerStatsController meleePlayerStats2 = meleePlayer2.GetComponent <PlayerStatsController>(); GameObject enemy = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), Vector3.zero, Quaternion.identity); EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>(); meleePlayer1.SetActive(true); meleePlayer2.SetActive(true); enemy.SetActive(true); // Setup inputs PlayerInput input1 = meleePlayer1.GetComponent <PlayerInput>(); input1.enabled = true; _inputMocks[0].SetInputToMockGamepad(input1); PlayerInput input2 = meleePlayer2.GetComponent <PlayerInput>(); input1.enabled = true; _inputMocks[1].SetInputToMockGamepad(input2); // Setup enemy float initialHealth = enemyStats.health.CurrentValue; enemyStats.characterColour = CharacterColour.All; yield return(new WaitForSeconds(0.5f)); // Players face the enemy _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, Vector2.right); yield return(new WaitForSeconds(0.2f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, Vector2.left); // Players attack with their primary attacks float timer = 0f; while (!enemyStats.isDead) { _inputMocks[0].Press(_inputMocks[0].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.1f)); _inputMocks[0].Release(_inputMocks[0].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.3f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.1f)); _inputMocks[1].Release(_inputMocks[1].Gamepad.rightShoulder); yield return(new WaitForSeconds(1f)); // Ensure that the test does not run longer than 15 seconds if (timer > 15f) { break; } timer += 1.5f; } Assert.True(enemyStats.isDead || enemyStats.health.CurrentValue < initialHealth, "Melee players failed to do any damage to the enemy"); Assert.False(meleePlayerStats1.isDead, "Melee Player 1 should not have died in this scenario"); Assert.False(meleePlayerStats2.isDead, "Melee Player 2 should not have died in this scenario"); }
public IEnumerator CombatScenario_TwoPlayersDieToVeryStrongEnemy() { // Set up entities GameObject meleePlayer1 = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(-2f, 0, 0), Quaternion.identity); PlayerStatsController meleePlayerStats1 = meleePlayer1.GetComponent <PlayerStatsController>(); meleePlayerStats1.health.maxValue = 30f; meleePlayerStats1.characterColour = CharacterColour.Green; GameObject meleePlayer2 = Object.Instantiate(TestResourceManager.Instance.GetResource("Melee Player"), new Vector3(2f, 0, 0), Quaternion.identity); PlayerStatsController meleePlayerStats2 = meleePlayer2.GetComponent <PlayerStatsController>(); meleePlayerStats2.health.maxValue = 30f; meleePlayerStats2.characterColour = CharacterColour.Red; GameObject enemy = Object.Instantiate(TestResourceManager.Instance.GetResource("Enemy"), new Vector3(0, 0, 6f), Quaternion.identity); EnemyStatsController enemyStats = enemy.GetComponent <EnemyStatsController>(); enemyStats.characterColour = CharacterColour.Green; enemyStats.health.maxValue = 100f; enemyStats.damage.BaseValue = 20; meleePlayer1.SetActive(true); meleePlayer2.SetActive(true); enemy.SetActive(true); // Setup inputs PlayerInput input1 = meleePlayer1.GetComponent <PlayerInput>(); input1.enabled = true; _inputMocks[0].SetInputToMockGamepad(input1); PlayerInput input2 = meleePlayer2.GetComponent <PlayerInput>(); input1.enabled = true; _inputMocks[1].SetInputToMockGamepad(input2); // Wait for enemy to approach the players yield return(new WaitForSeconds(0.5f)); // Players each face the enemy _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy.transform.position.x, enemy.transform.position.z) - new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized); yield return(new WaitForSeconds(0.1f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy.transform.position.x, enemy.transform.position.z) - new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized); // Players attack with their primary attack float timer = 0f; while (!meleePlayerStats1.isDead || !meleePlayerStats2.isDead) { if (enemyStats.isDead) { break; } _inputMocks[0].Press(_inputMocks[0].Gamepad.rightStick, (new Vector2(enemy.transform.position.x, enemy.transform.position.z) - new Vector2(meleePlayer1.transform.position.x, meleePlayer1.transform.position.z)).normalized); yield return(new WaitForSeconds(0.1f)); _inputMocks[0].Press(_inputMocks[0].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.1f)); _inputMocks[0].Release(_inputMocks[0].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.3f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightStick, (new Vector2(enemy.transform.position.x, enemy.transform.position.z) - new Vector2(meleePlayer2.transform.position.x, meleePlayer2.transform.position.z)).normalized); yield return(new WaitForSeconds(0.1f)); _inputMocks[1].Press(_inputMocks[1].Gamepad.rightShoulder); yield return(new WaitForSeconds(0.1f)); _inputMocks[1].Release(_inputMocks[1].Gamepad.rightShoulder); yield return(new WaitForSeconds(1f)); // Ensure that the test does not run longer than 15 seconds if (timer > 15f) { break; } timer += 1.7f; } Assert.False(enemyStats.isDead, "Enemy should have not died to the players in this scenario"); Assert.True(meleePlayerStats1.isDead, "Melee Player 1 should have died in this scenario"); Assert.True(meleePlayerStats2.isDead, "Melee Player 2 should have died in this scenario"); }