Просто примечание, но вы можете / должны использовать один единственный метод, поскольку в основном обе ваши подпрограммы выполняют абсолютно одинаковые действия только с разными ссылками. Вы можете использовать ключевое слово ref
.
И затем вы можете добавить простой int
счетчик, например
public Transform playerSpawn;
public Unit[] playerPrefabs;
public <YourType> playerHUD;
[Space]
public Transform enemySpawn;
public Unit[] enemyPrefabs;
public <YourType> enemyHUD;
private int deathCountPlayer;
private int deathCountEnemy;
private Unit playerUnit;
private Unit enemyUnit;
private IEnumerator UnitDead(ref Unit targetUnit, ref int deathCount, Unit[] prefabs, Transform targetParent, <YourType> targetHUD)
{
// if you instantiate new units you should actually destroy the old
// ones not only disable their children!
Destroy(targetUnit.gameObject);
if(++deathCount >= 3)
{
// GAME OVER
if(deathCountPlayer > deathCountEnemy)
{
// enemy wins
}
else
{
// player wins
}
yield break;
}
yield return new WaitForSeconds(0.5f);
var randomInt = Random.Range(0, prefabs.Length);
// since we passed in targetUnit using the ref keyword
// this will replace either the playerUnit or enemyUnit reference
// we passed in
targetUnit = Instantiate(prefabs[randomInt], targetParent);
targetHUD.SetHUD(targetUnit);
if (playerUnit.speed > enemyUnit.speed)
{
state = BattleState.PLAYERTURN;
PlayerTurn();
}
else if (enemyUnit.speed > playerUnit.speed)
{
passButtonDamage.interactable = false;
attackButton.interactable = false;
healButton.interactable = false;
passButtonResistance.interactable = false;
yield return new WaitForSeconds(0.5f);
state = BattleState.ENEMYTURN;
StartCoroutine(EnemyTurn());
}
}
Так что теперь вы можете запустить сопрограмму либо используя
StartCoroutine(ref playerUnit, ref deathCountPlayer, playerPrefabs, playerSpawn, playerHUD);
или
StartCoroutine(ref enemyUnit, ref deathCountEnemy, enemyPrefabs, enemySpawn, enemyHUD);